From 3a5603966467a878e5b305517598589590cb8b10 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 21 Sep 2010 15:20:10 +0100
Subject: Skeleton code for symbian native socket engine

Taken the unix native socket engine, and converted each call from the posix
version to the symbian version.
There are many TODOs as this is quite incomplete.

Reviewed-By: Markus Goetz
---
 src/network/socket/qnativesocketengine_p.h         |   9 +
 src/network/socket/qnativesocketengine_symbian.cpp | 756 +++++++++++++++++++++
 src/network/socket/socket.pri                      |   4 +-
 3 files changed, 768 insertions(+), 1 deletion(-)
 create mode 100644 src/network/socket/qnativesocketengine_symbian.cpp

diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index 9baacf0..72ebd9f 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -63,6 +63,7 @@
 #ifdef Q_OS_SYMBIAN
 #include <private/qeventdispatcher_symbian_p.h>
 #include <unistd.h>
+#include <es_sock.h>
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -196,6 +197,11 @@ public:
     ~QNativeSocketEnginePrivate();
 
     int socketDescriptor;
+#ifdef Q_OS_SYMBIAN
+    mutable RSocket nativeSocket;
+    RSocketServ socketServer; //TODO: shared ref
+    RConnection connection; //TODO: shared ref
+#endif
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
 
@@ -233,6 +239,9 @@ public:
         UnknownSocketErrorString = -1
     };
 
+#ifdef Q_OS_SYMBIAN
+    void setError(TInt symbianError);
+#endif
     void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
     // native functions
diff --git a/src/network/socket/qnativesocketengine_symbian.cpp b/src/network/socket/qnativesocketengine_symbian.cpp
new file mode 100644
index 0000000..f2aeee9
--- /dev/null
+++ b/src/network/socket/qnativesocketengine_symbian.cpp
@@ -0,0 +1,756 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//#define QNATIVESOCKETENGINE_DEBUG
+#include "qnativesocketengine_p.h"
+#include "private/qnet_unix_p.h"
+#include "qiodevice.h"
+#include "qhostaddress.h"
+#include "qelapsedtimer.h"
+#include "qvarlengtharray.h"
+#include <es_sock.h>
+#include <in_sock.h>
+#ifndef QT_NO_IPV6IFNAME
+#include <net/if.h>
+#endif
+
+#define QNATIVESOCKETENGINE_DEBUG
+
+#if defined QNATIVESOCKETENGINE_DEBUG
+#include <qstring.h>
+#include <ctype.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined QNATIVESOCKETENGINE_DEBUG
+
+/*
+    Returns a human readable representation of the first \a len
+    characters in \a data.
+*/
+static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
+{
+    if (!data) return "(null)";
+    QByteArray out;
+    for (int i = 0; i < len; ++i) {
+        char c = data[i];
+        if (isprint(c)) {
+            out += c;
+        } else switch (c) {
+        case '\n': out += "\\n"; break;
+        case '\r': out += "\\r"; break;
+        case '\t': out += "\\t"; break;
+        default:
+            QString tmp;
+            tmp.sprintf("\\%o", c);
+            out += tmp.toLatin1();
+        }
+    }
+
+    if (len < maxSize)
+        out += "...";
+
+    return out;
+}
+#endif
+
+static void qt_ignore_sigpipe()
+{
+#ifndef Q_NO_POSIX_SIGNALS
+    // Set to ignore SIGPIPE once only.
+    static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0);
+    if (atom.testAndSetRelaxed(0, 1)) {
+        struct sigaction noaction;
+        memset(&noaction, 0, sizeof(noaction));
+        noaction.sa_handler = SIG_IGN;
+        ::sigaction(SIGPIPE, &noaction, 0);
+    }
+#else
+    // Posix signals are not supported by the underlying platform
+    // so we don't need to ignore sigpipe signal explicitly
+#endif
+}
+
+/*
+    Extracts the port and address from a sockaddr, and stores them in
+    \a port and \a addr if they are non-null.
+*/
+static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *port, QHostAddress *addr)
+{
+#if !defined(QT_NO_IPV6)
+    if (s->a.sa_family == AF_INET6) {
+        Q_IPV6ADDR tmp;
+        memcpy(&tmp, &s->a6.sin6_addr, sizeof(tmp));
+        if (addr) {
+            QHostAddress tmpAddress;
+            tmpAddress.setAddress(tmp);
+            *addr = tmpAddress;
+#ifndef QT_NO_IPV6IFNAME
+            char scopeid[IFNAMSIZ];
+            if (::if_indextoname(s->a6.sin6_scope_id, scopeid)) {
+                addr->setScopeId(QLatin1String(scopeid));
+            } else
+#endif
+            addr->setScopeId(QString::number(s->a6.sin6_scope_id));
+        }
+        if (port)
+            *port = ntohs(s->a6.sin6_port);
+        return;
+    }
+#endif
+    if (port)
+        *port = ntohs(s->a4.sin_port);
+    if (addr) {
+        QHostAddress tmpAddress;
+        tmpAddress.setAddress(ntohl(s->a4.sin_addr.s_addr));
+        *addr = tmpAddress;
+    }
+}
+
+static inline void qt_socket_getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
+{
+#if !defined(QT_NO_IPV6)
+    if (a.Family() == KAfInet6) {
+        Q_IPV6ADDR tmp;
+        memcpy(&tmp, a.Ip6Address().u.iAddr8, sizeof(tmp));
+        if (addr) {
+            QHostAddress tmpAddress;
+            tmpAddress.setAddress(tmp);
+            *addr = tmpAddress;
+#ifndef QT_NO_IPV6IFNAME
+            char scopeid[IFNAMSIZ];
+            //TODO: rather than using posix api, the symbian way is
+            //to use GetOpt with TSoInetIfQuery and KSoInetIfQueryByIndex
+            //which means this should be in a member function to have access to the nativeSocket
+            if (::if_indextoname(a.Scope(), scopeid)) {
+                addr->setScopeId(QLatin1String(scopeid));
+            } else
+#endif
+            addr->setScopeId(QString::number(a.Scope()));
+        }
+        if (port)
+            *port = a.Port();
+        return;
+    }
+#endif
+    if (port)
+        *port = a.Port();
+    if (addr) {
+        QHostAddress tmpAddress;
+        tmpAddress.setAddress(a.Address()); //TODO: byte order ok?
+        *addr = tmpAddress;
+    }
+}
+/*! \internal
+
+    Creates and returns a new socket descriptor of type \a socketType
+    and \a socketProtocol.  Returns -1 on failure.
+*/
+bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
+                                         QAbstractSocket::NetworkLayerProtocol socketProtocol)
+{
+#ifndef QT_NO_IPV6
+    TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
+#else
+    Q_UNUSED(socketProtocol);
+    TUint family = KAfInet;
+#endif
+    TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
+    TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
+    TInt err = nativeSocket.Open(socketServer, family, type, protocol, connection);
+
+    if (err != KErrNone) {
+        switch (err) {
+        case KErrNotSupported:
+        case KErrNotFound:
+            setError(QAbstractSocket::UnsupportedSocketOperationError,
+                ProtocolUnsupportedErrorString);
+            break;
+        case KErrNoMemory:
+            setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            break;
+        default:
+            break;
+        }
+
+        return false;
+    }
+
+    socketDescriptor = nativeSocket.SubSessionHandle(); //TODO
+    return true;
+}
+
+/*
+    Returns the value of the socket option \a opt.
+*/
+int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) const
+{
+    Q_Q(const QNativeSocketEngine);
+    if (!q->isValid())
+        return -1;
+
+    TUint n;
+    TUint level = KSOLSocket; // default
+
+    switch (opt) {
+    case QNativeSocketEngine::ReceiveBufferSocketOption:
+        n = KSORecvBuf;
+        break;
+    case QNativeSocketEngine::SendBufferSocketOption:
+        n = KSOSendBuf;
+        break;
+    case QNativeSocketEngine::NonBlockingSocketOption:
+        n = KSONonBlockingIO;
+        break;
+    case QNativeSocketEngine::BroadcastSocketOption:
+        n = SO_BROADCAST; //TODO
+        break;
+    case QNativeSocketEngine::AddressReusable:
+        n = SO_REUSEADDR; //TODO
+        break;
+    case QNativeSocketEngine::BindExclusively:
+        return true;
+    case QNativeSocketEngine::ReceiveOutOfBandData:
+        n = SO_OOBINLINE; //TODO
+        break;
+    case QNativeSocketEngine::LowDelayOption:
+        level = KSolInetTcp;
+        n = KSoTcpNoDelay;
+        break;
+    case QNativeSocketEngine::KeepAliveOption:
+        level = KSolInetTcp;
+        n = KSoTcpKeepAlive;
+        break;
+    default:
+        return -1;
+    }
+
+    int v = -1;
+    //GetOpt() is non const
+    TInt err = nativeSocket.GetOpt(n, level, v);
+    if (!err)
+        return v;
+
+    return -1;
+}
+
+
+/*
+    Sets the socket option \a opt to \a v.
+*/
+bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v)
+{
+    Q_Q(QNativeSocketEngine);
+    if (!q->isValid())
+        return false;
+
+    int n = 0;
+    int level = SOL_SOCKET; // default
+
+    switch (opt) {
+    case QNativeSocketEngine::ReceiveBufferSocketOption:
+        n = KSORecvBuf;
+        break;
+    case QNativeSocketEngine::SendBufferSocketOption:
+        n = KSOSendBuf;
+        break;
+    case QNativeSocketEngine::BroadcastSocketOption:
+        n = SO_BROADCAST; //TODO
+        break;
+    case QNativeSocketEngine::NonBlockingSocketOption:
+        n = KSONonBlockingIO;
+        break;
+    case QNativeSocketEngine::AddressReusable:
+        n = SO_REUSEADDR; //TODO
+        break;
+    case QNativeSocketEngine::BindExclusively:
+        return true;
+    case QNativeSocketEngine::ReceiveOutOfBandData:
+        n = SO_OOBINLINE; //TODO
+        break;
+    case QNativeSocketEngine::LowDelayOption:
+        level = KSolInetTcp;
+        n = KSoTcpNoDelay;
+        break;
+    case QNativeSocketEngine::KeepAliveOption:
+        level = KSolInetTcp;
+        n = KSoTcpKeepAlive;
+        break;
+    }
+
+    return (KErrNone == nativeSocket.SetOpt(n, level, v));
+}
+
+static TInetAddr qt_QHostAddressToTInetAddr(const QHostAddress &addr)
+{
+    TInetAddr nativeAddr;
+#if !defined(QT_NO_IPV6)
+    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+#ifndef QT_NO_IPV6IFNAME
+        nativeAddr.SetScope(::if_nametoindex(addr.scopeId().toLatin1().data())); //TODO - if_nametoindex
+#else
+        nativeAddr.SetScope(addr.scopeId().toInt());
+#endif
+        Q_IPV6ADDR ip6 = addr.toIPv6Address();
+        TIp6Addr v6addr;
+        memcpy(v6addr.u.iAddr8, ip6.c, 16);
+        nativeAddr.SetAddress(v6addr);
+    } else
+#endif
+    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
+        nativeAddr.SetAddress(addr.toIPv4Address());
+    } else {
+        qWarning("unsupported network protocol (%d)", addr.protocol());
+    }
+    return nativeAddr;
+}
+
+bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16 port)
+{
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug("QNativeSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
+#endif
+
+    TInetAddr nativeAddr = qt_QHostAddressToTInetAddr(addr);
+    nativeAddr.SetPort(port);
+    //TODO: async connect with active object - from here to end of function is a mess
+    TRequestStatus status;
+    nativeSocket.Connect(nativeAddr, status);
+    User::WaitForRequest(status);
+    TInt err = status.Int();
+    if (err) {
+        switch (err) {
+        case KErrCouldNotConnect:
+            setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrTimedOut:
+            setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
+            break;
+        case KErrHostUnreach:
+            setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrNetUnreach:
+            setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrInUse:
+            setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrNotSupported:
+        case KErrBadDescriptor:
+            socketState = QAbstractSocket::UnconnectedState;
+        default:
+            break;
+        }
+
+        if (socketState != QAbstractSocket::ConnectedState) {
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+            qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
+                   addr.toString().toLatin1().constData(), port,
+                   socketState == QAbstractSocket::ConnectingState
+                   ? "Connection in progress" : socketErrorString.toLatin1().constData());
+#endif
+            return false;
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
+           addr.toString().toLatin1().constData(), port);
+#endif
+
+    socketState = QAbstractSocket::ConnectedState;
+    return true;
+}
+
+bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
+{
+    TInetAddr nativeAddr = qt_QHostAddressToTInetAddr(address);
+    nativeAddr.SetPort(port);
+
+    TInt err = nativeSocket.Bind(nativeAddr);
+
+    if (err) {
+        switch(errno) {
+        case KErrInUse:
+            setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+            break;
+        case KErrNotSupported:
+            setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
+            break;
+        default:
+            break;
+        }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
+               address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
+#endif
+
+        return false;
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
+           address.toString().toLatin1().constData(), port);
+#endif
+    socketState = QAbstractSocket::BoundState;
+    return true;
+}
+
+bool QNativeSocketEnginePrivate::nativeListen(int backlog)
+{
+    TInt err = nativeSocket.Listen(backlog);
+    if (err) {
+        switch (errno) {
+        case KErrInUse:
+            setError(QAbstractSocket::AddressInUseError,
+                     PortInuseErrorString);
+            break;
+        default:
+            break;
+        }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
+               backlog, socketErrorString.toLatin1().constData());
+#endif
+        return false;
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
+#endif
+
+    socketState = QAbstractSocket::ListeningState;
+    return true;
+}
+
+int QNativeSocketEnginePrivate::nativeAccept()
+{
+    RSocket blankSocket;
+    //TODO: this is unbelievably broken, needs to be properly async
+    blankSocket.Open(socketServer);
+    TRequestStatus status;
+    nativeSocket.Accept(blankSocket, status);
+    User::WaitForRequest(status);
+    if(status.Int()) {
+        qWarning("QNativeSocketEnginePrivate::nativeAccept() - error %d", status.Int());
+        return 0;
+    }
+
+    return blankSocket.SubSessionHandle();
+}
+
+qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
+{
+    int nbytes = 0;
+    qint64 available = 0;
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
+    if(err)
+        return 0;
+    available = (qint64) nbytes;
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
+#endif
+    return available;
+}
+
+bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
+{
+    int nbytes;
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    return err == KErrNone && nbytes > 0;
+    //TODO: this is pretty horrible too...
+}
+
+qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
+{
+    int nbytes;
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
+}
+
+qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
+                                                    QHostAddress *address, quint16 *port)
+{
+    TPtr8 buffer((TUint8*)data, (int)maxSize);
+    TInetAddr addr;
+    TRequestStatus status; //TODO: OMG sync receive!
+    nativeSocket.RecvFrom(buffer, addr, 0, status);
+    User::WaitForRequest(status);
+
+    if (status.Int()) {
+        setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
+    } else if (port || address) {
+        qt_socket_getPortAndAddress(addr, port, address);
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    int len = buffer.Length();
+    qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
+           data, qt_prettyDebug(data, qMin(len, ssize_t(16)), len).data(), maxSize,
+           address ? address->toString().toLatin1().constData() : "(nil)",
+           port ? *port : 0, (qint64) len);
+#endif
+
+    if (status.Int())
+        return -1;
+    return qint64(buffer.Length());
+}
+
+qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len,
+                                                   const QHostAddress &host, quint16 port)
+{
+    TPtrC8 buffer((TUint8*)data, (int)len);
+    TInetAddr addr = qt_QHostAddressToTInetAddr(host);
+    TSockXfrLength sentBytes;
+    addr.SetPort(port);
+    TRequestStatus status; //TODO: OMG sync send!
+    nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
+    User::WaitForRequest(status);
+    TInt err = status.Int(); 
+
+    if (err) {
+        switch (err) {
+        case KErrTooBig:
+            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            break;
+        default:
+            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
+           qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
+           port, (qint64) sentBytes());
+#endif
+
+    return qint64(sentBytes());
+}
+
+bool QNativeSocketEnginePrivate::fetchConnectionParameters()
+{
+    localPort = 0;
+    localAddress.clear();
+    peerPort = 0;
+    peerAddress.clear();
+
+    if (socketDescriptor == -1)
+        return false;
+
+    //TODO: work out how to initialise nativeSocket from socketDescriptor
+
+    // Determine local address
+    TSockAddr addr;
+    nativeSocket.LocalName(addr);
+    qt_socket_getPortAndAddress(addr, &localPort, &localAddress);
+
+    // Determine protocol family
+    switch (addr.Family()) {
+    case KAfInet:
+        socketProtocol = QAbstractSocket::IPv4Protocol;
+        break;
+#if !defined (QT_NO_IPV6)
+    case KAfInet6:
+        socketProtocol = QAbstractSocket::IPv6Protocol;
+        break;
+#endif
+    default:
+        socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
+        break;
+    }
+
+    // Determine the remote address
+    nativeSocket.RemoteName(addr);
+    qt_socket_getPortAndAddress(addr, &peerPort, &peerAddress);
+
+    // Determine the socket type (UDP/TCP)
+    TProtocolDesc protocol;
+    TInt err = nativeSocket.Info(protocol);
+    if (err) {
+        QAbstractSocket::UnknownSocketType;
+    } else {
+        switch (protocol.iProtocol) {
+        case KProtocolInetTcp:
+            socketType = QAbstractSocket::TcpSocket;
+            break;
+        case KProtocolInetUdp:
+            socketType = QAbstractSocket::UdpSocket;
+            break;
+        default:
+            socketType = QAbstractSocket::UnknownSocketType;
+            break;
+        }
+    }
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    QString socketProtocolStr = "UnknownProtocol";
+    if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = "IPv4Protocol";
+    else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = "IPv6Protocol";
+
+    QString socketTypeStr = "UnknownSocketType";
+    if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket";
+    else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket";
+
+    qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
+           " peer == %s:%i, socket == %s - %s",
+           localAddress.toString().toLatin1().constData(), localPort,
+           peerAddress.toString().toLatin1().constData(), peerPort,socketTypeStr.toLatin1().constData(),
+           socketProtocolStr.toLatin1().constData());
+#endif
+    return true;
+}
+
+void QNativeSocketEnginePrivate::nativeClose()
+{
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEngine::nativeClose()");
+#endif
+
+    //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
+    nativeSocket.Close();
+}
+
+qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
+{
+    Q_Q(QNativeSocketEngine);
+    TPtrC8 buffer((TUint8*)data, (int)len);
+    TSockXfrLength sentBytes;
+    TRequestStatus status; //TODO: OMG sync send!
+    nativeSocket.Send(buffer, 0, status, sentBytes);
+    User::WaitForRequest(status);
+    TInt err = status.Int(); 
+
+    if (err) {
+        switch (err) {
+        case KErrDisconnected:
+            sentBytes = -1;
+            setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
+            q->close();
+            break;
+        case KErrTooBig:
+            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            break;
+        case KErrWouldBlock:
+            sentBytes = 0;
+        default:
+            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
+           data, qt_prettyDebug(data, qMin((int) len, 16),
+                                (int) len).data(), len, (int) sentBytes());
+#endif
+
+    return qint64(sentBytes());
+}
+/*
+*/
+qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
+{
+    Q_Q(QNativeSocketEngine);
+    if (!q->isValid()) {
+        qWarning("QNativeSocketEngine::nativeRead: Invalid socket");
+        return -1;
+    }
+
+    TPtr8 buffer((TUint8*)data, (int)maxSize);
+    TSockXfrLength received = 0;
+    TRequestStatus status; //TODO: OMG sync receive!
+    nativeSocket.RecvOneOrMore(buffer, 0, status, received);
+    User::WaitForRequest(status);
+    TInt err = status.Int();
+    int r = received();
+
+    if (err) {
+        switch(err) {
+        case KErrWouldBlock:
+            // No data was available for reading
+            r = -2;
+            break;
+        case KErrDisconnected:
+            r = 0;
+            break;
+        default:
+            r = -1;
+            //error string is now set in read(), not here in nativeRead()
+            break;
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %i",
+           data, qt_prettyDebug(data, qMin(r, ssize_t(16)), r).data(),
+           maxSize, r);
+#endif
+
+    return qint64(r);
+}
+
+int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
+{
+//TODO: implement
+}
+
+int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
+                       bool *selectForRead, bool *selectForWrite) const
+{
+    //TODO: implement
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/socket/socket.pri b/src/network/socket/socket.pri
index 2bafe13..f2262fe 100644
--- a/src/network/socket/socket.pri
+++ b/src/network/socket/socket.pri
@@ -25,7 +25,9 @@ SOURCES += socket/qabstractsocketengine.cpp \
            socket/qlocalsocket.cpp \
            socket/qlocalserver.cpp
 
-unix:SOURCES += socket/qnativesocketengine_unix.cpp \
+unix:!symbian:SOURCES += socket/qnativesocketengine_unix.cpp
+symbian:SOURCES += socket/qnativesocketengine_symbian.cpp
+unix:SOURCES +=  \
                 socket/qlocalsocket_unix.cpp \
                 socket/qlocalserver_unix.cpp
 unix:HEADERS += \
-- 
cgit v0.12


From 5c7c12602f10be7625ee38efb31e1a8b5cb66c5b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 21 Sep 2010 17:42:14 +0100
Subject: Prototype socket manager

To enable passing socket handles around as integers, need a two way mapping
with RSocket. It's in corelib because of QSocketNotifier.
This is also a convenient place to host the global RSocketServ session.

Reviewed-By: Markus Goetz
---
 src/corelib/io/io.pri                  |  2 +-
 src/corelib/kernel/qcore_symbian_p.cpp | 72 ++++++++++++++++++++++++++++++++++
 src/corelib/kernel/qcore_symbian_p.h   | 67 +++++++++++++++++++++++++++++++
 3 files changed, 140 insertions(+), 1 deletion(-)

diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index cfb40bc..6cf55e7 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -95,6 +95,6 @@ win32 {
             SOURCES += io/qfilesystemwatcher_symbian.cpp
             HEADERS += io/qfilesystemwatcher_symbian_p.h
             INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
-            LIBS += -lplatformenv
+            LIBS += -lplatformenv -lesock
         }
 }
diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index df1c1ef..29996a4 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -210,4 +210,76 @@ Q_CORE_EXPORT RFs& qt_s60GetRFs()
     return qt_s60_RFsSession()->GetRFs();
 }
 
+QSymbianSocketManager::QSymbianSocketManager() :
+    iNextSocket(0)
+{
+    qt_symbian_throwIfError(iSocketServ.Connect());
+    qt_symbian_throwIfError(iSocketServ.ShareAuto());
+}
+
+QSymbianSocketManager::~QSymbianSocketManager()
+{
+    iSocketServ.Close();
+    if(!socketMap.isEmpty()) {
+        qWarning("leaked %d sockets on exit", socketMap.count());
+    }
+}
+
+RSocketServ& QSymbianSocketManager::getSocketServer() {
+    return iSocketServ;
+}
+
+int QSymbianSocketManager::addSocket(RSocket* sock) {
+    QMutexLocker l(&iMutex);
+    Q_ASSERT(!socketMap.contains(sock));
+    if(socketMap.contains(sock))
+        return socketMap.value(sock);
+    // allocate socket number
+    int guard = 0;
+    while(reverseSocketMap.contains(iNextSocket)) {
+        iNextSocket++;
+        iNextSocket %= max_sockets;
+        guard++;
+        if(guard > max_sockets)
+            return -1;
+    }
+    int id = iNextSocket;
+
+    socketMap[sock] = id;
+    reverseSocketMap[id] = sock;
+    return id + socket_offset;
+}
+
+bool QSymbianSocketManager::removeSocket(RSocket* sock) {
+    QMutexLocker l(&iMutex);
+    if(!socketMap.contains(sock))
+        return false;
+    int id = socketMap.value(sock);
+    socketMap.remove(sock);
+    reverseSocketMap.remove(id);
+    return true;
+}
+
+int QSymbianSocketManager::lookupSocket(RSocket* sock) const {
+    QMutexLocker l(&iMutex);
+    if(!socketMap.contains(sock))
+        return -1;
+    int id = socketMap.value(sock);
+    return id + socket_offset;
+}
+
+RSocket* QSymbianSocketManager::lookupSocket(int fd) const {
+    QMutexLocker l(&iMutex);
+    int id = fd + socket_offset;
+    if(!reverseSocketMap.contains(id))
+        return 0;
+    return reverseSocketMap.value(id);
+}
+
+Q_GLOBAL_STATIC(QSymbianSocketManager, qt_symbianSocketManager);
+
+QSymbianSocketManager& QSymbianSocketManager::instance()
+{
+    return *(qt_symbianSocketManager());
+}
 QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcore_symbian_p.h b/src/corelib/kernel/qcore_symbian_p.h
index 4a515ce..b6cba6e 100644
--- a/src/corelib/kernel/qcore_symbian_p.h
+++ b/src/corelib/kernel/qcore_symbian_p.h
@@ -55,10 +55,12 @@
 
 #include <e32std.h>
 #include <QtCore/qglobal.h>
+#include <QtCore/qmutex.h>
 #include <qstring.h>
 #include <qrect.h>
 #include <qhash.h>
 #include <f32file.h>
+#include <es_sock.h>
 
 #define QT_LSTRING2(x) L##x
 #define QT_LSTRING(x) QT_LSTRING2(x)
@@ -154,10 +156,75 @@ enum S60PluginFuncOrdinals
 Q_CORE_EXPORT TLibraryFunction qt_resolveS60PluginFunc(int ordinal);
 
 Q_CORE_EXPORT RFs& qt_s60GetRFs();
+Q_CORE_EXPORT RSocketServ& qt_symbianGetSocketServer();
 
 // Defined in qlocale_symbian.cpp.
 Q_CORE_EXPORT QByteArray qt_symbianLocaleName(int code);
 
+/*!
+  \internal
+  This class exists in QtCore for the benefit of QSocketNotifier, which uses integer
+  file descriptors in its public API.
+  So we need a way to map between int and RSocket.
+  Additionally, it is used to host the global RSocketServ session
+*/
+class Q_CORE_EXPORT QSymbianSocketManager
+{
+public:
+    QSymbianSocketManager();
+    ~QSymbianSocketManager();
+
+    /*!
+      \internal
+      \return handle to the socket server
+    */
+    RSocketServ& getSocketServer();
+    /*!
+      \internal
+      Adds a symbian socket to the global map
+      \param an open socket
+      \return pseudo file descriptor, -1 if out of resources
+    */
+    int addSocket(RSocket *sock);
+    /*!
+      \internal
+      Removes a symbian socket from the global map
+      \param an open socket
+      \return true if the socket was in the map
+    */
+    bool removeSocket(RSocket *sock);
+    /*!
+      \internal
+      Get pseudo file descriptor for a socket
+      \param an open socket
+      \return integer handle, or -1 if not in map
+    */
+    int lookupSocket(RSocket *sock) const;
+    /*!
+      \internal
+      Get socket for a pseudo file descriptor
+      \param an open socket fd
+      \return socket handle or NULL if not in map
+    */
+    RSocket *lookupSocket(int fd) const;
+
+    /*!
+      \internal
+      Gets a reference to the singleton socket manager
+    */
+    static QSymbianSocketManager& instance();
+private:
+    int allocateSocket();
+
+    const static int max_sockets = 0x20000; //covers all TCP and UDP ports, probably run out of memory first
+    const static int socket_offset = 0x40000000; //hacky way of separating sockets from file descriptors
+    int iNextSocket;
+    QHash<RSocket *, int> socketMap;
+    QHash<int, RSocket *> reverseSocketMap;
+    mutable QMutex iMutex;
+    RSocketServ iSocketServ;
+};
+
 QT_END_NAMESPACE
 
 QT_END_HEADER
-- 
cgit v0.12


From 9470dfb8b116cde0d08670d05ded530bad264c6c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 22 Sep 2010 12:04:01 +0100
Subject: Address some of the easier TODOs in native socket engine

Reviewed-By: Markus Goetz
---
 src/network/socket/qnativesocketengine_p.h         |   4 +
 src/network/socket/qnativesocketengine_symbian.cpp | 187 +++++++++++----------
 2 files changed, 105 insertions(+), 86 deletions(-)

diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index 72ebd9f..ceecfeb 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -64,6 +64,7 @@
 #include <private/qeventdispatcher_symbian_p.h>
 #include <unistd.h>
 #include <es_sock.h>
+#include <in_sock.h>
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -201,6 +202,7 @@ public:
     mutable RSocket nativeSocket;
     RSocketServ socketServer; //TODO: shared ref
     RConnection connection; //TODO: shared ref
+    mutable RTimer selectTimer;
 #endif
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
@@ -240,6 +242,8 @@ public:
     };
 
 #ifdef Q_OS_SYMBIAN
+    void getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr);
+    void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
     void setError(TInt symbianError);
 #endif
     void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
diff --git a/src/network/socket/qnativesocketengine_symbian.cpp b/src/network/socket/qnativesocketengine_symbian.cpp
index f2aeee9..788e58a 100644
--- a/src/network/socket/qnativesocketengine_symbian.cpp
+++ b/src/network/socket/qnativesocketengine_symbian.cpp
@@ -48,6 +48,7 @@
 #include "qvarlengtharray.h"
 #include <es_sock.h>
 #include <in_sock.h>
+#include <QtCore/private/qcore_symbian_p.h>
 #ifndef QT_NO_IPV6IFNAME
 #include <net/if.h>
 #endif
@@ -93,60 +94,7 @@ static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
 }
 #endif
 
-static void qt_ignore_sigpipe()
-{
-#ifndef Q_NO_POSIX_SIGNALS
-    // Set to ignore SIGPIPE once only.
-    static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0);
-    if (atom.testAndSetRelaxed(0, 1)) {
-        struct sigaction noaction;
-        memset(&noaction, 0, sizeof(noaction));
-        noaction.sa_handler = SIG_IGN;
-        ::sigaction(SIGPIPE, &noaction, 0);
-    }
-#else
-    // Posix signals are not supported by the underlying platform
-    // so we don't need to ignore sigpipe signal explicitly
-#endif
-}
-
-/*
-    Extracts the port and address from a sockaddr, and stores them in
-    \a port and \a addr if they are non-null.
-*/
-static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *port, QHostAddress *addr)
-{
-#if !defined(QT_NO_IPV6)
-    if (s->a.sa_family == AF_INET6) {
-        Q_IPV6ADDR tmp;
-        memcpy(&tmp, &s->a6.sin6_addr, sizeof(tmp));
-        if (addr) {
-            QHostAddress tmpAddress;
-            tmpAddress.setAddress(tmp);
-            *addr = tmpAddress;
-#ifndef QT_NO_IPV6IFNAME
-            char scopeid[IFNAMSIZ];
-            if (::if_indextoname(s->a6.sin6_scope_id, scopeid)) {
-                addr->setScopeId(QLatin1String(scopeid));
-            } else
-#endif
-            addr->setScopeId(QString::number(s->a6.sin6_scope_id));
-        }
-        if (port)
-            *port = ntohs(s->a6.sin6_port);
-        return;
-    }
-#endif
-    if (port)
-        *port = ntohs(s->a4.sin_port);
-    if (addr) {
-        QHostAddress tmpAddress;
-        tmpAddress.setAddress(ntohl(s->a4.sin_addr.s_addr));
-        *addr = tmpAddress;
-    }
-}
-
-static inline void qt_socket_getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
+void QNativeSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
 {
 #if !defined(QT_NO_IPV6)
     if (a.Family() == KAfInet6) {
@@ -157,13 +105,12 @@ static inline void qt_socket_getPortAndAddress(const TInetAddr& a, quint16 *port
             tmpAddress.setAddress(tmp);
             *addr = tmpAddress;
 #ifndef QT_NO_IPV6IFNAME
-            char scopeid[IFNAMSIZ];
-            //TODO: rather than using posix api, the symbian way is
-            //to use GetOpt with TSoInetIfQuery and KSoInetIfQueryByIndex
-            //which means this should be in a member function to have access to the nativeSocket
-            if (::if_indextoname(a.Scope(), scopeid)) {
-                addr->setScopeId(QLatin1String(scopeid));
-            } else
+            TPckgBuf<TSoInetIfQuery> query;
+            query().iSrcAddr = a;
+            TInt err = nativeSocket.GetOpt(KSoInetIfQueryBySrcAddr, KSolInetIfQuery, query);
+            if(!err)
+                addr->setScopeId(qt_TDesC2QString(query().iName));
+            else
 #endif
             addr->setScopeId(QString::number(a.Scope()));
         }
@@ -176,7 +123,7 @@ static inline void qt_socket_getPortAndAddress(const TInetAddr& a, quint16 *port
         *port = a.Port();
     if (addr) {
         QHostAddress tmpAddress;
-        tmpAddress.setAddress(a.Address()); //TODO: byte order ok?
+        tmpAddress.setAddress(a.Address());
         *addr = tmpAddress;
     }
 }
@@ -218,7 +165,7 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
         return false;
     }
 
-    socketDescriptor = nativeSocket.SubSessionHandle(); //TODO
+    socketDescriptor = QSymbianSocketManager::instance().addSocket(&nativeSocket);
     return true;
 }
 
@@ -245,15 +192,16 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co
         n = KSONonBlockingIO;
         break;
     case QNativeSocketEngine::BroadcastSocketOption:
-        n = SO_BROADCAST; //TODO
-        break;
+        return true; //symbian doesn't support or require this option
     case QNativeSocketEngine::AddressReusable:
-        n = SO_REUSEADDR; //TODO
+        level = KSolInetIp;
+        n = KSoReuseAddr;
         break;
     case QNativeSocketEngine::BindExclusively:
         return true;
     case QNativeSocketEngine::ReceiveOutOfBandData:
-        n = SO_OOBINLINE; //TODO
+        level = KSolInetTcp;
+        n = KSoTcpOobInline;
         break;
     case QNativeSocketEngine::LowDelayOption:
         level = KSolInetTcp;
@@ -297,18 +245,19 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
         n = KSOSendBuf;
         break;
     case QNativeSocketEngine::BroadcastSocketOption:
-        n = SO_BROADCAST; //TODO
-        break;
+        return true;
     case QNativeSocketEngine::NonBlockingSocketOption:
         n = KSONonBlockingIO;
         break;
     case QNativeSocketEngine::AddressReusable:
-        n = SO_REUSEADDR; //TODO
+        level = KSolInetIp;
+        n = KSoReuseAddr;
         break;
     case QNativeSocketEngine::BindExclusively:
         return true;
     case QNativeSocketEngine::ReceiveOutOfBandData:
-        n = SO_OOBINLINE; //TODO
+        level = KSolInetTcp;
+        n = KSoTcpOobInline;
         break;
     case QNativeSocketEngine::LowDelayOption:
         level = KSolInetTcp;
@@ -323,13 +272,19 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
     return (KErrNone == nativeSocket.SetOpt(n, level, v));
 }
 
-static TInetAddr qt_QHostAddressToTInetAddr(const QHostAddress &addr)
+void QNativeSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
-    TInetAddr nativeAddr;
+    nativeAddr.SetPort(port);
 #if !defined(QT_NO_IPV6)
     if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
 #ifndef QT_NO_IPV6IFNAME
-        nativeAddr.SetScope(::if_nametoindex(addr.scopeId().toLatin1().data())); //TODO - if_nametoindex
+        TPckgBuf<TSoInetIfQuery> query;
+        query().iName = qt_QString2TPtrC(addr.scopeId());
+        TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
+        if(!err)
+            nativeAddr.SetScope(query().iIndex);
+        else
+            nativeAddr.SetScope(0);
 #else
         nativeAddr.SetScope(addr.scopeId().toInt());
 #endif
@@ -344,7 +299,6 @@ static TInetAddr qt_QHostAddressToTInetAddr(const QHostAddress &addr)
     } else {
         qWarning("unsupported network protocol (%d)", addr.protocol());
     }
-    return nativeAddr;
 }
 
 bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16 port)
@@ -353,8 +307,8 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
     qDebug("QNativeSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
 #endif
 
-    TInetAddr nativeAddr = qt_QHostAddressToTInetAddr(addr);
-    nativeAddr.SetPort(port);
+    TInetAddr nativeAddr;
+    setPortAndAddress(nativeAddr, port, addr);
     //TODO: async connect with active object - from here to end of function is a mess
     TRequestStatus status;
     nativeSocket.Connect(nativeAddr, status);
@@ -413,8 +367,8 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
 
 bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
 {
-    TInetAddr nativeAddr = qt_QHostAddressToTInetAddr(address);
-    nativeAddr.SetPort(port);
+    TInetAddr nativeAddr;
+    setPortAndAddress(nativeAddr, port, address);
 
     TInt err = nativeSocket.Bind(nativeAddr);
 
@@ -535,7 +489,7 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS
     if (status.Int()) {
         setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
     } else if (port || address) {
-        qt_socket_getPortAndAddress(addr, port, address);
+        getPortAndAddress(addr, port, address);
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
@@ -555,9 +509,9 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l
                                                    const QHostAddress &host, quint16 port)
 {
     TPtrC8 buffer((TUint8*)data, (int)len);
-    TInetAddr addr = qt_QHostAddressToTInetAddr(host);
+    TInetAddr addr;
+    setPortAndAddress(addr, port, host);
     TSockXfrLength sentBytes;
-    addr.SetPort(port);
     TRequestStatus status; //TODO: OMG sync send!
     nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
     User::WaitForRequest(status);
@@ -592,12 +546,17 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
     if (socketDescriptor == -1)
         return false;
 
-    //TODO: work out how to initialise nativeSocket from socketDescriptor
+    if (!nativeSocket.SubSessionHandle()) {
+        RSocket *s = QSymbianSocketManager::instance().lookupSocket(socketDescriptor);
+        if (!s)
+            return false;
+        nativeSocket = *s; //TODO: badwrongfun (address is different, so this is broken)
+    }
 
     // Determine local address
     TSockAddr addr;
     nativeSocket.LocalName(addr);
-    qt_socket_getPortAndAddress(addr, &localPort, &localAddress);
+    getPortAndAddress(addr, &localPort, &localAddress);
 
     // Determine protocol family
     switch (addr.Family()) {
@@ -616,7 +575,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
 
     // Determine the remote address
     nativeSocket.RemoteName(addr);
-    qt_socket_getPortAndAddress(addr, &peerPort, &peerAddress);
+    getPortAndAddress(addr, &peerPort, &peerAddress);
 
     // Determine the socket type (UDP/TCP)
     TProtocolDesc protocol;
@@ -662,6 +621,7 @@ void QNativeSocketEnginePrivate::nativeClose()
 
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
     nativeSocket.Close();
+    QSymbianSocketManager::instance().removeSocket(&nativeSocket);
 }
 
 qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
@@ -744,13 +704,68 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
 
 int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
 {
-//TODO: implement
+    bool readyRead = false;
+    bool readyWrite = false;
+    if (selectForRead)
+        return nativeSelect(timeout, true, false, &readyRead, &readyWrite);
+    else
+        return nativeSelect(timeout, false, true, &readyRead, &readyWrite);
 }
 
+/*!
+ \internal
+ \param timeout timeout in milliseconds
+ \param checkRead caller is interested if the socket is ready to read
+ \param checkWrite caller is interested if the socket is ready for write
+ \param selectForRead (out) should set to true if ready to read
+ \param selectForWrite (out) should set to true if ready to write
+ \return 0 on timeout, >0 on success, <0 on error
+ */
 int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
                        bool *selectForRead, bool *selectForWrite) const
 {
     //TODO: implement
+    //as above, but checking both read and write status at the same time
+    if (!selectTimer.Handle())
+        qt_symbian_throwIfError(selectTimer.CreateLocal());
+    TRequestStatus timerStat;
+    selectTimer.HighRes(timerStat, timeout * 1000);
+    TRequestStatus* readStat = 0;
+    TRequestStatus* writeStat = 0;
+    TRequestStatus* array[3];
+    array[0] = &timerStat;
+    int count = 1;
+    if (checkRead) {
+        //TODO: get from read AO
+        //readStat = ?
+        array[count++] = readStat;
+    }
+    if (checkWrite) {
+        //TODO: get from write AO
+        //writeStat = ?
+        array[count++] = writeStat;
+    }
+
+    User::WaitForNRequest(array, count);
+    //IMPORTANT - WaitForNRequest only decrements the thread semaphore once, although more than one status may have completed.
+    if (timerStat.Int() != KRequestPending) {
+        //timed out
+        return 0;
+    }
+    selectTimer.Cancel();
+    User::WaitForRequest(timerStat);
+
+    if(readStat && readStat->Int() != KRequestPending) {
+        Q_ASSERT(checkRead && selectForRead);
+        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
+        *selectForRead = true;
+    }
+    if(writeStat && writeStat->Int() != KRequestPending) {
+        Q_ASSERT(checkWrite && selectForWrite);
+        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
+        *selectForWrite = true;
+    }
+    return 1;
 }
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From de55502a960a1044770aa840d7e443343b3c436b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 6 Dec 2010 12:36:13 +0000
Subject: Add socket manager to corelib

This class stores socket handles so they can be passed around as integers.
Also, it owns the global RSocketServ used throughout the application.
Reason for this not being in QtNetwork is that QtCore exports some socket
related classes.

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qcore_symbian_p.cpp | 27 +++++++++++++++++++++------
 src/corelib/kernel/qcore_symbian_p.h   | 34 +++++++++++++++++++++++++++-------
 2 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index 29996a4..809dc30 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -203,6 +203,11 @@ private:
     RFs iFs;
 };
 
+uint qHash(const RSubSessionBase& key)
+{
+    return qHash(key.SubSessionHandle());
+}
+
 Q_GLOBAL_STATIC(QS60RFsSession, qt_s60_RFsSession);
 
 Q_CORE_EXPORT RFs& qt_s60GetRFs()
@@ -229,7 +234,8 @@ RSocketServ& QSymbianSocketManager::getSocketServer() {
     return iSocketServ;
 }
 
-int QSymbianSocketManager::addSocket(RSocket* sock) {
+int QSymbianSocketManager::addSocket(const RSocket& socket) {
+    QHashableSocket sock(static_cast<const QHashableSocket &>(socket));
     QMutexLocker l(&iMutex);
     Q_ASSERT(!socketMap.contains(sock));
     if(socketMap.contains(sock))
@@ -250,7 +256,8 @@ int QSymbianSocketManager::addSocket(RSocket* sock) {
     return id + socket_offset;
 }
 
-bool QSymbianSocketManager::removeSocket(RSocket* sock) {
+bool QSymbianSocketManager::removeSocket(const RSocket &socket) {
+    QHashableSocket sock(static_cast<const QHashableSocket &>(socket));
     QMutexLocker l(&iMutex);
     if(!socketMap.contains(sock))
         return false;
@@ -260,7 +267,8 @@ bool QSymbianSocketManager::removeSocket(RSocket* sock) {
     return true;
 }
 
-int QSymbianSocketManager::lookupSocket(RSocket* sock) const {
+int QSymbianSocketManager::lookupSocket(const RSocket& socket) const {
+    QHashableSocket sock(static_cast<const QHashableSocket &>(socket));
     QMutexLocker l(&iMutex);
     if(!socketMap.contains(sock))
         return -1;
@@ -268,12 +276,13 @@ int QSymbianSocketManager::lookupSocket(RSocket* sock) const {
     return id + socket_offset;
 }
 
-RSocket* QSymbianSocketManager::lookupSocket(int fd) const {
+bool QSymbianSocketManager::lookupSocket(int fd, RSocket& socket) const {
     QMutexLocker l(&iMutex);
     int id = fd + socket_offset;
     if(!reverseSocketMap.contains(id))
-        return 0;
-    return reverseSocketMap.value(id);
+        return false;
+    socket = reverseSocketMap.value(id);
+    return true;
 }
 
 Q_GLOBAL_STATIC(QSymbianSocketManager, qt_symbianSocketManager);
@@ -282,4 +291,10 @@ QSymbianSocketManager& QSymbianSocketManager::instance()
 {
     return *(qt_symbianSocketManager());
 }
+
+Q_CORE_EXPORT RSocketServ& qt_symbianGetSocketServer()
+{
+    return QSymbianSocketManager::instance().getSocketServer();
+}
+
 QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcore_symbian_p.h b/src/corelib/kernel/qcore_symbian_p.h
index b6cba6e..8ffa247 100644
--- a/src/corelib/kernel/qcore_symbian_p.h
+++ b/src/corelib/kernel/qcore_symbian_p.h
@@ -161,6 +161,25 @@ Q_CORE_EXPORT RSocketServ& qt_symbianGetSocketServer();
 // Defined in qlocale_symbian.cpp.
 Q_CORE_EXPORT QByteArray qt_symbianLocaleName(int code);
 
+//Wrapper for RSocket so it can be used as a key in QHash or QMap
+class QHashableSocket : public RSocket
+{
+public:
+    bool operator==(const QHashableSocket &other) const
+    {
+        return SubSessionHandle() == other.SubSessionHandle()
+            && Session().Handle() == other.Session().Handle();
+    }
+    bool operator<(const QHashableSocket &other) const
+    {
+        if(Session().Handle() == other.Session().Handle())
+            return SubSessionHandle() < other.SubSessionHandle();
+        return Session().Handle() < other.Session().Handle();
+    }
+};
+
+uint qHash(const RSubSessionBase& key);
+
 /*!
   \internal
   This class exists in QtCore for the benefit of QSocketNotifier, which uses integer
@@ -185,28 +204,29 @@ public:
       \param an open socket
       \return pseudo file descriptor, -1 if out of resources
     */
-    int addSocket(RSocket *sock);
+    int addSocket(const RSocket &sock);
     /*!
       \internal
       Removes a symbian socket from the global map
       \param an open socket
       \return true if the socket was in the map
     */
-    bool removeSocket(RSocket *sock);
+    bool removeSocket(const RSocket &sock);
     /*!
       \internal
       Get pseudo file descriptor for a socket
       \param an open socket
       \return integer handle, or -1 if not in map
     */
-    int lookupSocket(RSocket *sock) const;
+    int lookupSocket(const RSocket &sock) const;
     /*!
       \internal
       Get socket for a pseudo file descriptor
       \param an open socket fd
-      \return socket handle or NULL if not in map
+      \param sock (out) socket handle
+      \return true on success or false if not in map
     */
-    RSocket *lookupSocket(int fd) const;
+    bool lookupSocket(int fd, RSocket& sock) const;
 
     /*!
       \internal
@@ -219,8 +239,8 @@ private:
     const static int max_sockets = 0x20000; //covers all TCP and UDP ports, probably run out of memory first
     const static int socket_offset = 0x40000000; //hacky way of separating sockets from file descriptors
     int iNextSocket;
-    QHash<RSocket *, int> socketMap;
-    QHash<int, RSocket *> reverseSocketMap;
+    QHash<QHashableSocket, int> socketMap;
+    QHash<int, RSocket> reverseSocketMap;
     mutable QMutex iMutex;
     RSocketServ iSocketServ;
 };
-- 
cgit v0.12


From 7ec11a51d564c85d46ddee270cf7c743a2cbd320 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 6 Dec 2010 14:02:02 +0000
Subject: Use socket manager in QtNetwork

Store/Retrieve sockets in the socket manager
Use the shared socket server instance from QtCore
Also, add 4 stub functions for multicast groups (new in master) to fix
  link error

Reviewed-by: Markus Goetz
---
 src/network/socket/qnativesocketengine.cpp         | 17 +++++++----
 src/network/socket/qnativesocketengine_p.h         |  2 +-
 src/network/socket/qnativesocketengine_symbian.cpp | 35 ++++++++++++++++++----
 3 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index df73b9c..00d36b4 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -110,6 +110,10 @@
 # include "qtcpserver.h"
 #endif
 
+#ifdef Q_OS_SYMBIAN
+# include <private/qcore_symbian_p.h>
+#endif
+
 QT_BEGIN_NAMESPACE
 
 //#define QNATIVESOCKETENGINE_DEBUG
@@ -158,12 +162,15 @@ QT_BEGIN_NAMESPACE
     concurrent QNativeSocketEngine. This is safe, because WSAStartup and
     WSACleanup are reference counted.
 */
-QNativeSocketEnginePrivate::QNativeSocketEnginePrivate()
+QNativeSocketEnginePrivate::QNativeSocketEnginePrivate() :
+    socketDescriptor(-1),
+#ifdef Q_OS_SYMBIAN
+    socketServer(qt_symbianGetSocketServer()),
+#endif
+    readNotifier(0),
+    writeNotifier(0),
+    exceptNotifier(0)
 {
-    socketDescriptor = -1;
-    readNotifier = 0;
-    writeNotifier = 0;
-    exceptNotifier = 0;
 }
 
 /*! \internal
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index ceecfeb..c017065 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -200,7 +200,7 @@ public:
     int socketDescriptor;
 #ifdef Q_OS_SYMBIAN
     mutable RSocket nativeSocket;
-    RSocketServ socketServer; //TODO: shared ref
+    RSocketServ& socketServer;
     RConnection connection; //TODO: shared ref
     mutable RTimer selectTimer;
 #endif
diff --git a/src/network/socket/qnativesocketengine_symbian.cpp b/src/network/socket/qnativesocketengine_symbian.cpp
index 788e58a..d1a0819 100644
--- a/src/network/socket/qnativesocketengine_symbian.cpp
+++ b/src/network/socket/qnativesocketengine_symbian.cpp
@@ -46,6 +46,7 @@
 #include "qhostaddress.h"
 #include "qelapsedtimer.h"
 #include "qvarlengtharray.h"
+#include "qnetworkinterface.h"
 #include <es_sock.h>
 #include <in_sock.h>
 #include <QtCore/private/qcore_symbian_p.h>
@@ -165,7 +166,7 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
         return false;
     }
 
-    socketDescriptor = QSymbianSocketManager::instance().addSocket(&nativeSocket);
+    socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
     return true;
 }
 
@@ -547,10 +548,8 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
         return false;
 
     if (!nativeSocket.SubSessionHandle()) {
-        RSocket *s = QSymbianSocketManager::instance().lookupSocket(socketDescriptor);
-        if (!s)
+        if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, nativeSocket))
             return false;
-        nativeSocket = *s; //TODO: badwrongfun (address is different, so this is broken)
     }
 
     // Determine local address
@@ -621,7 +620,7 @@ void QNativeSocketEnginePrivate::nativeClose()
 
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
     nativeSocket.Close();
-    QSymbianSocketManager::instance().removeSocket(&nativeSocket);
+    QSymbianSocketManager::instance().removeSocket(nativeSocket);
 }
 
 qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
@@ -768,4 +767,30 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool c
     return 1;
 }
 
+bool QNativeSocketEnginePrivate::nativeJoinMulticastGroup(const QHostAddress &groupAddress,
+                              const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
+bool QNativeSocketEnginePrivate::nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
+                               const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
+QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
+{
+    //TODO
+    return QNetworkInterface();
+}
+
+bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
 QT_END_NAMESPACE
-- 
cgit v0.12


From 8dacbccfd89006d1571b3b6ab6e96ea13e74f455 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 6 Dec 2010 15:47:40 +0000
Subject: Set preferences in socket server Connect()

Tell the socket server we intend to use this session mainly for IP
This allows the socket server to optimise this session for IP usage.

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qcore_symbian_p.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index 809dc30..b6688f7 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -44,6 +44,7 @@
 #include <e32uid.h>
 #include "qcore_symbian_p.h"
 #include <string>
+#include <in_sock.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -218,7 +219,11 @@ Q_CORE_EXPORT RFs& qt_s60GetRFs()
 QSymbianSocketManager::QSymbianSocketManager() :
     iNextSocket(0)
 {
-    qt_symbian_throwIfError(iSocketServ.Connect());
+    TSessionPref preferences;
+    // ### In future this could be changed to KAfInet6 when that is more common than IPv4
+    preferences.iAddrFamily = KAfInet;
+    preferences.iProtocol = KProtocolInetIp;
+    qt_symbian_throwIfError(iSocketServ.Connect(preferences));
     qt_symbian_throwIfError(iSocketServ.ShareAuto());
 }
 
-- 
cgit v0.12


From 5ef1fb5823a25cd4b27029701f7d707c82750acb Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 6 Dec 2010 15:57:59 +0000
Subject: Use shared socket server session everywhere

Converted uses of RSocketServ in QtNetwork and the symbian bearer plugin
to use the shared session from QtCore instead of creating their own

Reviewed-by: Markus Goetz
---
 src/network/kernel/qnetworkinterface_symbian.cpp    | 13 ++-----------
 src/plugins/bearer/symbian/qnetworksession_impl.cpp | 18 +++---------------
 src/plugins/bearer/symbian/qnetworksession_impl.h   |  2 +-
 3 files changed, 6 insertions(+), 27 deletions(-)

diff --git a/src/network/kernel/qnetworkinterface_symbian.cpp b/src/network/kernel/qnetworkinterface_symbian.cpp
index 7942461..751664e 100644
--- a/src/network/kernel/qnetworkinterface_symbian.cpp
+++ b/src/network/kernel/qnetworkinterface_symbian.cpp
@@ -44,6 +44,7 @@
 #include "qnetworkinterface.h"
 #include "qnetworkinterface_p.h"
 #include "../corelib/kernel/qcore_symbian_p.h"
+#include <private/qcore_symbian_p.h>
 
 #ifndef QT_NO_NETWORKINTERFACE
 
@@ -72,17 +73,10 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     TInt err(KErrNone);
     QList<QNetworkInterfacePrivate *> interfaces;
 
-    // Connect to Native socket server
-    RSocketServ socketServ;
-    err = socketServ.Connect();
-    if (err)
-        return interfaces;
-
     // Open dummy socket for interface queries
     RSocket socket;
-    err = socket.Open(socketServ, _L("udp"));
+    err = socket.Open(qt_symbianGetSocketServer(), _L("udp"));
     if (err) {
-        socketServ.Close();
         return interfaces;
     }
 
@@ -90,7 +84,6 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     err =  socket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
     if (err) {
         socket.Close();
-        socketServ.Close();
         return interfaces;
     }
 
@@ -176,7 +169,6 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     err =  socket.SetOpt(KSoInetEnumRoutes, KSolInetRtCtrl);
     if (err) {
         socket.Close();
-        socketServ.Close();
         // return what we have
         // up to this moment
         return interfaces;
@@ -223,7 +215,6 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     }
 
     socket.Close();
-    socketServ.Close();
 
     return interfaces;
 }
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 53a5b4d..cfb55bf 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -47,6 +47,7 @@
 #include <in_sock.h>
 #include <stdapis/sys/socket.h>
 #include <stdapis/net/if.h>
+#include <private/qcore_symbian_p.h>
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
 #include <cmmanager.h>
@@ -65,7 +66,7 @@ QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
     iDynamicUnSetdefaultif(0), ipConnectionNotifier(0),
     iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false),
     iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0),
-    iConnectInBackground(false), isOpening(false)
+    iConnectInBackground(false), isOpening(false), iSocketServ(qt_symbianGetSocketServer())
 {
     CActiveScheduler::Add(this);
 
@@ -109,7 +110,6 @@ QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
 
     // Cancel possible RConnection::Start()
     Cancel();
-    iSocketServ.Close();
 
     // Close global 'Open C' RConnection
     // Clears also possible unsetdefaultif() flags.
@@ -363,20 +363,9 @@ void QNetworkSessionPrivateImpl::open()
     iStoppedByUser = false;
     iClosedByUser = false;
 
-    TInt error = iSocketServ.Connect();
-    if (error != KErrNone) {
-        // Could not open RSocketServ
-        newState(QNetworkSession::Invalid);
-        iError = QNetworkSession::UnknownSessionError;
-        emit QNetworkSessionPrivate::error(iError);
-        syncStateWithInterface();    
-        return;
-    }
-    
-    error = iConnection.Open(iSocketServ);
+    TInt error = iConnection.Open(iSocketServ);
     if (error != KErrNone) {
         // Could not open RConnection
-        iSocketServ.Close();
         newState(QNetworkSession::Invalid);
         iError = QNetworkSession::UnknownSessionError;
         emit QNetworkSessionPrivate::error(iError);
@@ -533,7 +522,6 @@ void QNetworkSessionPrivateImpl::close(bool allowSignals)
     }
     
     Cancel(); // closes iConnection
-    iSocketServ.Close();
 
     // Close global 'Open C' RConnection. If OpenC supports,
     // close the defaultif for good to avoid difficult timing
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index 8e3e997..1101d1e 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -162,7 +162,7 @@ private: // data
     RLibrary iOpenCLibrary;
     TOpenCUnSetdefaultifFunction iDynamicUnSetdefaultif;
 
-    mutable RSocketServ iSocketServ;
+    mutable RSocketServ &iSocketServ; //not owned, shared from QtCore
     mutable RConnection iConnection;
     mutable RConnectionMonitor iConnectionMonitor;
     ConnectionProgressNotifier* ipConnectionNotifier;
-- 
cgit v0.12


From 3a53b2853c0f1d4ace0eaf73f8c5ca5ded172345 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 09:23:04 +0100
Subject: Symbian socket engine: Some more comments

---
 src/network/socket/qnativesocketengine_symbian.cpp | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qnativesocketengine_symbian.cpp b/src/network/socket/qnativesocketengine_symbian.cpp
index d1a0819..cfaee03 100644
--- a/src/network/socket/qnativesocketengine_symbian.cpp
+++ b/src/network/socket/qnativesocketengine_symbian.cpp
@@ -165,6 +165,9 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
 
         return false;
     }
+    // FIXME Set socket to nonblocking. While we are still a QNativeSocketEngine this is done already.
+    // Uncomment the following when we switch to QSymbianSocketEngine.
+    // setOption(NonBlockingSocketOption, 1)
 
     socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
     return true;
@@ -444,7 +447,8 @@ int QNativeSocketEnginePrivate::nativeAccept()
         qWarning("QNativeSocketEnginePrivate::nativeAccept() - error %d", status.Int());
         return 0;
     }
-
+    // FIXME Qt Handle of new socket must be retrieved from QSymbianSocketManager
+    // and then returned. Not the SubSessionHandle! Also set the socket to nonblocking.
     return blankSocket.SubSessionHandle();
 }
 
@@ -452,6 +456,8 @@ qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
 {
     int nbytes = 0;
     qint64 available = 0;
+    // FIXME is this the right thing also for UDP?
+    // What is expected for UDP, the length for the next packet I guess?
     TInt err = nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
     if(err)
         return 0;
@@ -476,6 +482,8 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
     int nbytes;
     TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
+    // Why = Could it be that this is about header lengths etc? if yes
+    // this could be pretty broken, especially for IPv6
 }
 
 qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
@@ -744,6 +752,8 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool c
         //writeStat = ?
         array[count++] = writeStat;
     }
+    // TODO: for selecting, we can use getOpt(KSOSelectPoll) to get the select result
+    // and KIOCtlSelect for the selecting.
 
     User::WaitForNRequest(array, count);
     //IMPORTANT - WaitForNRequest only decrements the thread semaphore once, although more than one status may have completed.
-- 
cgit v0.12


From fcb60092c90934df77f1441df7ab2a14fc5edf32 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 09:43:07 +0100
Subject: Copy qhostinfo_unix.cpp to qhostinfo_symbian.cpp

---
 src/network/kernel/kernel.pri            |   2 +-
 src/network/kernel/qhostinfo_symbian.cpp | 407 +++++++++++++++++++++++++++++++
 2 files changed, 408 insertions(+), 1 deletion(-)
 create mode 100644 src/network/kernel/qhostinfo_symbian.cpp

diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index 6145c43..ccc113c 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -20,7 +20,7 @@ SOURCES += kernel/qauthenticator.cpp \
            kernel/qnetworkproxy.cpp \
 	   kernel/qnetworkinterface.cpp
 
-symbian: SOURCES += kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_symbian.cpp
+symbian: SOURCES += kernel/qhostinfo_symbian.cpp kernel/qnetworkinterface_symbian.cpp
 unix:!symbian:SOURCES += kernel/qhostinfo_unix.cpp kernel/qnetworkinterface_unix.cpp
 win32:SOURCES += kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
 
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
new file mode 100644
index 0000000..5ca15a3
--- /dev/null
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -0,0 +1,407 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//#define QHOSTINFO_DEBUG
+
+#include "qplatformdefs.h"
+
+#include "qhostinfo_p.h"
+#include "private/qnativesocketengine_p.h"
+#include "qiodevice.h"
+#include <qbytearray.h>
+#include <qlibrary.h>
+#include <qurl.h>
+#include <qfile.h>
+#include <private/qmutexpool_p.h>
+#include <private/qnet_unix_p.h>
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#if defined(Q_OS_VXWORKS)
+#  include <hostLib.h>
+#else
+#  include <resolv.h>
+#endif
+
+#if defined (QT_NO_GETADDRINFO)
+#include <qmutex.h>
+QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC(QMutex, getHostByNameMutex)
+QT_END_NAMESPACE
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// Almost always the same. If not, specify in qplatformdefs.h.
+#if !defined(QT_SOCKOPTLEN_T)
+# define QT_SOCKOPTLEN_T QT_SOCKLEN_T
+#endif
+
+// HP-UXi has a bug in getaddrinfo(3) that makes it thread-unsafe
+// with this flag. So disable it in that platform.
+#if defined(AI_ADDRCONFIG) && !defined(Q_OS_HPUX)
+#  define Q_ADDRCONFIG          AI_ADDRCONFIG
+#endif
+
+typedef struct __res_state *res_state_ptr;
+
+typedef int (*res_init_proto)(void);
+static res_init_proto local_res_init = 0;
+typedef int (*res_ninit_proto)(res_state_ptr);
+static res_ninit_proto local_res_ninit = 0;
+typedef void (*res_nclose_proto)(res_state_ptr);
+static res_nclose_proto local_res_nclose = 0;
+static res_state_ptr local_res = 0;
+
+static void resolveLibrary()
+{
+#ifndef QT_NO_LIBRARY
+    QLibrary lib(QLatin1String("resolv"));
+    if (!lib.load())
+        return;
+
+    local_res_init = res_init_proto(lib.resolve("__res_init"));
+    if (!local_res_init)
+        local_res_init = res_init_proto(lib.resolve("res_init"));
+
+    local_res_ninit = res_ninit_proto(lib.resolve("__res_ninit"));
+    if (!local_res_ninit)
+        local_res_ninit = res_ninit_proto(lib.resolve("res_ninit"));
+
+    if (!local_res_ninit) {
+        // if we can't get a thread-safe context, we have to use the global _res state
+        local_res = res_state_ptr(lib.resolve("_res"));
+    } else {
+        local_res_nclose = res_nclose_proto(lib.resolve("res_nclose"));
+        if (!local_res_nclose)
+            local_res_nclose = res_nclose_proto(lib.resolve("__res_nclose"));
+        if (!local_res_nclose)
+            local_res_ninit = 0;
+    }
+#endif
+}
+
+QHostInfo QHostInfoAgent::fromName(const QString &hostName)
+{
+    QHostInfo results;
+
+#if defined(QHOSTINFO_DEBUG)
+    qDebug("QHostInfoAgent::fromName(%s) looking up...",
+           hostName.toLatin1().constData());
+#endif
+
+    // Load res_init on demand.
+    static volatile bool triedResolve = false;
+    if (!triedResolve) {
+        QMutexLocker locker(QMutexPool::globalInstanceGet(&local_res_init));
+        if (!triedResolve) {
+            resolveLibrary();
+            triedResolve = true;
+        }
+    }
+
+    // If res_init is available, poll it.
+    if (local_res_init)
+        local_res_init();
+
+    QHostAddress address;
+    if (address.setAddress(hostName)) {
+        // Reverse lookup
+// Reverse lookups using getnameinfo are broken on darwin, use gethostbyaddr instead.
+#if !defined (QT_NO_GETADDRINFO) && !defined (Q_OS_DARWIN) && !defined (Q_OS_SYMBIAN)
+        sockaddr_in sa4;
+#ifndef QT_NO_IPV6
+        sockaddr_in6 sa6;
+#endif
+        sockaddr *sa = 0;
+        QT_SOCKLEN_T saSize = 0;
+        if (address.protocol() == QAbstractSocket::IPv4Protocol) {
+            sa = (sockaddr *)&sa4;
+            saSize = sizeof(sa4);
+            memset(&sa4, 0, sizeof(sa4));
+            sa4.sin_family = AF_INET;
+            sa4.sin_addr.s_addr = htonl(address.toIPv4Address());
+        }
+#ifndef QT_NO_IPV6
+        else {
+            sa = (sockaddr *)&sa6;
+            saSize = sizeof(sa6);
+            memset(&sa6, 0, sizeof(sa6));
+            sa6.sin6_family = AF_INET6;
+            memcpy(sa6.sin6_addr.s6_addr, address.toIPv6Address().c, sizeof(sa6.sin6_addr.s6_addr));
+        }
+#endif
+
+        char hbuf[NI_MAXHOST];
+        if (sa && getnameinfo(sa, saSize, hbuf, sizeof(hbuf), 0, 0, 0) == 0)
+            results.setHostName(QString::fromLatin1(hbuf));
+#else
+        in_addr_t inetaddr = qt_safe_inet_addr(hostName.toLatin1().constData());
+        struct hostent *ent = gethostbyaddr((const char *)&inetaddr, sizeof(inetaddr), AF_INET);
+        if (ent)
+            results.setHostName(QString::fromLatin1(ent->h_name));
+#endif
+
+        if (results.hostName().isEmpty())
+            results.setHostName(address.toString());
+        results.setAddresses(QList<QHostAddress>() << address);
+        return results;
+    }
+
+    // IDN support
+    QByteArray aceHostname = QUrl::toAce(hostName);
+    results.setHostName(hostName);
+    if (aceHostname.isEmpty()) {
+        results.setError(QHostInfo::HostNotFound);
+        results.setErrorString(hostName.isEmpty() ?
+                               QCoreApplication::translate("QHostInfoAgent", "No host name given") :
+                               QCoreApplication::translate("QHostInfoAgent", "Invalid hostname"));
+        return results;
+    }
+
+#if !defined (QT_NO_GETADDRINFO)
+    // Call getaddrinfo, and place all IPv4 addresses at the start and
+    // the IPv6 addresses at the end of the address list in results.
+    addrinfo *res = 0;
+    struct addrinfo hints;
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = PF_UNSPEC;
+#ifdef Q_ADDRCONFIG
+    hints.ai_flags = Q_ADDRCONFIG;
+#endif
+#ifdef Q_OS_SYMBIAN
+#   ifdef QHOSTINFO_DEBUG
+        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
+#   endif
+#endif
+
+    int result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
+# ifdef Q_ADDRCONFIG
+    if (result == EAI_BADFLAGS) {
+        // if the lookup failed with AI_ADDRCONFIG set, try again without it
+        hints.ai_flags = 0;
+#ifdef Q_OS_SYMBIAN
+#   ifdef QHOSTINFO_DEBUG
+        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
+#   endif
+        hints.ai_flags &= AI_V4MAPPED | AI_ALL;
+#endif
+        result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
+    }
+# endif
+
+    if (result == 0) {
+        addrinfo *node = res;
+        QList<QHostAddress> addresses;
+        while (node) {
+#ifdef QHOSTINFO_DEBUG
+                qDebug() << "getaddrinfo node: flags:" << node->ai_flags << "family:" << node->ai_family << "ai_socktype:" << node->ai_socktype << "ai_protocol:" << node->ai_protocol << "ai_addrlen:" << node->ai_addrlen;
+#endif
+            if (node->ai_family == AF_INET) {
+                QHostAddress addr;
+                addr.setAddress(ntohl(((sockaddr_in *) node->ai_addr)->sin_addr.s_addr));
+                if (!addresses.contains(addr))
+                    addresses.append(addr);
+            }
+#ifndef QT_NO_IPV6
+            else if (node->ai_family == AF_INET6) {
+                QHostAddress addr;
+                sockaddr_in6 *sa6 = (sockaddr_in6 *) node->ai_addr;
+                addr.setAddress(sa6->sin6_addr.s6_addr);
+                if (sa6->sin6_scope_id)
+                    addr.setScopeId(QString::number(sa6->sin6_scope_id));
+                if (!addresses.contains(addr))
+                    addresses.append(addr);
+            }
+#endif
+            node = node->ai_next;
+        }
+        if (addresses.isEmpty() && node == 0) {
+            // Reached the end of the list, but no addresses were found; this
+            // means the list contains one or more unknown address types.
+            results.setError(QHostInfo::UnknownError);
+            results.setErrorString(tr("Unknown address type"));
+        }
+
+        results.setAddresses(addresses);
+        freeaddrinfo(res);
+    } else if (result == EAI_NONAME
+               || result ==  EAI_FAIL
+#ifdef EAI_NODATA
+	       // EAI_NODATA is deprecated in RFC 3493
+	       || result == EAI_NODATA
+#endif
+	       ) {
+        results.setError(QHostInfo::HostNotFound);
+        results.setErrorString(tr("Host not found"));
+    } else {
+        results.setError(QHostInfo::UnknownError);
+        results.setErrorString(QString::fromLocal8Bit(gai_strerror(result)));
+    }
+
+#else
+    // Fall back to gethostbyname for platforms that don't define
+    // getaddrinfo. gethostbyname does not support IPv6, and it's not
+    // reentrant on all platforms. For now this is okay since we only
+    // use one QHostInfoAgent, but if more agents are introduced, locking
+    // must be provided.
+    QMutexLocker locker(::getHostByNameMutex());
+    hostent *result = gethostbyname(aceHostname.constData());
+    if (result) {
+        if (result->h_addrtype == AF_INET) {
+            QList<QHostAddress> addresses;
+            for (char **p = result->h_addr_list; *p != 0; p++) {
+                QHostAddress addr;
+                addr.setAddress(ntohl(*((quint32 *)*p)));
+                if (!addresses.contains(addr))
+                    addresses.prepend(addr);
+            }
+            results.setAddresses(addresses);
+        } else {
+            results.setError(QHostInfo::UnknownError);
+            results.setErrorString(tr("Unknown address type"));
+        }
+#if !defined(Q_OS_VXWORKS)
+    } else if (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA
+               || h_errno == NO_ADDRESS) {
+        results.setError(QHostInfo::HostNotFound);
+        results.setErrorString(tr("Host not found"));
+#endif
+    } else {
+        results.setError(QHostInfo::UnknownError);
+        results.setErrorString(tr("Unknown error"));
+    }
+#endif //  !defined (QT_NO_GETADDRINFO)
+
+#if defined(QHOSTINFO_DEBUG)
+    if (results.error() != QHostInfo::NoError) {
+        qDebug("QHostInfoAgent::fromName(): error #%d %s",
+               h_errno, results.errorString().toLatin1().constData());
+    } else {
+        QString tmp;
+        QList<QHostAddress> addresses = results.addresses();
+        for (int i = 0; i < addresses.count(); ++i) {
+            if (i != 0) tmp += ", ";
+            tmp += addresses.at(i).toString();
+        }
+        qDebug("QHostInfoAgent::fromName(): found %i entries for \"%s\": {%s}",
+               addresses.count(), hostName.toLatin1().constData(),
+               tmp.toLatin1().constData());
+    }
+#endif
+    return results;
+}
+
+QString QHostInfo::localHostName()
+{
+    char hostName[512];
+    if (gethostname(hostName, sizeof(hostName)) == -1)
+        return QString();
+    hostName[sizeof(hostName) - 1] = '\0';
+    return QString::fromLocal8Bit(hostName);
+}
+
+QString QHostInfo::localDomainName()
+{
+#if !defined(Q_OS_VXWORKS)
+    resolveLibrary();
+    if (local_res_ninit) {
+        // using thread-safe version
+        res_state_ptr state = res_state_ptr(qMalloc(sizeof(*state)));
+        Q_CHECK_PTR(state);
+        memset(state, 0, sizeof(*state));
+        local_res_ninit(state);
+        QString domainName = QUrl::fromAce(state->defdname);
+        if (domainName.isEmpty())
+            domainName = QUrl::fromAce(state->dnsrch[0]);
+        local_res_nclose(state);
+        qFree(state);
+
+        return domainName;
+    }
+
+    if (local_res_init && local_res) {
+        // using thread-unsafe version
+
+#if defined(QT_NO_GETADDRINFO)
+        // We have to call res_init to be sure that _res was initialized
+        // So, for systems without getaddrinfo (which is thread-safe), we lock the mutex too
+        QMutexLocker locker(::getHostByNameMutex());
+#endif
+        local_res_init();
+        QString domainName = QUrl::fromAce(local_res->defdname);
+        if (domainName.isEmpty())
+            domainName = QUrl::fromAce(local_res->dnsrch[0]);
+        return domainName;
+    }
+#endif
+    // nothing worked, try doing it by ourselves:
+    QFile resolvconf;
+#if defined(_PATH_RESCONF)
+    resolvconf.setFileName(QFile::decodeName(_PATH_RESCONF));
+#else
+    resolvconf.setFileName(QLatin1String("/etc/resolv.conf"));
+#endif
+    if (!resolvconf.open(QIODevice::ReadOnly))
+        return QString();       // failure
+
+    QString domainName;
+    while (!resolvconf.atEnd()) {
+        QByteArray line = resolvconf.readLine().trimmed();
+        if (line.startsWith("domain "))
+            return QUrl::fromAce(line.mid(sizeof "domain " - 1).trimmed());
+
+        // in case there's no "domain" line, fall back to the first "search" entry
+        if (domainName.isEmpty() && line.startsWith("search ")) {
+            QByteArray searchDomain = line.mid(sizeof "search " - 1).trimmed();
+            int pos = searchDomain.indexOf(' ');
+            if (pos != -1)
+                searchDomain.truncate(pos);
+            domainName = QUrl::fromAce(searchDomain);
+        }
+    }
+
+    // return the fallen-back-to searched domain
+    return domainName;
+}
+
+QT_END_NAMESPACE
-- 
cgit v0.12


From 5c75d5bed133a4cd77329b5e90d1f47f86f92a17 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 10:01:08 +0100
Subject: Weed out old unix code from qhostinfo_symbian.cpp

---
 src/network/kernel/qhostinfo_symbian.cpp | 322 +------------------------------
 1 file changed, 9 insertions(+), 313 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 5ca15a3..2e1e6ca 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -44,82 +44,9 @@
 #include "qplatformdefs.h"
 
 #include "qhostinfo_p.h"
-#include "private/qnativesocketengine_p.h"
-#include "qiodevice.h"
-#include <qbytearray.h>
-#include <qlibrary.h>
-#include <qurl.h>
-#include <qfile.h>
-#include <private/qmutexpool_p.h>
-#include <private/qnet_unix_p.h>
-
-#include <sys/types.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-#if defined(Q_OS_VXWORKS)
-#  include <hostLib.h>
-#else
-#  include <resolv.h>
-#endif
-
-#if defined (QT_NO_GETADDRINFO)
-#include <qmutex.h>
-QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(QMutex, getHostByNameMutex)
-QT_END_NAMESPACE
-#endif
 
 QT_BEGIN_NAMESPACE
 
-// Almost always the same. If not, specify in qplatformdefs.h.
-#if !defined(QT_SOCKOPTLEN_T)
-# define QT_SOCKOPTLEN_T QT_SOCKLEN_T
-#endif
-
-// HP-UXi has a bug in getaddrinfo(3) that makes it thread-unsafe
-// with this flag. So disable it in that platform.
-#if defined(AI_ADDRCONFIG) && !defined(Q_OS_HPUX)
-#  define Q_ADDRCONFIG          AI_ADDRCONFIG
-#endif
-
-typedef struct __res_state *res_state_ptr;
-
-typedef int (*res_init_proto)(void);
-static res_init_proto local_res_init = 0;
-typedef int (*res_ninit_proto)(res_state_ptr);
-static res_ninit_proto local_res_ninit = 0;
-typedef void (*res_nclose_proto)(res_state_ptr);
-static res_nclose_proto local_res_nclose = 0;
-static res_state_ptr local_res = 0;
-
-static void resolveLibrary()
-{
-#ifndef QT_NO_LIBRARY
-    QLibrary lib(QLatin1String("resolv"));
-    if (!lib.load())
-        return;
-
-    local_res_init = res_init_proto(lib.resolve("__res_init"));
-    if (!local_res_init)
-        local_res_init = res_init_proto(lib.resolve("res_init"));
-
-    local_res_ninit = res_ninit_proto(lib.resolve("__res_ninit"));
-    if (!local_res_ninit)
-        local_res_ninit = res_ninit_proto(lib.resolve("res_ninit"));
-
-    if (!local_res_ninit) {
-        // if we can't get a thread-safe context, we have to use the global _res state
-        local_res = res_state_ptr(lib.resolve("_res"));
-    } else {
-        local_res_nclose = res_nclose_proto(lib.resolve("res_nclose"));
-        if (!local_res_nclose)
-            local_res_nclose = res_nclose_proto(lib.resolve("__res_nclose"));
-        if (!local_res_nclose)
-            local_res_ninit = 0;
-    }
-#endif
-}
-
 QHostInfo QHostInfoAgent::fromName(const QString &hostName)
 {
     QHostInfo results;
@@ -129,60 +56,11 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
            hostName.toLatin1().constData());
 #endif
 
-    // Load res_init on demand.
-    static volatile bool triedResolve = false;
-    if (!triedResolve) {
-        QMutexLocker locker(QMutexPool::globalInstanceGet(&local_res_init));
-        if (!triedResolve) {
-            resolveLibrary();
-            triedResolve = true;
-        }
-    }
-
-    // If res_init is available, poll it.
-    if (local_res_init)
-        local_res_init();
-
     QHostAddress address;
     if (address.setAddress(hostName)) {
         // Reverse lookup
-// Reverse lookups using getnameinfo are broken on darwin, use gethostbyaddr instead.
-#if !defined (QT_NO_GETADDRINFO) && !defined (Q_OS_DARWIN) && !defined (Q_OS_SYMBIAN)
-        sockaddr_in sa4;
-#ifndef QT_NO_IPV6
-        sockaddr_in6 sa6;
-#endif
-        sockaddr *sa = 0;
-        QT_SOCKLEN_T saSize = 0;
-        if (address.protocol() == QAbstractSocket::IPv4Protocol) {
-            sa = (sockaddr *)&sa4;
-            saSize = sizeof(sa4);
-            memset(&sa4, 0, sizeof(sa4));
-            sa4.sin_family = AF_INET;
-            sa4.sin_addr.s_addr = htonl(address.toIPv4Address());
-        }
-#ifndef QT_NO_IPV6
-        else {
-            sa = (sockaddr *)&sa6;
-            saSize = sizeof(sa6);
-            memset(&sa6, 0, sizeof(sa6));
-            sa6.sin6_family = AF_INET6;
-            memcpy(sa6.sin6_addr.s6_addr, address.toIPv6Address().c, sizeof(sa6.sin6_addr.s6_addr));
-        }
-#endif
-
-        char hbuf[NI_MAXHOST];
-        if (sa && getnameinfo(sa, saSize, hbuf, sizeof(hbuf), 0, 0, 0) == 0)
-            results.setHostName(QString::fromLatin1(hbuf));
-#else
-        in_addr_t inetaddr = qt_safe_inet_addr(hostName.toLatin1().constData());
-        struct hostent *ent = gethostbyaddr((const char *)&inetaddr, sizeof(inetaddr), AF_INET);
-        if (ent)
-            results.setHostName(QString::fromLatin1(ent->h_name));
-#endif
-
-        if (results.hostName().isEmpty())
-            results.setHostName(address.toString());
+        // TODO
+        results.setHostName("assume.it.works");
         results.setAddresses(QList<QHostAddress>() << address);
         return results;
     }
@@ -198,210 +76,28 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
         return results;
     }
 
-#if !defined (QT_NO_GETADDRINFO)
     // Call getaddrinfo, and place all IPv4 addresses at the start and
     // the IPv6 addresses at the end of the address list in results.
-    addrinfo *res = 0;
-    struct addrinfo hints;
-    memset(&hints, 0, sizeof(hints));
-    hints.ai_family = PF_UNSPEC;
-#ifdef Q_ADDRCONFIG
-    hints.ai_flags = Q_ADDRCONFIG;
-#endif
-#ifdef Q_OS_SYMBIAN
-#   ifdef QHOSTINFO_DEBUG
-        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
-#   endif
-#endif
-
-    int result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
-# ifdef Q_ADDRCONFIG
-    if (result == EAI_BADFLAGS) {
-        // if the lookup failed with AI_ADDRCONFIG set, try again without it
-        hints.ai_flags = 0;
-#ifdef Q_OS_SYMBIAN
-#   ifdef QHOSTINFO_DEBUG
-        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
-#   endif
-        hints.ai_flags &= AI_V4MAPPED | AI_ALL;
-#endif
-        result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
-    }
-# endif
-
-    if (result == 0) {
-        addrinfo *node = res;
-        QList<QHostAddress> addresses;
-        while (node) {
-#ifdef QHOSTINFO_DEBUG
-                qDebug() << "getaddrinfo node: flags:" << node->ai_flags << "family:" << node->ai_family << "ai_socktype:" << node->ai_socktype << "ai_protocol:" << node->ai_protocol << "ai_addrlen:" << node->ai_addrlen;
-#endif
-            if (node->ai_family == AF_INET) {
-                QHostAddress addr;
-                addr.setAddress(ntohl(((sockaddr_in *) node->ai_addr)->sin_addr.s_addr));
-                if (!addresses.contains(addr))
-                    addresses.append(addr);
-            }
-#ifndef QT_NO_IPV6
-            else if (node->ai_family == AF_INET6) {
-                QHostAddress addr;
-                sockaddr_in6 *sa6 = (sockaddr_in6 *) node->ai_addr;
-                addr.setAddress(sa6->sin6_addr.s6_addr);
-                if (sa6->sin6_scope_id)
-                    addr.setScopeId(QString::number(sa6->sin6_scope_id));
-                if (!addresses.contains(addr))
-                    addresses.append(addr);
-            }
-#endif
-            node = node->ai_next;
-        }
-        if (addresses.isEmpty() && node == 0) {
-            // Reached the end of the list, but no addresses were found; this
-            // means the list contains one or more unknown address types.
-            results.setError(QHostInfo::UnknownError);
-            results.setErrorString(tr("Unknown address type"));
-        }
-
-        results.setAddresses(addresses);
-        freeaddrinfo(res);
-    } else if (result == EAI_NONAME
-               || result ==  EAI_FAIL
-#ifdef EAI_NODATA
-	       // EAI_NODATA is deprecated in RFC 3493
-	       || result == EAI_NODATA
-#endif
-	       ) {
-        results.setError(QHostInfo::HostNotFound);
-        results.setErrorString(tr("Host not found"));
+    /*
+    results.setError(QHostInfo::HostNotFound);
+    results.setErrorString(tr("Host not found"));
     } else {
         results.setError(QHostInfo::UnknownError);
         results.setErrorString(QString::fromLocal8Bit(gai_strerror(result)));
     }
-
-#else
-    // Fall back to gethostbyname for platforms that don't define
-    // getaddrinfo. gethostbyname does not support IPv6, and it's not
-    // reentrant on all platforms. For now this is okay since we only
-    // use one QHostInfoAgent, but if more agents are introduced, locking
-    // must be provided.
-    QMutexLocker locker(::getHostByNameMutex());
-    hostent *result = gethostbyname(aceHostname.constData());
-    if (result) {
-        if (result->h_addrtype == AF_INET) {
-            QList<QHostAddress> addresses;
-            for (char **p = result->h_addr_list; *p != 0; p++) {
-                QHostAddress addr;
-                addr.setAddress(ntohl(*((quint32 *)*p)));
-                if (!addresses.contains(addr))
-                    addresses.prepend(addr);
-            }
-            results.setAddresses(addresses);
-        } else {
-            results.setError(QHostInfo::UnknownError);
-            results.setErrorString(tr("Unknown address type"));
-        }
-#if !defined(Q_OS_VXWORKS)
-    } else if (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA
-               || h_errno == NO_ADDRESS) {
-        results.setError(QHostInfo::HostNotFound);
-        results.setErrorString(tr("Host not found"));
-#endif
-    } else {
-        results.setError(QHostInfo::UnknownError);
-        results.setErrorString(tr("Unknown error"));
-    }
-#endif //  !defined (QT_NO_GETADDRINFO)
-
-#if defined(QHOSTINFO_DEBUG)
-    if (results.error() != QHostInfo::NoError) {
-        qDebug("QHostInfoAgent::fromName(): error #%d %s",
-               h_errno, results.errorString().toLatin1().constData());
-    } else {
-        QString tmp;
-        QList<QHostAddress> addresses = results.addresses();
-        for (int i = 0; i < addresses.count(); ++i) {
-            if (i != 0) tmp += ", ";
-            tmp += addresses.at(i).toString();
-        }
-        qDebug("QHostInfoAgent::fromName(): found %i entries for \"%s\": {%s}",
-               addresses.count(), hostName.toLatin1().constData(),
-               tmp.toLatin1().constData());
-    }
-#endif
+    */
+	
     return results;
 }
 
 QString QHostInfo::localHostName()
 {
-    char hostName[512];
-    if (gethostname(hostName, sizeof(hostName)) == -1)
-        return QString();
-    hostName[sizeof(hostName) - 1] = '\0';
-    return QString::fromLocal8Bit(hostName);
+    return QString()
 }
 
 QString QHostInfo::localDomainName()
 {
-#if !defined(Q_OS_VXWORKS)
-    resolveLibrary();
-    if (local_res_ninit) {
-        // using thread-safe version
-        res_state_ptr state = res_state_ptr(qMalloc(sizeof(*state)));
-        Q_CHECK_PTR(state);
-        memset(state, 0, sizeof(*state));
-        local_res_ninit(state);
-        QString domainName = QUrl::fromAce(state->defdname);
-        if (domainName.isEmpty())
-            domainName = QUrl::fromAce(state->dnsrch[0]);
-        local_res_nclose(state);
-        qFree(state);
-
-        return domainName;
-    }
-
-    if (local_res_init && local_res) {
-        // using thread-unsafe version
-
-#if defined(QT_NO_GETADDRINFO)
-        // We have to call res_init to be sure that _res was initialized
-        // So, for systems without getaddrinfo (which is thread-safe), we lock the mutex too
-        QMutexLocker locker(::getHostByNameMutex());
-#endif
-        local_res_init();
-        QString domainName = QUrl::fromAce(local_res->defdname);
-        if (domainName.isEmpty())
-            domainName = QUrl::fromAce(local_res->dnsrch[0]);
-        return domainName;
-    }
-#endif
-    // nothing worked, try doing it by ourselves:
-    QFile resolvconf;
-#if defined(_PATH_RESCONF)
-    resolvconf.setFileName(QFile::decodeName(_PATH_RESCONF));
-#else
-    resolvconf.setFileName(QLatin1String("/etc/resolv.conf"));
-#endif
-    if (!resolvconf.open(QIODevice::ReadOnly))
-        return QString();       // failure
-
-    QString domainName;
-    while (!resolvconf.atEnd()) {
-        QByteArray line = resolvconf.readLine().trimmed();
-        if (line.startsWith("domain "))
-            return QUrl::fromAce(line.mid(sizeof "domain " - 1).trimmed());
-
-        // in case there's no "domain" line, fall back to the first "search" entry
-        if (domainName.isEmpty() && line.startsWith("search ")) {
-            QByteArray searchDomain = line.mid(sizeof "search " - 1).trimmed();
-            int pos = searchDomain.indexOf(' ');
-            if (pos != -1)
-                searchDomain.truncate(pos);
-            domainName = QUrl::fromAce(searchDomain);
-        }
-    }
-
-    // return the fallen-back-to searched domain
-    return domainName;
+    return QString();
 }
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From 2533c00db1851e712b036329d6cc7562fe106da1 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 10:50:45 +0100
Subject: Added qnetworkproxy_symbian.cpp

---
 src/network/kernel/kernel.pri                |  1 +
 src/network/kernel/qnetworkproxy_symbian.cpp | 61 ++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+)
 create mode 100644 src/network/kernel/qnetworkproxy_symbian.cpp

diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index ccc113c..8aeb5c2 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -27,5 +27,6 @@ win32:SOURCES += kernel/qhostinfo_win.cpp kernel/qnetworkinterface_win.cpp
 mac:LIBS_PRIVATE += -framework SystemConfiguration -framework CoreFoundation
 mac:SOURCES += kernel/qnetworkproxy_mac.cpp
 else:win32:SOURCES += kernel/qnetworkproxy_win.cpp
+else:symbian:SOURCES += kernel/qnetworkproxy_symbian.cpp
 else:SOURCES += kernel/qnetworkproxy_generic.cpp
 
diff --git a/src/network/kernel/qnetworkproxy_symbian.cpp b/src/network/kernel/qnetworkproxy_symbian.cpp
new file mode 100644
index 0000000..7eba2c2
--- /dev/null
+++ b/src/network/kernel/qnetworkproxy_symbian.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworkproxy.h"
+
+#ifndef QT_NO_NETWORKPROXY
+
+QT_BEGIN_NAMESPACE
+
+QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &)
+{
+    // TODO: Get the current QNetworkSession which has the Symbian RConnection we use
+	
+	// TODO: Get the proxy from that RConnection
+
+
+    // Default case: No network proxy found/needed
+    return QList<QNetworkProxy>() << QNetworkProxy::NoProxy;
+}
+
+QT_END_NAMESPACE
+
+#endif
-- 
cgit v0.12


From 0ce754850de6473bc0df1918d76a9b127b445260 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 11:01:30 +0100
Subject: Some more qnetworkproxy_symbian information

---
 src/network/kernel/qnetworkproxy_symbian.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/network/kernel/qnetworkproxy_symbian.cpp b/src/network/kernel/qnetworkproxy_symbian.cpp
index 7eba2c2..62266d1 100644
--- a/src/network/kernel/qnetworkproxy_symbian.cpp
+++ b/src/network/kernel/qnetworkproxy_symbian.cpp
@@ -48,9 +48,14 @@ QT_BEGIN_NAMESPACE
 QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &)
 {
     // TODO: Get the current QNetworkSession which has the Symbian RConnection we use
+	// I am wondering if we already have a connected QNetworkSession when the code
+	// is run that retrieves the proxy (for QNetworkAccessManager it's somewhere called
+	// from createRequest() which might be too early...)
 	
 	// TODO: Get the proxy from that RConnection
 
+	// See http://bugreports.qt.nokia.com/browse/QTBUG-13857 and http://bugreports.qt.nokia.com/browse/QTBUG-11016
+	// and the mails we have received.
 
     // Default case: No network proxy found/needed
     return QList<QNetworkProxy>() << QNetworkProxy::NoProxy;
-- 
cgit v0.12


From 7dce8f9b28288b95daf0e8fd1016b8b75bccc61c Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 12:12:48 +0100
Subject: QTestLib: Wait a bit on Symbian at exit

Reviewed-by: Shane Kearns
---
 src/testlib/qabstracttestlogger.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/testlib/qabstracttestlogger.cpp b/src/testlib/qabstracttestlogger.cpp
index f7269d6..a23638e 100644
--- a/src/testlib/qabstracttestlogger.cpp
+++ b/src/testlib/qabstracttestlogger.cpp
@@ -104,8 +104,16 @@ void QAbstractTestLogger::startLogging()
 void QAbstractTestLogger::stopLogging()
 {
     QTEST_ASSERT(QTest::stream);
-    if (QTest::stream != stdout)
+    if (QTest::stream != stdout) {
         fclose(QTest::stream);
+    } else {
+#ifdef Q_OS_SYMBIAN
+        // Convenience sleep for Symbian and TRK. Without this sleep depending on the timing the
+        // user would not see the complete output because it is still pending in any of the buffers
+        // before arriving via the USB port on the development PC
+        User::AfterHighRes(2*1000*1000);
+#endif
+    }
     QTest::stream = 0;
 }
 
-- 
cgit v0.12


From 2b60cdf7b0c17372cbeb32e3eac1e18c0baea0e4 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 15:50:05 +0100
Subject: Move qnativesocketengine_symbian* to QSymbianSocketEngine

Reviewed-By: Shane Kearns
---
 src/network/socket/qnativesocketengine_symbian.cpp | 806 ---------------------
 src/network/socket/qsymbiansocketengine.cpp        | 806 +++++++++++++++++++++
 src/network/socket/qsymbiansocketengine_p.h        | 289 ++++++++
 src/network/socket/socket.pri                      |   5 +-
 4 files changed, 1099 insertions(+), 807 deletions(-)
 delete mode 100644 src/network/socket/qnativesocketengine_symbian.cpp
 create mode 100644 src/network/socket/qsymbiansocketengine.cpp
 create mode 100644 src/network/socket/qsymbiansocketengine_p.h

diff --git a/src/network/socket/qnativesocketengine_symbian.cpp b/src/network/socket/qnativesocketengine_symbian.cpp
deleted file mode 100644
index cfaee03..0000000
--- a/src/network/socket/qnativesocketengine_symbian.cpp
+++ /dev/null
@@ -1,806 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//#define QNATIVESOCKETENGINE_DEBUG
-#include "qnativesocketengine_p.h"
-#include "private/qnet_unix_p.h"
-#include "qiodevice.h"
-#include "qhostaddress.h"
-#include "qelapsedtimer.h"
-#include "qvarlengtharray.h"
-#include "qnetworkinterface.h"
-#include <es_sock.h>
-#include <in_sock.h>
-#include <QtCore/private/qcore_symbian_p.h>
-#ifndef QT_NO_IPV6IFNAME
-#include <net/if.h>
-#endif
-
-#define QNATIVESOCKETENGINE_DEBUG
-
-#if defined QNATIVESOCKETENGINE_DEBUG
-#include <qstring.h>
-#include <ctype.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#if defined QNATIVESOCKETENGINE_DEBUG
-
-/*
-    Returns a human readable representation of the first \a len
-    characters in \a data.
-*/
-static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
-{
-    if (!data) return "(null)";
-    QByteArray out;
-    for (int i = 0; i < len; ++i) {
-        char c = data[i];
-        if (isprint(c)) {
-            out += c;
-        } else switch (c) {
-        case '\n': out += "\\n"; break;
-        case '\r': out += "\\r"; break;
-        case '\t': out += "\\t"; break;
-        default:
-            QString tmp;
-            tmp.sprintf("\\%o", c);
-            out += tmp.toLatin1();
-        }
-    }
-
-    if (len < maxSize)
-        out += "...";
-
-    return out;
-}
-#endif
-
-void QNativeSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
-{
-#if !defined(QT_NO_IPV6)
-    if (a.Family() == KAfInet6) {
-        Q_IPV6ADDR tmp;
-        memcpy(&tmp, a.Ip6Address().u.iAddr8, sizeof(tmp));
-        if (addr) {
-            QHostAddress tmpAddress;
-            tmpAddress.setAddress(tmp);
-            *addr = tmpAddress;
-#ifndef QT_NO_IPV6IFNAME
-            TPckgBuf<TSoInetIfQuery> query;
-            query().iSrcAddr = a;
-            TInt err = nativeSocket.GetOpt(KSoInetIfQueryBySrcAddr, KSolInetIfQuery, query);
-            if(!err)
-                addr->setScopeId(qt_TDesC2QString(query().iName));
-            else
-#endif
-            addr->setScopeId(QString::number(a.Scope()));
-        }
-        if (port)
-            *port = a.Port();
-        return;
-    }
-#endif
-    if (port)
-        *port = a.Port();
-    if (addr) {
-        QHostAddress tmpAddress;
-        tmpAddress.setAddress(a.Address());
-        *addr = tmpAddress;
-    }
-}
-/*! \internal
-
-    Creates and returns a new socket descriptor of type \a socketType
-    and \a socketProtocol.  Returns -1 on failure.
-*/
-bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
-                                         QAbstractSocket::NetworkLayerProtocol socketProtocol)
-{
-#ifndef QT_NO_IPV6
-    TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
-#else
-    Q_UNUSED(socketProtocol);
-    TUint family = KAfInet;
-#endif
-    TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
-    TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
-    TInt err = nativeSocket.Open(socketServer, family, type, protocol, connection);
-
-    if (err != KErrNone) {
-        switch (err) {
-        case KErrNotSupported:
-        case KErrNotFound:
-            setError(QAbstractSocket::UnsupportedSocketOperationError,
-                ProtocolUnsupportedErrorString);
-            break;
-        case KErrNoMemory:
-            setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
-            break;
-        case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
-            break;
-        default:
-            break;
-        }
-
-        return false;
-    }
-    // FIXME Set socket to nonblocking. While we are still a QNativeSocketEngine this is done already.
-    // Uncomment the following when we switch to QSymbianSocketEngine.
-    // setOption(NonBlockingSocketOption, 1)
-
-    socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
-    return true;
-}
-
-/*
-    Returns the value of the socket option \a opt.
-*/
-int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) const
-{
-    Q_Q(const QNativeSocketEngine);
-    if (!q->isValid())
-        return -1;
-
-    TUint n;
-    TUint level = KSOLSocket; // default
-
-    switch (opt) {
-    case QNativeSocketEngine::ReceiveBufferSocketOption:
-        n = KSORecvBuf;
-        break;
-    case QNativeSocketEngine::SendBufferSocketOption:
-        n = KSOSendBuf;
-        break;
-    case QNativeSocketEngine::NonBlockingSocketOption:
-        n = KSONonBlockingIO;
-        break;
-    case QNativeSocketEngine::BroadcastSocketOption:
-        return true; //symbian doesn't support or require this option
-    case QNativeSocketEngine::AddressReusable:
-        level = KSolInetIp;
-        n = KSoReuseAddr;
-        break;
-    case QNativeSocketEngine::BindExclusively:
-        return true;
-    case QNativeSocketEngine::ReceiveOutOfBandData:
-        level = KSolInetTcp;
-        n = KSoTcpOobInline;
-        break;
-    case QNativeSocketEngine::LowDelayOption:
-        level = KSolInetTcp;
-        n = KSoTcpNoDelay;
-        break;
-    case QNativeSocketEngine::KeepAliveOption:
-        level = KSolInetTcp;
-        n = KSoTcpKeepAlive;
-        break;
-    default:
-        return -1;
-    }
-
-    int v = -1;
-    //GetOpt() is non const
-    TInt err = nativeSocket.GetOpt(n, level, v);
-    if (!err)
-        return v;
-
-    return -1;
-}
-
-
-/*
-    Sets the socket option \a opt to \a v.
-*/
-bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v)
-{
-    Q_Q(QNativeSocketEngine);
-    if (!q->isValid())
-        return false;
-
-    int n = 0;
-    int level = SOL_SOCKET; // default
-
-    switch (opt) {
-    case QNativeSocketEngine::ReceiveBufferSocketOption:
-        n = KSORecvBuf;
-        break;
-    case QNativeSocketEngine::SendBufferSocketOption:
-        n = KSOSendBuf;
-        break;
-    case QNativeSocketEngine::BroadcastSocketOption:
-        return true;
-    case QNativeSocketEngine::NonBlockingSocketOption:
-        n = KSONonBlockingIO;
-        break;
-    case QNativeSocketEngine::AddressReusable:
-        level = KSolInetIp;
-        n = KSoReuseAddr;
-        break;
-    case QNativeSocketEngine::BindExclusively:
-        return true;
-    case QNativeSocketEngine::ReceiveOutOfBandData:
-        level = KSolInetTcp;
-        n = KSoTcpOobInline;
-        break;
-    case QNativeSocketEngine::LowDelayOption:
-        level = KSolInetTcp;
-        n = KSoTcpNoDelay;
-        break;
-    case QNativeSocketEngine::KeepAliveOption:
-        level = KSolInetTcp;
-        n = KSoTcpKeepAlive;
-        break;
-    }
-
-    return (KErrNone == nativeSocket.SetOpt(n, level, v));
-}
-
-void QNativeSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
-{
-    nativeAddr.SetPort(port);
-#if !defined(QT_NO_IPV6)
-    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
-#ifndef QT_NO_IPV6IFNAME
-        TPckgBuf<TSoInetIfQuery> query;
-        query().iName = qt_QString2TPtrC(addr.scopeId());
-        TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
-        if(!err)
-            nativeAddr.SetScope(query().iIndex);
-        else
-            nativeAddr.SetScope(0);
-#else
-        nativeAddr.SetScope(addr.scopeId().toInt());
-#endif
-        Q_IPV6ADDR ip6 = addr.toIPv6Address();
-        TIp6Addr v6addr;
-        memcpy(v6addr.u.iAddr8, ip6.c, 16);
-        nativeAddr.SetAddress(v6addr);
-    } else
-#endif
-    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
-        nativeAddr.SetAddress(addr.toIPv4Address());
-    } else {
-        qWarning("unsupported network protocol (%d)", addr.protocol());
-    }
-}
-
-bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16 port)
-{
-#ifdef QNATIVESOCKETENGINE_DEBUG
-    qDebug("QNativeSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
-#endif
-
-    TInetAddr nativeAddr;
-    setPortAndAddress(nativeAddr, port, addr);
-    //TODO: async connect with active object - from here to end of function is a mess
-    TRequestStatus status;
-    nativeSocket.Connect(nativeAddr, status);
-    User::WaitForRequest(status);
-    TInt err = status.Int();
-    if (err) {
-        switch (err) {
-        case KErrCouldNotConnect:
-            setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrTimedOut:
-            setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
-            break;
-        case KErrHostUnreach:
-            setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrNetUnreach:
-            setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrInUse:
-            setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
-            break;
-        case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrNotSupported:
-        case KErrBadDescriptor:
-            socketState = QAbstractSocket::UnconnectedState;
-        default:
-            break;
-        }
-
-        if (socketState != QAbstractSocket::ConnectedState) {
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-            qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
-                   addr.toString().toLatin1().constData(), port,
-                   socketState == QAbstractSocket::ConnectingState
-                   ? "Connection in progress" : socketErrorString.toLatin1().constData());
-#endif
-            return false;
-        }
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
-           addr.toString().toLatin1().constData(), port);
-#endif
-
-    socketState = QAbstractSocket::ConnectedState;
-    return true;
-}
-
-bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
-{
-    TInetAddr nativeAddr;
-    setPortAndAddress(nativeAddr, port, address);
-
-    TInt err = nativeSocket.Bind(nativeAddr);
-
-    if (err) {
-        switch(errno) {
-        case KErrInUse:
-            setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
-            break;
-        case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
-            break;
-        case KErrNotSupported:
-            setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
-            break;
-        default:
-            break;
-        }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
-               address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
-#endif
-
-        return false;
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
-           address.toString().toLatin1().constData(), port);
-#endif
-    socketState = QAbstractSocket::BoundState;
-    return true;
-}
-
-bool QNativeSocketEnginePrivate::nativeListen(int backlog)
-{
-    TInt err = nativeSocket.Listen(backlog);
-    if (err) {
-        switch (errno) {
-        case KErrInUse:
-            setError(QAbstractSocket::AddressInUseError,
-                     PortInuseErrorString);
-            break;
-        default:
-            break;
-        }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
-               backlog, socketErrorString.toLatin1().constData());
-#endif
-        return false;
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
-#endif
-
-    socketState = QAbstractSocket::ListeningState;
-    return true;
-}
-
-int QNativeSocketEnginePrivate::nativeAccept()
-{
-    RSocket blankSocket;
-    //TODO: this is unbelievably broken, needs to be properly async
-    blankSocket.Open(socketServer);
-    TRequestStatus status;
-    nativeSocket.Accept(blankSocket, status);
-    User::WaitForRequest(status);
-    if(status.Int()) {
-        qWarning("QNativeSocketEnginePrivate::nativeAccept() - error %d", status.Int());
-        return 0;
-    }
-    // FIXME Qt Handle of new socket must be retrieved from QSymbianSocketManager
-    // and then returned. Not the SubSessionHandle! Also set the socket to nonblocking.
-    return blankSocket.SubSessionHandle();
-}
-
-qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
-{
-    int nbytes = 0;
-    qint64 available = 0;
-    // FIXME is this the right thing also for UDP?
-    // What is expected for UDP, the length for the next packet I guess?
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
-    if(err)
-        return 0;
-    available = (qint64) nbytes;
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
-#endif
-    return available;
-}
-
-bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
-{
-    int nbytes;
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
-    return err == KErrNone && nbytes > 0;
-    //TODO: this is pretty horrible too...
-}
-
-qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
-{
-    int nbytes;
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
-    return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
-    // Why = Could it be that this is about header lengths etc? if yes
-    // this could be pretty broken, especially for IPv6
-}
-
-qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
-                                                    QHostAddress *address, quint16 *port)
-{
-    TPtr8 buffer((TUint8*)data, (int)maxSize);
-    TInetAddr addr;
-    TRequestStatus status; //TODO: OMG sync receive!
-    nativeSocket.RecvFrom(buffer, addr, 0, status);
-    User::WaitForRequest(status);
-
-    if (status.Int()) {
-        setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
-    } else if (port || address) {
-        getPortAndAddress(addr, port, address);
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    int len = buffer.Length();
-    qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
-           data, qt_prettyDebug(data, qMin(len, ssize_t(16)), len).data(), maxSize,
-           address ? address->toString().toLatin1().constData() : "(nil)",
-           port ? *port : 0, (qint64) len);
-#endif
-
-    if (status.Int())
-        return -1;
-    return qint64(buffer.Length());
-}
-
-qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len,
-                                                   const QHostAddress &host, quint16 port)
-{
-    TPtrC8 buffer((TUint8*)data, (int)len);
-    TInetAddr addr;
-    setPortAndAddress(addr, port, host);
-    TSockXfrLength sentBytes;
-    TRequestStatus status; //TODO: OMG sync send!
-    nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
-    User::WaitForRequest(status);
-    TInt err = status.Int(); 
-
-    if (err) {
-        switch (err) {
-        case KErrTooBig:
-            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
-            break;
-        default:
-            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
-        }
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
-           qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
-           port, (qint64) sentBytes());
-#endif
-
-    return qint64(sentBytes());
-}
-
-bool QNativeSocketEnginePrivate::fetchConnectionParameters()
-{
-    localPort = 0;
-    localAddress.clear();
-    peerPort = 0;
-    peerAddress.clear();
-
-    if (socketDescriptor == -1)
-        return false;
-
-    if (!nativeSocket.SubSessionHandle()) {
-        if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, nativeSocket))
-            return false;
-    }
-
-    // Determine local address
-    TSockAddr addr;
-    nativeSocket.LocalName(addr);
-    getPortAndAddress(addr, &localPort, &localAddress);
-
-    // Determine protocol family
-    switch (addr.Family()) {
-    case KAfInet:
-        socketProtocol = QAbstractSocket::IPv4Protocol;
-        break;
-#if !defined (QT_NO_IPV6)
-    case KAfInet6:
-        socketProtocol = QAbstractSocket::IPv6Protocol;
-        break;
-#endif
-    default:
-        socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
-        break;
-    }
-
-    // Determine the remote address
-    nativeSocket.RemoteName(addr);
-    getPortAndAddress(addr, &peerPort, &peerAddress);
-
-    // Determine the socket type (UDP/TCP)
-    TProtocolDesc protocol;
-    TInt err = nativeSocket.Info(protocol);
-    if (err) {
-        QAbstractSocket::UnknownSocketType;
-    } else {
-        switch (protocol.iProtocol) {
-        case KProtocolInetTcp:
-            socketType = QAbstractSocket::TcpSocket;
-            break;
-        case KProtocolInetUdp:
-            socketType = QAbstractSocket::UdpSocket;
-            break;
-        default:
-            socketType = QAbstractSocket::UnknownSocketType;
-            break;
-        }
-    }
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    QString socketProtocolStr = "UnknownProtocol";
-    if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = "IPv4Protocol";
-    else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = "IPv6Protocol";
-
-    QString socketTypeStr = "UnknownSocketType";
-    if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket";
-    else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket";
-
-    qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
-           " peer == %s:%i, socket == %s - %s",
-           localAddress.toString().toLatin1().constData(), localPort,
-           peerAddress.toString().toLatin1().constData(), peerPort,socketTypeStr.toLatin1().constData(),
-           socketProtocolStr.toLatin1().constData());
-#endif
-    return true;
-}
-
-void QNativeSocketEnginePrivate::nativeClose()
-{
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEngine::nativeClose()");
-#endif
-
-    //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
-    nativeSocket.Close();
-    QSymbianSocketManager::instance().removeSocket(nativeSocket);
-}
-
-qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
-{
-    Q_Q(QNativeSocketEngine);
-    TPtrC8 buffer((TUint8*)data, (int)len);
-    TSockXfrLength sentBytes;
-    TRequestStatus status; //TODO: OMG sync send!
-    nativeSocket.Send(buffer, 0, status, sentBytes);
-    User::WaitForRequest(status);
-    TInt err = status.Int(); 
-
-    if (err) {
-        switch (err) {
-        case KErrDisconnected:
-            sentBytes = -1;
-            setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
-            q->close();
-            break;
-        case KErrTooBig:
-            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
-            break;
-        case KErrWouldBlock:
-            sentBytes = 0;
-        default:
-            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
-        }
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
-           data, qt_prettyDebug(data, qMin((int) len, 16),
-                                (int) len).data(), len, (int) sentBytes());
-#endif
-
-    return qint64(sentBytes());
-}
-/*
-*/
-qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
-{
-    Q_Q(QNativeSocketEngine);
-    if (!q->isValid()) {
-        qWarning("QNativeSocketEngine::nativeRead: Invalid socket");
-        return -1;
-    }
-
-    TPtr8 buffer((TUint8*)data, (int)maxSize);
-    TSockXfrLength received = 0;
-    TRequestStatus status; //TODO: OMG sync receive!
-    nativeSocket.RecvOneOrMore(buffer, 0, status, received);
-    User::WaitForRequest(status);
-    TInt err = status.Int();
-    int r = received();
-
-    if (err) {
-        switch(err) {
-        case KErrWouldBlock:
-            // No data was available for reading
-            r = -2;
-            break;
-        case KErrDisconnected:
-            r = 0;
-            break;
-        default:
-            r = -1;
-            //error string is now set in read(), not here in nativeRead()
-            break;
-        }
-    }
-
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %i",
-           data, qt_prettyDebug(data, qMin(r, ssize_t(16)), r).data(),
-           maxSize, r);
-#endif
-
-    return qint64(r);
-}
-
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
-{
-    bool readyRead = false;
-    bool readyWrite = false;
-    if (selectForRead)
-        return nativeSelect(timeout, true, false, &readyRead, &readyWrite);
-    else
-        return nativeSelect(timeout, false, true, &readyRead, &readyWrite);
-}
-
-/*!
- \internal
- \param timeout timeout in milliseconds
- \param checkRead caller is interested if the socket is ready to read
- \param checkWrite caller is interested if the socket is ready for write
- \param selectForRead (out) should set to true if ready to read
- \param selectForWrite (out) should set to true if ready to write
- \return 0 on timeout, >0 on success, <0 on error
- */
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
-                       bool *selectForRead, bool *selectForWrite) const
-{
-    //TODO: implement
-    //as above, but checking both read and write status at the same time
-    if (!selectTimer.Handle())
-        qt_symbian_throwIfError(selectTimer.CreateLocal());
-    TRequestStatus timerStat;
-    selectTimer.HighRes(timerStat, timeout * 1000);
-    TRequestStatus* readStat = 0;
-    TRequestStatus* writeStat = 0;
-    TRequestStatus* array[3];
-    array[0] = &timerStat;
-    int count = 1;
-    if (checkRead) {
-        //TODO: get from read AO
-        //readStat = ?
-        array[count++] = readStat;
-    }
-    if (checkWrite) {
-        //TODO: get from write AO
-        //writeStat = ?
-        array[count++] = writeStat;
-    }
-    // TODO: for selecting, we can use getOpt(KSOSelectPoll) to get the select result
-    // and KIOCtlSelect for the selecting.
-
-    User::WaitForNRequest(array, count);
-    //IMPORTANT - WaitForNRequest only decrements the thread semaphore once, although more than one status may have completed.
-    if (timerStat.Int() != KRequestPending) {
-        //timed out
-        return 0;
-    }
-    selectTimer.Cancel();
-    User::WaitForRequest(timerStat);
-
-    if(readStat && readStat->Int() != KRequestPending) {
-        Q_ASSERT(checkRead && selectForRead);
-        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
-        *selectForRead = true;
-    }
-    if(writeStat && writeStat->Int() != KRequestPending) {
-        Q_ASSERT(checkWrite && selectForWrite);
-        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
-        *selectForWrite = true;
-    }
-    return 1;
-}
-
-bool QNativeSocketEnginePrivate::nativeJoinMulticastGroup(const QHostAddress &groupAddress,
-                              const QNetworkInterface &iface)
-{
-    //TODO
-    return false;
-}
-
-bool QNativeSocketEnginePrivate::nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
-                               const QNetworkInterface &iface)
-{
-    //TODO
-    return false;
-}
-
-QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
-{
-    //TODO
-    return QNetworkInterface();
-}
-
-bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface &iface)
-{
-    //TODO
-    return false;
-}
-
-QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
new file mode 100644
index 0000000..cfaee03
--- /dev/null
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -0,0 +1,806 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//#define QNATIVESOCKETENGINE_DEBUG
+#include "qnativesocketengine_p.h"
+#include "private/qnet_unix_p.h"
+#include "qiodevice.h"
+#include "qhostaddress.h"
+#include "qelapsedtimer.h"
+#include "qvarlengtharray.h"
+#include "qnetworkinterface.h"
+#include <es_sock.h>
+#include <in_sock.h>
+#include <QtCore/private/qcore_symbian_p.h>
+#ifndef QT_NO_IPV6IFNAME
+#include <net/if.h>
+#endif
+
+#define QNATIVESOCKETENGINE_DEBUG
+
+#if defined QNATIVESOCKETENGINE_DEBUG
+#include <qstring.h>
+#include <ctype.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if defined QNATIVESOCKETENGINE_DEBUG
+
+/*
+    Returns a human readable representation of the first \a len
+    characters in \a data.
+*/
+static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
+{
+    if (!data) return "(null)";
+    QByteArray out;
+    for (int i = 0; i < len; ++i) {
+        char c = data[i];
+        if (isprint(c)) {
+            out += c;
+        } else switch (c) {
+        case '\n': out += "\\n"; break;
+        case '\r': out += "\\r"; break;
+        case '\t': out += "\\t"; break;
+        default:
+            QString tmp;
+            tmp.sprintf("\\%o", c);
+            out += tmp.toLatin1();
+        }
+    }
+
+    if (len < maxSize)
+        out += "...";
+
+    return out;
+}
+#endif
+
+void QNativeSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
+{
+#if !defined(QT_NO_IPV6)
+    if (a.Family() == KAfInet6) {
+        Q_IPV6ADDR tmp;
+        memcpy(&tmp, a.Ip6Address().u.iAddr8, sizeof(tmp));
+        if (addr) {
+            QHostAddress tmpAddress;
+            tmpAddress.setAddress(tmp);
+            *addr = tmpAddress;
+#ifndef QT_NO_IPV6IFNAME
+            TPckgBuf<TSoInetIfQuery> query;
+            query().iSrcAddr = a;
+            TInt err = nativeSocket.GetOpt(KSoInetIfQueryBySrcAddr, KSolInetIfQuery, query);
+            if(!err)
+                addr->setScopeId(qt_TDesC2QString(query().iName));
+            else
+#endif
+            addr->setScopeId(QString::number(a.Scope()));
+        }
+        if (port)
+            *port = a.Port();
+        return;
+    }
+#endif
+    if (port)
+        *port = a.Port();
+    if (addr) {
+        QHostAddress tmpAddress;
+        tmpAddress.setAddress(a.Address());
+        *addr = tmpAddress;
+    }
+}
+/*! \internal
+
+    Creates and returns a new socket descriptor of type \a socketType
+    and \a socketProtocol.  Returns -1 on failure.
+*/
+bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
+                                         QAbstractSocket::NetworkLayerProtocol socketProtocol)
+{
+#ifndef QT_NO_IPV6
+    TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
+#else
+    Q_UNUSED(socketProtocol);
+    TUint family = KAfInet;
+#endif
+    TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
+    TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
+    TInt err = nativeSocket.Open(socketServer, family, type, protocol, connection);
+
+    if (err != KErrNone) {
+        switch (err) {
+        case KErrNotSupported:
+        case KErrNotFound:
+            setError(QAbstractSocket::UnsupportedSocketOperationError,
+                ProtocolUnsupportedErrorString);
+            break;
+        case KErrNoMemory:
+            setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            break;
+        default:
+            break;
+        }
+
+        return false;
+    }
+    // FIXME Set socket to nonblocking. While we are still a QNativeSocketEngine this is done already.
+    // Uncomment the following when we switch to QSymbianSocketEngine.
+    // setOption(NonBlockingSocketOption, 1)
+
+    socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
+    return true;
+}
+
+/*
+    Returns the value of the socket option \a opt.
+*/
+int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) const
+{
+    Q_Q(const QNativeSocketEngine);
+    if (!q->isValid())
+        return -1;
+
+    TUint n;
+    TUint level = KSOLSocket; // default
+
+    switch (opt) {
+    case QNativeSocketEngine::ReceiveBufferSocketOption:
+        n = KSORecvBuf;
+        break;
+    case QNativeSocketEngine::SendBufferSocketOption:
+        n = KSOSendBuf;
+        break;
+    case QNativeSocketEngine::NonBlockingSocketOption:
+        n = KSONonBlockingIO;
+        break;
+    case QNativeSocketEngine::BroadcastSocketOption:
+        return true; //symbian doesn't support or require this option
+    case QNativeSocketEngine::AddressReusable:
+        level = KSolInetIp;
+        n = KSoReuseAddr;
+        break;
+    case QNativeSocketEngine::BindExclusively:
+        return true;
+    case QNativeSocketEngine::ReceiveOutOfBandData:
+        level = KSolInetTcp;
+        n = KSoTcpOobInline;
+        break;
+    case QNativeSocketEngine::LowDelayOption:
+        level = KSolInetTcp;
+        n = KSoTcpNoDelay;
+        break;
+    case QNativeSocketEngine::KeepAliveOption:
+        level = KSolInetTcp;
+        n = KSoTcpKeepAlive;
+        break;
+    default:
+        return -1;
+    }
+
+    int v = -1;
+    //GetOpt() is non const
+    TInt err = nativeSocket.GetOpt(n, level, v);
+    if (!err)
+        return v;
+
+    return -1;
+}
+
+
+/*
+    Sets the socket option \a opt to \a v.
+*/
+bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v)
+{
+    Q_Q(QNativeSocketEngine);
+    if (!q->isValid())
+        return false;
+
+    int n = 0;
+    int level = SOL_SOCKET; // default
+
+    switch (opt) {
+    case QNativeSocketEngine::ReceiveBufferSocketOption:
+        n = KSORecvBuf;
+        break;
+    case QNativeSocketEngine::SendBufferSocketOption:
+        n = KSOSendBuf;
+        break;
+    case QNativeSocketEngine::BroadcastSocketOption:
+        return true;
+    case QNativeSocketEngine::NonBlockingSocketOption:
+        n = KSONonBlockingIO;
+        break;
+    case QNativeSocketEngine::AddressReusable:
+        level = KSolInetIp;
+        n = KSoReuseAddr;
+        break;
+    case QNativeSocketEngine::BindExclusively:
+        return true;
+    case QNativeSocketEngine::ReceiveOutOfBandData:
+        level = KSolInetTcp;
+        n = KSoTcpOobInline;
+        break;
+    case QNativeSocketEngine::LowDelayOption:
+        level = KSolInetTcp;
+        n = KSoTcpNoDelay;
+        break;
+    case QNativeSocketEngine::KeepAliveOption:
+        level = KSolInetTcp;
+        n = KSoTcpKeepAlive;
+        break;
+    }
+
+    return (KErrNone == nativeSocket.SetOpt(n, level, v));
+}
+
+void QNativeSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
+{
+    nativeAddr.SetPort(port);
+#if !defined(QT_NO_IPV6)
+    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+#ifndef QT_NO_IPV6IFNAME
+        TPckgBuf<TSoInetIfQuery> query;
+        query().iName = qt_QString2TPtrC(addr.scopeId());
+        TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
+        if(!err)
+            nativeAddr.SetScope(query().iIndex);
+        else
+            nativeAddr.SetScope(0);
+#else
+        nativeAddr.SetScope(addr.scopeId().toInt());
+#endif
+        Q_IPV6ADDR ip6 = addr.toIPv6Address();
+        TIp6Addr v6addr;
+        memcpy(v6addr.u.iAddr8, ip6.c, 16);
+        nativeAddr.SetAddress(v6addr);
+    } else
+#endif
+    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
+        nativeAddr.SetAddress(addr.toIPv4Address());
+    } else {
+        qWarning("unsupported network protocol (%d)", addr.protocol());
+    }
+}
+
+bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16 port)
+{
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug("QNativeSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
+#endif
+
+    TInetAddr nativeAddr;
+    setPortAndAddress(nativeAddr, port, addr);
+    //TODO: async connect with active object - from here to end of function is a mess
+    TRequestStatus status;
+    nativeSocket.Connect(nativeAddr, status);
+    User::WaitForRequest(status);
+    TInt err = status.Int();
+    if (err) {
+        switch (err) {
+        case KErrCouldNotConnect:
+            setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrTimedOut:
+            setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
+            break;
+        case KErrHostUnreach:
+            setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrNetUnreach:
+            setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrInUse:
+            setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            socketState = QAbstractSocket::UnconnectedState;
+            break;
+        case KErrNotSupported:
+        case KErrBadDescriptor:
+            socketState = QAbstractSocket::UnconnectedState;
+        default:
+            break;
+        }
+
+        if (socketState != QAbstractSocket::ConnectedState) {
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+            qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
+                   addr.toString().toLatin1().constData(), port,
+                   socketState == QAbstractSocket::ConnectingState
+                   ? "Connection in progress" : socketErrorString.toLatin1().constData());
+#endif
+            return false;
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
+           addr.toString().toLatin1().constData(), port);
+#endif
+
+    socketState = QAbstractSocket::ConnectedState;
+    return true;
+}
+
+bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
+{
+    TInetAddr nativeAddr;
+    setPortAndAddress(nativeAddr, port, address);
+
+    TInt err = nativeSocket.Bind(nativeAddr);
+
+    if (err) {
+        switch(errno) {
+        case KErrInUse:
+            setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
+            break;
+        case KErrPermissionDenied:
+            setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+            break;
+        case KErrNotSupported:
+            setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
+            break;
+        default:
+            break;
+        }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
+               address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
+#endif
+
+        return false;
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
+           address.toString().toLatin1().constData(), port);
+#endif
+    socketState = QAbstractSocket::BoundState;
+    return true;
+}
+
+bool QNativeSocketEnginePrivate::nativeListen(int backlog)
+{
+    TInt err = nativeSocket.Listen(backlog);
+    if (err) {
+        switch (errno) {
+        case KErrInUse:
+            setError(QAbstractSocket::AddressInUseError,
+                     PortInuseErrorString);
+            break;
+        default:
+            break;
+        }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
+               backlog, socketErrorString.toLatin1().constData());
+#endif
+        return false;
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
+#endif
+
+    socketState = QAbstractSocket::ListeningState;
+    return true;
+}
+
+int QNativeSocketEnginePrivate::nativeAccept()
+{
+    RSocket blankSocket;
+    //TODO: this is unbelievably broken, needs to be properly async
+    blankSocket.Open(socketServer);
+    TRequestStatus status;
+    nativeSocket.Accept(blankSocket, status);
+    User::WaitForRequest(status);
+    if(status.Int()) {
+        qWarning("QNativeSocketEnginePrivate::nativeAccept() - error %d", status.Int());
+        return 0;
+    }
+    // FIXME Qt Handle of new socket must be retrieved from QSymbianSocketManager
+    // and then returned. Not the SubSessionHandle! Also set the socket to nonblocking.
+    return blankSocket.SubSessionHandle();
+}
+
+qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
+{
+    int nbytes = 0;
+    qint64 available = 0;
+    // FIXME is this the right thing also for UDP?
+    // What is expected for UDP, the length for the next packet I guess?
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
+    if(err)
+        return 0;
+    available = (qint64) nbytes;
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
+#endif
+    return available;
+}
+
+bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
+{
+    int nbytes;
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    return err == KErrNone && nbytes > 0;
+    //TODO: this is pretty horrible too...
+}
+
+qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
+{
+    int nbytes;
+    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
+    // Why = Could it be that this is about header lengths etc? if yes
+    // this could be pretty broken, especially for IPv6
+}
+
+qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
+                                                    QHostAddress *address, quint16 *port)
+{
+    TPtr8 buffer((TUint8*)data, (int)maxSize);
+    TInetAddr addr;
+    TRequestStatus status; //TODO: OMG sync receive!
+    nativeSocket.RecvFrom(buffer, addr, 0, status);
+    User::WaitForRequest(status);
+
+    if (status.Int()) {
+        setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
+    } else if (port || address) {
+        getPortAndAddress(addr, port, address);
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    int len = buffer.Length();
+    qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
+           data, qt_prettyDebug(data, qMin(len, ssize_t(16)), len).data(), maxSize,
+           address ? address->toString().toLatin1().constData() : "(nil)",
+           port ? *port : 0, (qint64) len);
+#endif
+
+    if (status.Int())
+        return -1;
+    return qint64(buffer.Length());
+}
+
+qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len,
+                                                   const QHostAddress &host, quint16 port)
+{
+    TPtrC8 buffer((TUint8*)data, (int)len);
+    TInetAddr addr;
+    setPortAndAddress(addr, port, host);
+    TSockXfrLength sentBytes;
+    TRequestStatus status; //TODO: OMG sync send!
+    nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
+    User::WaitForRequest(status);
+    TInt err = status.Int(); 
+
+    if (err) {
+        switch (err) {
+        case KErrTooBig:
+            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            break;
+        default:
+            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
+           qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
+           port, (qint64) sentBytes());
+#endif
+
+    return qint64(sentBytes());
+}
+
+bool QNativeSocketEnginePrivate::fetchConnectionParameters()
+{
+    localPort = 0;
+    localAddress.clear();
+    peerPort = 0;
+    peerAddress.clear();
+
+    if (socketDescriptor == -1)
+        return false;
+
+    if (!nativeSocket.SubSessionHandle()) {
+        if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, nativeSocket))
+            return false;
+    }
+
+    // Determine local address
+    TSockAddr addr;
+    nativeSocket.LocalName(addr);
+    getPortAndAddress(addr, &localPort, &localAddress);
+
+    // Determine protocol family
+    switch (addr.Family()) {
+    case KAfInet:
+        socketProtocol = QAbstractSocket::IPv4Protocol;
+        break;
+#if !defined (QT_NO_IPV6)
+    case KAfInet6:
+        socketProtocol = QAbstractSocket::IPv6Protocol;
+        break;
+#endif
+    default:
+        socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
+        break;
+    }
+
+    // Determine the remote address
+    nativeSocket.RemoteName(addr);
+    getPortAndAddress(addr, &peerPort, &peerAddress);
+
+    // Determine the socket type (UDP/TCP)
+    TProtocolDesc protocol;
+    TInt err = nativeSocket.Info(protocol);
+    if (err) {
+        QAbstractSocket::UnknownSocketType;
+    } else {
+        switch (protocol.iProtocol) {
+        case KProtocolInetTcp:
+            socketType = QAbstractSocket::TcpSocket;
+            break;
+        case KProtocolInetUdp:
+            socketType = QAbstractSocket::UdpSocket;
+            break;
+        default:
+            socketType = QAbstractSocket::UnknownSocketType;
+            break;
+        }
+    }
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    QString socketProtocolStr = "UnknownProtocol";
+    if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = "IPv4Protocol";
+    else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = "IPv6Protocol";
+
+    QString socketTypeStr = "UnknownSocketType";
+    if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket";
+    else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket";
+
+    qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
+           " peer == %s:%i, socket == %s - %s",
+           localAddress.toString().toLatin1().constData(), localPort,
+           peerAddress.toString().toLatin1().constData(), peerPort,socketTypeStr.toLatin1().constData(),
+           socketProtocolStr.toLatin1().constData());
+#endif
+    return true;
+}
+
+void QNativeSocketEnginePrivate::nativeClose()
+{
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEngine::nativeClose()");
+#endif
+
+    //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
+    nativeSocket.Close();
+    QSymbianSocketManager::instance().removeSocket(nativeSocket);
+}
+
+qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
+{
+    Q_Q(QNativeSocketEngine);
+    TPtrC8 buffer((TUint8*)data, (int)len);
+    TSockXfrLength sentBytes;
+    TRequestStatus status; //TODO: OMG sync send!
+    nativeSocket.Send(buffer, 0, status, sentBytes);
+    User::WaitForRequest(status);
+    TInt err = status.Int(); 
+
+    if (err) {
+        switch (err) {
+        case KErrDisconnected:
+            sentBytes = -1;
+            setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
+            q->close();
+            break;
+        case KErrTooBig:
+            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            break;
+        case KErrWouldBlock:
+            sentBytes = 0;
+        default:
+            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
+           data, qt_prettyDebug(data, qMin((int) len, 16),
+                                (int) len).data(), len, (int) sentBytes());
+#endif
+
+    return qint64(sentBytes());
+}
+/*
+*/
+qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
+{
+    Q_Q(QNativeSocketEngine);
+    if (!q->isValid()) {
+        qWarning("QNativeSocketEngine::nativeRead: Invalid socket");
+        return -1;
+    }
+
+    TPtr8 buffer((TUint8*)data, (int)maxSize);
+    TSockXfrLength received = 0;
+    TRequestStatus status; //TODO: OMG sync receive!
+    nativeSocket.RecvOneOrMore(buffer, 0, status, received);
+    User::WaitForRequest(status);
+    TInt err = status.Int();
+    int r = received();
+
+    if (err) {
+        switch(err) {
+        case KErrWouldBlock:
+            // No data was available for reading
+            r = -2;
+            break;
+        case KErrDisconnected:
+            r = 0;
+            break;
+        default:
+            r = -1;
+            //error string is now set in read(), not here in nativeRead()
+            break;
+        }
+    }
+
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %i",
+           data, qt_prettyDebug(data, qMin(r, ssize_t(16)), r).data(),
+           maxSize, r);
+#endif
+
+    return qint64(r);
+}
+
+int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
+{
+    bool readyRead = false;
+    bool readyWrite = false;
+    if (selectForRead)
+        return nativeSelect(timeout, true, false, &readyRead, &readyWrite);
+    else
+        return nativeSelect(timeout, false, true, &readyRead, &readyWrite);
+}
+
+/*!
+ \internal
+ \param timeout timeout in milliseconds
+ \param checkRead caller is interested if the socket is ready to read
+ \param checkWrite caller is interested if the socket is ready for write
+ \param selectForRead (out) should set to true if ready to read
+ \param selectForWrite (out) should set to true if ready to write
+ \return 0 on timeout, >0 on success, <0 on error
+ */
+int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
+                       bool *selectForRead, bool *selectForWrite) const
+{
+    //TODO: implement
+    //as above, but checking both read and write status at the same time
+    if (!selectTimer.Handle())
+        qt_symbian_throwIfError(selectTimer.CreateLocal());
+    TRequestStatus timerStat;
+    selectTimer.HighRes(timerStat, timeout * 1000);
+    TRequestStatus* readStat = 0;
+    TRequestStatus* writeStat = 0;
+    TRequestStatus* array[3];
+    array[0] = &timerStat;
+    int count = 1;
+    if (checkRead) {
+        //TODO: get from read AO
+        //readStat = ?
+        array[count++] = readStat;
+    }
+    if (checkWrite) {
+        //TODO: get from write AO
+        //writeStat = ?
+        array[count++] = writeStat;
+    }
+    // TODO: for selecting, we can use getOpt(KSOSelectPoll) to get the select result
+    // and KIOCtlSelect for the selecting.
+
+    User::WaitForNRequest(array, count);
+    //IMPORTANT - WaitForNRequest only decrements the thread semaphore once, although more than one status may have completed.
+    if (timerStat.Int() != KRequestPending) {
+        //timed out
+        return 0;
+    }
+    selectTimer.Cancel();
+    User::WaitForRequest(timerStat);
+
+    if(readStat && readStat->Int() != KRequestPending) {
+        Q_ASSERT(checkRead && selectForRead);
+        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
+        *selectForRead = true;
+    }
+    if(writeStat && writeStat->Int() != KRequestPending) {
+        Q_ASSERT(checkWrite && selectForWrite);
+        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
+        *selectForWrite = true;
+    }
+    return 1;
+}
+
+bool QNativeSocketEnginePrivate::nativeJoinMulticastGroup(const QHostAddress &groupAddress,
+                              const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
+bool QNativeSocketEnginePrivate::nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
+                               const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
+QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
+{
+    //TODO
+    return QNetworkInterface();
+}
+
+bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface &iface)
+{
+    //TODO
+    return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
new file mode 100644
index 0000000..c017065
--- /dev/null
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNATIVESOCKETENGINE_P_H
+#define QNATIVESOCKETENGINE_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of the QLibrary class.  This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+#include "QtNetwork/qhostaddress.h"
+#include "private/qabstractsocketengine_p.h"
+#ifndef Q_OS_WIN
+#  include "qplatformdefs.h"
+#else
+#  include <winsock2.h>
+#endif
+
+#ifdef Q_OS_SYMBIAN
+#include <private/qeventdispatcher_symbian_p.h>
+#include <unistd.h>
+#include <es_sock.h>
+#include <in_sock.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// Use our own defines and structs which we know are correct
+#  define QT_SS_MAXSIZE 128
+#  define QT_SS_ALIGNSIZE (sizeof(qint64))
+#  define QT_SS_PAD1SIZE (QT_SS_ALIGNSIZE - sizeof (short))
+#  define QT_SS_PAD2SIZE (QT_SS_MAXSIZE - (sizeof (short) + QT_SS_PAD1SIZE + QT_SS_ALIGNSIZE))
+struct qt_sockaddr_storage {
+      short ss_family;
+      char __ss_pad1[QT_SS_PAD1SIZE];
+      qint64 __ss_align;
+      char __ss_pad2[QT_SS_PAD2SIZE];
+};
+
+// sockaddr_in6 size changed between old and new SDK
+// Only the new version is the correct one, so always
+// use this structure.
+struct qt_in6_addr {
+    quint8 qt_s6_addr[16];
+};
+struct qt_sockaddr_in6 {
+    short   sin6_family;            /* AF_INET6 */
+    quint16 sin6_port;              /* Transport level port number */
+    quint32 sin6_flowinfo;          /* IPv6 flow information */
+    struct  qt_in6_addr sin6_addr;  /* IPv6 address */
+    quint32 sin6_scope_id;          /* set of interfaces for a scope */
+};
+
+union qt_sockaddr {
+    sockaddr a;
+    sockaddr_in a4;
+    qt_sockaddr_in6 a6;
+    qt_sockaddr_storage storage;
+};
+
+class QNativeSocketEnginePrivate;
+class QNetworkInterface;
+
+class Q_AUTOTEST_EXPORT QNativeSocketEngine : public QAbstractSocketEngine
+{
+    Q_OBJECT
+public:
+    QNativeSocketEngine(QObject *parent = 0);
+    ~QNativeSocketEngine();
+
+    bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol);
+    bool initialize(int socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState);
+
+    int socketDescriptor() const;
+
+    bool isValid() const;
+
+    bool connectToHost(const QHostAddress &address, quint16 port);
+    bool connectToHostByName(const QString &name, quint16 port);
+    bool bind(const QHostAddress &address, quint16 port);
+    bool listen();
+    int accept();
+    void close();
+
+    bool joinMulticastGroup(const QHostAddress &groupAddress,
+                            const QNetworkInterface &iface);
+    bool leaveMulticastGroup(const QHostAddress &groupAddress,
+                             const QNetworkInterface &iface);
+    QNetworkInterface multicastInterface() const;
+    bool setMulticastInterface(const QNetworkInterface &iface);
+
+    qint64 bytesAvailable() const;
+
+    qint64 read(char *data, qint64 maxlen);
+    qint64 write(const char *data, qint64 len);
+
+    qint64 readDatagram(char *data, qint64 maxlen, QHostAddress *addr = 0,
+                            quint16 *port = 0);
+    qint64 writeDatagram(const char *data, qint64 len, const QHostAddress &addr,
+                             quint16 port);
+    bool hasPendingDatagrams() const;
+    qint64 pendingDatagramSize() const;
+
+    qint64 bytesToWrite() const;
+
+    qint64 receiveBufferSize() const;
+    void setReceiveBufferSize(qint64 bufferSize);
+
+    qint64 sendBufferSize() const;
+    void setSendBufferSize(qint64 bufferSize);
+
+    int option(SocketOption option) const;
+    bool setOption(SocketOption option, int value);
+
+    bool waitForRead(int msecs = 30000, bool *timedOut = 0);
+    bool waitForWrite(int msecs = 30000, bool *timedOut = 0);
+    bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
+			    bool checkRead, bool checkWrite,
+			    int msecs = 30000, bool *timedOut = 0);
+
+    bool isReadNotificationEnabled() const;
+    void setReadNotificationEnabled(bool enable);
+    bool isWriteNotificationEnabled() const;
+    void setWriteNotificationEnabled(bool enable);
+    bool isExceptionNotificationEnabled() const;
+    void setExceptionNotificationEnabled(bool enable);
+
+public Q_SLOTS:
+    // non-virtual override;
+    void connectionNotification();
+
+private:
+    Q_DECLARE_PRIVATE(QNativeSocketEngine)
+    Q_DISABLE_COPY(QNativeSocketEngine)
+};
+
+#ifdef Q_OS_WIN
+class QWindowsSockInit
+{
+public:
+    QWindowsSockInit();
+    ~QWindowsSockInit();
+    int version;
+};
+#endif
+
+class QSocketNotifier;
+
+class QNativeSocketEnginePrivate : public QAbstractSocketEnginePrivate
+{
+    Q_DECLARE_PUBLIC(QNativeSocketEngine)
+public:
+    QNativeSocketEnginePrivate();
+    ~QNativeSocketEnginePrivate();
+
+    int socketDescriptor;
+#ifdef Q_OS_SYMBIAN
+    mutable RSocket nativeSocket;
+    RSocketServ& socketServer;
+    RConnection connection; //TODO: shared ref
+    mutable RTimer selectTimer;
+#endif
+
+    QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
+
+#ifdef Q_OS_WIN
+    QWindowsSockInit winSock;
+#endif
+
+    enum ErrorString {
+        NonBlockingInitFailedErrorString,
+        BroadcastingInitFailedErrorString,
+        NoIpV6ErrorString,
+        RemoteHostClosedErrorString,
+        TimeOutErrorString,
+        ResourceErrorString,
+        OperationUnsupportedErrorString,
+        ProtocolUnsupportedErrorString,
+        InvalidSocketErrorString,
+        HostUnreachableErrorString,
+        NetworkUnreachableErrorString,
+        AccessErrorString,
+        ConnectionTimeOutErrorString,
+        ConnectionRefusedErrorString,
+        AddressInuseErrorString,
+        AddressNotAvailableErrorString,
+        AddressProtectedErrorString,
+        DatagramTooLargeErrorString,
+        SendDatagramErrorString,
+        ReceiveDatagramErrorString,
+        WriteErrorString,
+        ReadErrorString,
+        PortInuseErrorString,
+        NotSocketErrorString,
+        InvalidProxyTypeString,
+
+        UnknownSocketErrorString = -1
+    };
+
+#ifdef Q_OS_SYMBIAN
+    void getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr);
+    void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
+    void setError(TInt symbianError);
+#endif
+    void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
+
+    // native functions
+    int option(QNativeSocketEngine::SocketOption option) const;
+    bool setOption(QNativeSocketEngine::SocketOption option, int value);
+
+    bool createNewSocket(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol);
+
+    bool nativeConnect(const QHostAddress &address, quint16 port);
+    bool nativeBind(const QHostAddress &address, quint16 port);
+    bool nativeListen(int backlog);
+    int nativeAccept();
+    bool nativeJoinMulticastGroup(const QHostAddress &groupAddress,
+                                  const QNetworkInterface &iface);
+    bool nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
+                                   const QNetworkInterface &iface);
+    QNetworkInterface nativeMulticastInterface() const;
+    bool nativeSetMulticastInterface(const QNetworkInterface &iface);
+    qint64 nativeBytesAvailable() const;
+
+    bool nativeHasPendingDatagrams() const;
+    qint64 nativePendingDatagramSize() const;
+    qint64 nativeReceiveDatagram(char *data, qint64 maxLength,
+                                     QHostAddress *address, quint16 *port);
+    qint64 nativeSendDatagram(const char *data, qint64 length,
+                                  const QHostAddress &host, quint16 port);
+    qint64 nativeRead(char *data, qint64 maxLength);
+    qint64 nativeWrite(const char *data, qint64 length);
+    int nativeSelect(int timeout, bool selectForRead) const;
+    int nativeSelect(int timeout, bool checkRead, bool checkWrite,
+		     bool *selectForRead, bool *selectForWrite) const;
+
+    void nativeClose();
+
+    bool checkProxy(const QHostAddress &address);
+    bool fetchConnectionParameters();
+};
+
+QT_END_NAMESPACE
+
+#endif // QNATIVESOCKETENGINE_P_H
diff --git a/src/network/socket/socket.pri b/src/network/socket/socket.pri
index f2262fe..3356cdd 100644
--- a/src/network/socket/socket.pri
+++ b/src/network/socket/socket.pri
@@ -26,7 +26,10 @@ SOURCES += socket/qabstractsocketengine.cpp \
            socket/qlocalserver.cpp
 
 unix:!symbian:SOURCES += socket/qnativesocketengine_unix.cpp
-symbian:SOURCES += socket/qnativesocketengine_symbian.cpp
+
+symbian:SOURCES += socket/qsymbiansocketengine.cpp
+symbian:HEADERS += socket/qsymbiansocketengine_p.h
+
 unix:SOURCES +=  \
                 socket/qlocalsocket_unix.cpp \
                 socket/qlocalserver_unix.cpp
-- 
cgit v0.12


From 2073995a5af4d6a7677f78757aa72e598ef4b1ac Mon Sep 17 00:00:00 2001
From: Aaron Tunney <aaron.tunney@accenture.com>
Date: Tue, 7 Dec 2010 16:10:55 +0000
Subject: Fixed typo and includes.

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 2e1e6ca..ffa0b46 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -40,6 +40,8 @@
 ****************************************************************************/
 
 //#define QHOSTINFO_DEBUG
+#include <QByteArray>
+#include <QUrl>
 
 #include "qplatformdefs.h"
 
@@ -92,7 +94,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
 
 QString QHostInfo::localHostName()
 {
-    return QString()
+    return QString();
 }
 
 QString QHostInfo::localDomainName()
-- 
cgit v0.12


From 443d9e8a951ead746bd92ddb3835cd9cd63a063b Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 16:17:19 +0100
Subject: Continue code moving

Reviewed-by: Shane Kearns
---
 src/network/socket/qsymbiansocketengine.cpp | 120 ++++++++++++++--------------
 src/network/socket/qsymbiansocketengine_p.h | 114 +++++---------------------
 2 files changed, 80 insertions(+), 154 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index cfaee03..b553110 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -95,7 +95,7 @@ static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
 }
 #endif
 
-void QNativeSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
+void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
 {
 #if !defined(QT_NO_IPV6)
     if (a.Family() == KAfInet6) {
@@ -133,7 +133,7 @@ void QNativeSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *
     Creates and returns a new socket descriptor of type \a socketType
     and \a socketProtocol.  Returns -1 on failure.
 */
-bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
+bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
                                          QAbstractSocket::NetworkLayerProtocol socketProtocol)
 {
 #ifndef QT_NO_IPV6
@@ -176,9 +176,9 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
 /*
     Returns the value of the socket option \a opt.
 */
-int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) const
+int QSymbianSocketEnginePrivate::option(QAbstractSocketEngine::SocketOption opt) const
 {
-    Q_Q(const QNativeSocketEngine);
+    Q_Q(const QSymbianSocketEngine);
     if (!q->isValid())
         return -1;
 
@@ -186,32 +186,32 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co
     TUint level = KSOLSocket; // default
 
     switch (opt) {
-    case QNativeSocketEngine::ReceiveBufferSocketOption:
+    case QAbstractSocketEngine::ReceiveBufferSocketOption:
         n = KSORecvBuf;
         break;
-    case QNativeSocketEngine::SendBufferSocketOption:
+    case QAbstractSocketEngine::SendBufferSocketOption:
         n = KSOSendBuf;
         break;
-    case QNativeSocketEngine::NonBlockingSocketOption:
+    case QAbstractSocketEngine::NonBlockingSocketOption:
         n = KSONonBlockingIO;
         break;
-    case QNativeSocketEngine::BroadcastSocketOption:
+    case QAbstractSocketEngine::BroadcastSocketOption:
         return true; //symbian doesn't support or require this option
-    case QNativeSocketEngine::AddressReusable:
+    case QAbstractSocketEngine::AddressReusable:
         level = KSolInetIp;
         n = KSoReuseAddr;
         break;
-    case QNativeSocketEngine::BindExclusively:
+    case QAbstractSocketEngine::BindExclusively:
         return true;
-    case QNativeSocketEngine::ReceiveOutOfBandData:
+    case QAbstractSocketEngine::ReceiveOutOfBandData:
         level = KSolInetTcp;
         n = KSoTcpOobInline;
         break;
-    case QNativeSocketEngine::LowDelayOption:
+    case QAbstractSocketEngine::LowDelayOption:
         level = KSolInetTcp;
         n = KSoTcpNoDelay;
         break;
-    case QNativeSocketEngine::KeepAliveOption:
+    case QAbstractSocketEngine::KeepAliveOption:
         level = KSolInetTcp;
         n = KSoTcpKeepAlive;
         break;
@@ -232,9 +232,9 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co
 /*
     Sets the socket option \a opt to \a v.
 */
-bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v)
+bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, int v)
 {
-    Q_Q(QNativeSocketEngine);
+    Q_Q(QSymbianSocketEngine);
     if (!q->isValid())
         return false;
 
@@ -242,32 +242,32 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
     int level = SOL_SOCKET; // default
 
     switch (opt) {
-    case QNativeSocketEngine::ReceiveBufferSocketOption:
+    case QAbstractSocketEngine::ReceiveBufferSocketOption:
         n = KSORecvBuf;
         break;
-    case QNativeSocketEngine::SendBufferSocketOption:
+    case QAbstractSocketEngine::SendBufferSocketOption:
         n = KSOSendBuf;
         break;
-    case QNativeSocketEngine::BroadcastSocketOption:
+    case QAbstractSocketEngine::BroadcastSocketOption:
         return true;
-    case QNativeSocketEngine::NonBlockingSocketOption:
+    case QAbstractSocketEngine::NonBlockingSocketOption:
         n = KSONonBlockingIO;
         break;
-    case QNativeSocketEngine::AddressReusable:
+    case QAbstractSocketEngine::AddressReusable:
         level = KSolInetIp;
         n = KSoReuseAddr;
         break;
-    case QNativeSocketEngine::BindExclusively:
+    case QAbstractSocketEngine::BindExclusively:
         return true;
-    case QNativeSocketEngine::ReceiveOutOfBandData:
+    case QAbstractSocketEngine::ReceiveOutOfBandData:
         level = KSolInetTcp;
         n = KSoTcpOobInline;
         break;
-    case QNativeSocketEngine::LowDelayOption:
+    case QAbstractSocketEngine::LowDelayOption:
         level = KSolInetTcp;
         n = KSoTcpNoDelay;
         break;
-    case QNativeSocketEngine::KeepAliveOption:
+    case QAbstractSocketEngine::KeepAliveOption:
         level = KSolInetTcp;
         n = KSoTcpKeepAlive;
         break;
@@ -276,7 +276,7 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
     return (KErrNone == nativeSocket.SetOpt(n, level, v));
 }
 
-void QNativeSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
+void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
     nativeAddr.SetPort(port);
 #if !defined(QT_NO_IPV6)
@@ -305,10 +305,10 @@ void QNativeSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint1
     }
 }
 
-bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16 port)
+bool QSymbianSocketEngine::connect(const QHostAddress &addr, quint16 port)
 {
 #ifdef QNATIVESOCKETENGINE_DEBUG
-    qDebug("QNativeSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
+    qDebug("QSymbianSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
 #endif
 
     TInetAddr nativeAddr;
@@ -351,7 +351,7 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
 
         if (socketState != QAbstractSocket::ConnectedState) {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-            qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
+            qDebug("QSymbianSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
                    addr.toString().toLatin1().constData(), port,
                    socketState == QAbstractSocket::ConnectingState
                    ? "Connection in progress" : socketErrorString.toLatin1().constData());
@@ -369,7 +369,7 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
     return true;
 }
 
-bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
+bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 {
     TInetAddr nativeAddr;
     setPortAndAddress(nativeAddr, port, address);
@@ -392,7 +392,7 @@ bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16
         }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
+        qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
                address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
 #endif
 
@@ -400,14 +400,14 @@ bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
+    qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == true",
            address.toString().toLatin1().constData(), port);
 #endif
     socketState = QAbstractSocket::BoundState;
     return true;
 }
 
-bool QNativeSocketEnginePrivate::nativeListen(int backlog)
+bool QSymbianSocketEngine::listen(int backlog)
 {
     TInt err = nativeSocket.Listen(backlog);
     if (err) {
@@ -421,21 +421,21 @@ bool QNativeSocketEnginePrivate::nativeListen(int backlog)
         }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
+        qDebug("QSymbianSocketEnginePrivate::nativeListen(%i) == false (%s)",
                backlog, socketErrorString.toLatin1().constData());
 #endif
         return false;
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
+    qDebug("QSymbianSocketEnginePrivate::nativeListen(%i) == true", backlog);
 #endif
 
     socketState = QAbstractSocket::ListeningState;
     return true;
 }
 
-int QNativeSocketEnginePrivate::nativeAccept()
+int QSymbianSocketEngine::accept()
 {
     RSocket blankSocket;
     //TODO: this is unbelievably broken, needs to be properly async
@@ -444,7 +444,7 @@ int QNativeSocketEnginePrivate::nativeAccept()
     nativeSocket.Accept(blankSocket, status);
     User::WaitForRequest(status);
     if(status.Int()) {
-        qWarning("QNativeSocketEnginePrivate::nativeAccept() - error %d", status.Int());
+        qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
         return 0;
     }
     // FIXME Qt Handle of new socket must be retrieved from QSymbianSocketManager
@@ -452,7 +452,7 @@ int QNativeSocketEnginePrivate::nativeAccept()
     return blankSocket.SubSessionHandle();
 }
 
-qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
+qint64 QSymbianSocketEngine::bytesAvailable() const
 {
     int nbytes = 0;
     qint64 available = 0;
@@ -464,12 +464,12 @@ qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
     available = (qint64) nbytes;
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
+    qDebug("QSymbianSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
 #endif
     return available;
 }
 
-bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
+bool QSymbianSocketEngine::hasPendingDatagrams() const
 {
     int nbytes;
     TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
@@ -477,7 +477,7 @@ bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
     //TODO: this is pretty horrible too...
 }
 
-qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
+qint64 QSymbianSocketEngine::pendingDatagramSize() const
 {
     int nbytes;
     TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
@@ -486,7 +486,7 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
     // this could be pretty broken, especially for IPv6
 }
 
-qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
+qint64 QSymbianSocketEngine::nativeReceiveDatagram(char *data, qint64 maxSize,
                                                     QHostAddress *address, quint16 *port)
 {
     TPtr8 buffer((TUint8*)data, (int)maxSize);
@@ -503,7 +503,7 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
     int len = buffer.Length();
-    qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
+    qDebug("QSymbianSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
            data, qt_prettyDebug(data, qMin(len, ssize_t(16)), len).data(), maxSize,
            address ? address->toString().toLatin1().constData() : "(nil)",
            port ? *port : 0, (qint64) len);
@@ -514,7 +514,7 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS
     return qint64(buffer.Length());
 }
 
-qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len,
+qint64 QSymbianSocketEngine::sendDatagram(const char *data, qint64 len,
                                                    const QHostAddress &host, quint16 port)
 {
     TPtrC8 buffer((TUint8*)data, (int)len);
@@ -537,7 +537,7 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
+    qDebug("QSymbianSocketEnginePrivate::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
            qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
            port, (qint64) sentBytes());
 #endif
@@ -545,7 +545,7 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l
     return qint64(sentBytes());
 }
 
-bool QNativeSocketEnginePrivate::fetchConnectionParameters()
+bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
 {
     localPort = 0;
     localAddress.clear();
@@ -611,7 +611,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
     if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket";
     else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket";
 
-    qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
+    qDebug("QSymbianSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
            " peer == %s:%i, socket == %s - %s",
            localAddress.toString().toLatin1().constData(), localPort,
            peerAddress.toString().toLatin1().constData(), peerPort,socketTypeStr.toLatin1().constData(),
@@ -620,10 +620,10 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
     return true;
 }
 
-void QNativeSocketEnginePrivate::nativeClose()
+void QSymbianSocketEngine::close()
 {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEngine::nativeClose()");
+    qDebug("QSymbianSocketEnginePrivate::nativeClose()");
 #endif
 
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
@@ -631,9 +631,9 @@ void QNativeSocketEnginePrivate::nativeClose()
     QSymbianSocketManager::instance().removeSocket(nativeSocket);
 }
 
-qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
+qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 {
-    Q_Q(QNativeSocketEngine);
+    Q_Q(QSymbianSocketEngine);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TSockXfrLength sentBytes;
     TRequestStatus status; //TODO: OMG sync send!
@@ -659,7 +659,7 @@ qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
+    qDebug("QSymbianSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
            data, qt_prettyDebug(data, qMin((int) len, 16),
                                 (int) len).data(), len, (int) sentBytes());
 #endif
@@ -668,11 +668,11 @@ qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
 }
 /*
 */
-qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
+qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
 {
-    Q_Q(QNativeSocketEngine);
+    Q_Q(QSymbianSocketEngine);
     if (!q->isValid()) {
-        qWarning("QNativeSocketEngine::nativeRead: Invalid socket");
+        qWarning("QSymbianSocketEnginePrivate::nativeRead: Invalid socket");
         return -1;
     }
 
@@ -709,7 +709,7 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
     return qint64(r);
 }
 
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
+int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
 {
     bool readyRead = false;
     bool readyWrite = false;
@@ -728,7 +728,7 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) co
  \param selectForWrite (out) should set to true if ready to write
  \return 0 on timeout, >0 on success, <0 on error
  */
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
+int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
                        bool *selectForRead, bool *selectForWrite) const
 {
     //TODO: implement
@@ -777,27 +777,27 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool c
     return 1;
 }
 
-bool QNativeSocketEnginePrivate::nativeJoinMulticastGroup(const QHostAddress &groupAddress,
+bool QSymbianSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress,
                               const QNetworkInterface &iface)
 {
     //TODO
     return false;
 }
 
-bool QNativeSocketEnginePrivate::nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
+bool QSymbianSocketEngine::leaveMulticastGroup(const QHostAddress &groupAddress,
                                const QNetworkInterface &iface)
 {
     //TODO
     return false;
 }
 
-QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
+QNetworkInterface QSymbianSocketEngine::multicastInterface() const
 {
     //TODO
     return QNetworkInterface();
 }
 
-bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface &iface)
+bool QSymbianSocketEngine::setMulticastInterface(const QNetworkInterface &iface)
 {
     //TODO
     return false;
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index c017065..07e1b69 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -39,8 +39,8 @@
 **
 ****************************************************************************/
 
-#ifndef QNATIVESOCKETENGINE_P_H
-#define QNATIVESOCKETENGINE_P_H
+#ifndef QSYMBIANSOCKETENGINE_P_H
+#define QSYMBIANSOCKETENGINE_P_H
 
 //
 //  W A R N I N G
@@ -54,63 +54,27 @@
 //
 #include "QtNetwork/qhostaddress.h"
 #include "private/qabstractsocketengine_p.h"
-#ifndef Q_OS_WIN
-#  include "qplatformdefs.h"
-#else
-#  include <winsock2.h>
-#endif
+#include "qplatformdefs.h"
 
-#ifdef Q_OS_SYMBIAN
 #include <private/qeventdispatcher_symbian_p.h>
 #include <unistd.h>
 #include <es_sock.h>
 #include <in_sock.h>
-#endif
+// TODO
 
-QT_BEGIN_NAMESPACE
 
-// Use our own defines and structs which we know are correct
-#  define QT_SS_MAXSIZE 128
-#  define QT_SS_ALIGNSIZE (sizeof(qint64))
-#  define QT_SS_PAD1SIZE (QT_SS_ALIGNSIZE - sizeof (short))
-#  define QT_SS_PAD2SIZE (QT_SS_MAXSIZE - (sizeof (short) + QT_SS_PAD1SIZE + QT_SS_ALIGNSIZE))
-struct qt_sockaddr_storage {
-      short ss_family;
-      char __ss_pad1[QT_SS_PAD1SIZE];
-      qint64 __ss_align;
-      char __ss_pad2[QT_SS_PAD2SIZE];
-};
+QT_BEGIN_NAMESPACE
 
-// sockaddr_in6 size changed between old and new SDK
-// Only the new version is the correct one, so always
-// use this structure.
-struct qt_in6_addr {
-    quint8 qt_s6_addr[16];
-};
-struct qt_sockaddr_in6 {
-    short   sin6_family;            /* AF_INET6 */
-    quint16 sin6_port;              /* Transport level port number */
-    quint32 sin6_flowinfo;          /* IPv6 flow information */
-    struct  qt_in6_addr sin6_addr;  /* IPv6 address */
-    quint32 sin6_scope_id;          /* set of interfaces for a scope */
-};
 
-union qt_sockaddr {
-    sockaddr a;
-    sockaddr_in a4;
-    qt_sockaddr_in6 a6;
-    qt_sockaddr_storage storage;
-};
-
-class QNativeSocketEnginePrivate;
+class QSymbianSocketEnginePrivate;
 class QNetworkInterface;
 
-class Q_AUTOTEST_EXPORT QNativeSocketEngine : public QAbstractSocketEngine
+class Q_AUTOTEST_EXPORT QSymbianSocketEngine : public QAbstractSocketEngine
 {
     Q_OBJECT
 public:
-    QNativeSocketEngine(QObject *parent = 0);
-    ~QNativeSocketEngine();
+    QSymbianSocketEngine(QObject *parent = 0);
+    ~QSymbianSocketEngine();
 
     bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol);
     bool initialize(int socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState);
@@ -156,6 +120,7 @@ public:
     int option(SocketOption option) const;
     bool setOption(SocketOption option, int value);
 
+    // FIXME actually implement
     bool waitForRead(int msecs = 30000, bool *timedOut = 0);
     bool waitForWrite(int msecs = 30000, bool *timedOut = 0);
     bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
@@ -170,32 +135,23 @@ public:
     void setExceptionNotificationEnabled(bool enable);
 
 public Q_SLOTS:
+    // TODO: Why do we do this? This is private Qt implementation stuff anyway, no need for it
     // non-virtual override;
     void connectionNotification();
 
 private:
-    Q_DECLARE_PRIVATE(QNativeSocketEngine)
-    Q_DISABLE_COPY(QNativeSocketEngine)
-};
-
-#ifdef Q_OS_WIN
-class QWindowsSockInit
-{
-public:
-    QWindowsSockInit();
-    ~QWindowsSockInit();
-    int version;
+    Q_DECLARE_PRIVATE(QSymbianSocketEngine)
+    Q_DISABLE_COPY(QSymbianSocketEngine)
 };
-#endif
 
 class QSocketNotifier;
 
-class QNativeSocketEnginePrivate : public QAbstractSocketEnginePrivate
+class QSymbianSocketEnginePrivate : public QAbstractSocketEnginePrivate
 {
-    Q_DECLARE_PUBLIC(QNativeSocketEngine)
+    Q_DECLARE_PUBLIC(QSymbianSocketEngine)
 public:
-    QNativeSocketEnginePrivate();
-    ~QNativeSocketEnginePrivate();
+    QSymbianSocketEnginePrivate();
+    ~QSymbianSocketEnginePrivate();
 
     int socketDescriptor;
 #ifdef Q_OS_SYMBIAN
@@ -207,10 +163,6 @@ public:
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
 
-#ifdef Q_OS_WIN
-    QWindowsSockInit winSock;
-#endif
-
     enum ErrorString {
         NonBlockingInitFailedErrorString,
         BroadcastingInitFailedErrorString,
@@ -248,37 +200,11 @@ public:
 #endif
     void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
-    // native functions
-    int option(QNativeSocketEngine::SocketOption option) const;
-    bool setOption(QNativeSocketEngine::SocketOption option, int value);
-
-    bool createNewSocket(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol);
-
-    bool nativeConnect(const QHostAddress &address, quint16 port);
-    bool nativeBind(const QHostAddress &address, quint16 port);
-    bool nativeListen(int backlog);
-    int nativeAccept();
-    bool nativeJoinMulticastGroup(const QHostAddress &groupAddress,
-                                  const QNetworkInterface &iface);
-    bool nativeLeaveMulticastGroup(const QHostAddress &groupAddress,
-                                   const QNetworkInterface &iface);
-    QNetworkInterface nativeMulticastInterface() const;
-    bool nativeSetMulticastInterface(const QNetworkInterface &iface);
-    qint64 nativeBytesAvailable() const;
-
-    bool nativeHasPendingDatagrams() const;
-    qint64 nativePendingDatagramSize() const;
-    qint64 nativeReceiveDatagram(char *data, qint64 maxLength,
-                                     QHostAddress *address, quint16 *port);
-    qint64 nativeSendDatagram(const char *data, qint64 length,
-                                  const QHostAddress &host, quint16 port);
-    qint64 nativeRead(char *data, qint64 maxLength);
-    qint64 nativeWrite(const char *data, qint64 length);
+    // FIXME
     int nativeSelect(int timeout, bool selectForRead) const;
     int nativeSelect(int timeout, bool checkRead, bool checkWrite,
-		     bool *selectForRead, bool *selectForWrite) const;
+                           bool *selectForRead, bool *selectForWrite) const;
 
-    void nativeClose();
 
     bool checkProxy(const QHostAddress &address);
     bool fetchConnectionParameters();
@@ -286,4 +212,4 @@ public:
 
 QT_END_NAMESPACE
 
-#endif // QNATIVESOCKETENGINE_P_H
+#endif // QSYMBIANSOCKETENGINE_P_H
-- 
cgit v0.12


From 8adba785c8b68b9fdc98b51ecf317e17ad145d13 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 7 Dec 2010 16:03:09 +0000
Subject: default RConnection for sockets

Bearer pushes RConnection into QtCore.
QSocket can pull this RConnection back out when it needs to open an RSocket

(potentially this can be removed again later if QSocket is made
QNetworkSession aware)

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qcore_symbian_p.cpp              | 12 +++++++++++-
 src/corelib/kernel/qcore_symbian_p.h                | 16 +++++++++++++++-
 src/plugins/bearer/symbian/qnetworksession_impl.cpp | 10 ++++++++++
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index b6688f7..ede8464 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -217,7 +217,7 @@ Q_CORE_EXPORT RFs& qt_s60GetRFs()
 }
 
 QSymbianSocketManager::QSymbianSocketManager() :
-    iNextSocket(0)
+    iNextSocket(0), iDefaultConnection(0)
 {
     TSessionPref preferences;
     // ### In future this could be changed to KAfInet6 when that is more common than IPv4
@@ -290,6 +290,16 @@ bool QSymbianSocketManager::lookupSocket(int fd, RSocket& socket) const {
     return true;
 }
 
+void QSymbianSocketManager::setDefaultConnection(RConnection* con)
+{
+    iDefaultConnection = con;
+}
+
+RConnection* QSymbianSocketManager::defaultConnection() const
+{
+    return iDefaultConnection;
+}
+
 Q_GLOBAL_STATIC(QSymbianSocketManager, qt_symbianSocketManager);
 
 QSymbianSocketManager& QSymbianSocketManager::instance()
diff --git a/src/corelib/kernel/qcore_symbian_p.h b/src/corelib/kernel/qcore_symbian_p.h
index 8ffa247..d5d10ef 100644
--- a/src/corelib/kernel/qcore_symbian_p.h
+++ b/src/corelib/kernel/qcore_symbian_p.h
@@ -172,7 +172,7 @@ public:
     }
     bool operator<(const QHashableSocket &other) const
     {
-        if(Session().Handle() == other.Session().Handle())
+        if (Session().Handle() == other.Session().Handle())
             return SubSessionHandle() < other.SubSessionHandle();
         return Session().Handle() < other.Session().Handle();
     }
@@ -230,6 +230,19 @@ public:
 
     /*!
       \internal
+      Set the default connection to use for new sockets
+      \param an open connection
+    */
+    void setDefaultConnection(RConnection* con);
+    /*!
+      \internal
+      Get the default connection to use for new sockets
+      \return the connection, or null pointer if there is none set
+    */
+    RConnection *defaultConnection() const;
+
+    /*!
+      \internal
       Gets a reference to the singleton socket manager
     */
     static QSymbianSocketManager& instance();
@@ -243,6 +256,7 @@ private:
     QHash<int, RSocket> reverseSocketMap;
     mutable QMutex iMutex;
     RSocketServ iSocketServ;
+    RConnection *iDefaultConnection;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index cfb55bf..759c86a 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -114,6 +114,7 @@ QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
     // Close global 'Open C' RConnection
     // Clears also possible unsetdefaultif() flags.
     setdefaultif(0);
+    QSymbianSocketManager::instance().setDefaultConnection(0);
 
     iConnectionMonitor.Close();
     iOpenCLibrary.Close();
@@ -533,6 +534,7 @@ void QNetworkSessionPrivateImpl::close(bool allowSignals)
         setdefaultif(0);
     }
 
+    QSymbianSocketManager::instance().setDefaultConnection(0);
     // If UserChoice, go down immediately. If some other configuration,
     // go down immediately if there is no reports expected from the platform;
     // in practice Connection Monitor is aware of connections only after
@@ -634,6 +636,7 @@ void QNetworkSessionPrivateImpl::migrate()
         } else {
             setdefaultif(0);
         }
+        QSymbianSocketManager::instance().setDefaultConnection(0);
         // Start migrating to new IAP
         iMobility->MigrateToPreferredCarrier();
     }
@@ -670,6 +673,8 @@ void QNetworkSessionPrivateImpl::accept()
         strcpy(ifr.ifr_name, nameAsByteArray.constData());
         setdefaultif(&ifr);
 
+        QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+
         newState(QNetworkSession::Connected, iNewRoamingIap);
     }
 #endif
@@ -693,6 +698,8 @@ void QNetworkSessionPrivateImpl::reject()
             strcpy(ifr.ifr_name, nameAsByteArray.constData());
             setdefaultif(&ifr);
 
+            QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+
             newState(QNetworkSession::Connected, iOldRoamingIap);
         }
     }
@@ -1079,6 +1086,7 @@ void QNetworkSessionPrivateImpl::RunL()
                 QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
                 strcpy(ifr.ifr_name, nameAsByteArray.constData());
                 error = setdefaultif(&ifr);
+                QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
             }
             if (error != KErrNone) {
                 isOpen = false;
@@ -1092,6 +1100,7 @@ void QNetworkSessionPrivateImpl::RunL()
                     // No valid configuration, bail out.
                     // Status updates from QNCM won't be received correctly
                     // because there is no configuration to associate them with so transit here.
+                    QSymbianSocketManager::instance().setDefaultConnection(0);
                     iConnection.Close();
                     newState(QNetworkSession::Closing);
                     newState(QNetworkSession::Disconnected);
@@ -1205,6 +1214,7 @@ bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint
         strcpy(ifr.ifr_name, nameAsByteArray.constData());
 
         setdefaultif(&ifr);
+        QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
 #endif
     }
 
-- 
cgit v0.12


From c59b7067ace1abc5f9a0aca9bd90d49340cb4e79 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 7 Dec 2010 16:07:30 +0000
Subject: Helper functions for synchronously waiting on an active object to
 complete

QtNetwork APIs are based on calling a function asychronously.
However the user may call a waitForXXXX function later to convert this
into a synchronous call.
For Symbian, the async call should be implemented as an active object.
These helpers make the synchronous conversion possible.

Unix used select() in a polling way to do async mode and blocking way
for the synchronous conversion.

Reviewed-by: mread
---
 src/corelib/kernel/qeventdispatcher_symbian.cpp | 80 +++++++++++++++++++++++++
 src/corelib/kernel/qeventdispatcher_symbian_p.h |  4 +-
 2 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index 6154119..55be6eb 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -1136,6 +1136,86 @@ void CQtActiveScheduler::Error(TInt aError) const
     QT_CATCH (const std::bad_alloc&) {}    // ignore alloc fails, nothing more can be done
 }
 
+bool QActiveObject::wait(CActive* ao, int ms)
+{
+    if (!ao->IsActive())
+        return true; //request already complete
+    bool timedout = false;
+    if (ms > 0) {
+        TRequestStatus tstat;
+        RTimer t;
+        if (KErrNone != t.CreateLocal())
+            return false;
+        t.HighRes(tstat, ms*1000);
+        User::WaitForRequest(tstat, ao->iStatus);
+        if (tstat != KRequestPending) {
+            timedout = true;
+        } else {
+            t.Cancel();
+            //balance thread semaphore
+            User::WaitForRequest(tstat);
+        }
+        t.Close();
+    } else {
+        User::WaitForRequest(ao->iStatus);
+    }
+    if (timedout)
+        return false;
+
+    //evil cast to allow calling of protected virtual
+    ((QActiveObject*)ao)->RunL();
+
+    //clear active & pending flags
+    ao->iStatus = TRequestStatus();
+
+    return true;
+}
+
+bool QActiveObject::wait(QList<CActive*> aos, int ms)
+{
+    QVector<TRequestStatus*> stati;
+    stati.reserve(aos.count() + 1);
+    foreach (CActive* ao, aos) {
+        if (!ao->IsActive())
+            return true; //request already complete
+        stati.append(&(ao->iStatus));
+    }
+    bool timedout = false;
+    TRequestStatus tstat;
+    RTimer t;
+    if (ms > 0) {
+        if (KErrNone != t.CreateLocal())
+            return false;
+        t.HighRes(tstat, ms*1000);
+        stati.append(&tstat);
+    }
+    User::WaitForNRequest(stati.data(), stati.count());
+    if (ms > 0) {
+        if (tstat != KRequestPending) {
+            timedout = true;
+        } else {
+            t.Cancel();
+            //balance thread semaphore
+            User::WaitForRequest(tstat);
+        }
+        t.Close();
+    }
+    if (timedout)
+        return false;
+
+    foreach (CActive* ao, aos) {
+        if (ao->iStatus != KRequestPending) {
+            //evil cast to allow calling of protected virtual
+            ((QActiveObject*)ao)->RunL();
+
+            //clear active & pending flags
+            ao->iStatus = TRequestStatus();
+            break; //only call one
+        }
+    }
+    return true;
+}
+
 QT_END_NAMESPACE
 
 #include "moc_qeventdispatcher_symbian_p.cpp"
diff --git a/src/corelib/kernel/qeventdispatcher_symbian_p.h b/src/corelib/kernel/qeventdispatcher_symbian_p.h
index 3615996..d462dff 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian_p.h
+++ b/src/corelib/kernel/qeventdispatcher_symbian_p.h
@@ -76,7 +76,7 @@ QT_BEGIN_NAMESPACE
 class QEventDispatcherSymbian;
 class QTimerActiveObject;
 
-class QActiveObject : public CActive
+class Q_AUTOTEST_EXPORT QActiveObject : public CActive
 {
 public:
     QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher);
@@ -86,6 +86,8 @@ public:
 
     void reactivateAndComplete();
 
+    static bool wait(CActive* ao, int ms);
+    static bool wait(QList<CActive*> aos, int ms);
 protected:
     QEventDispatcherSymbian *m_dispatcher;
 
-- 
cgit v0.12


From a0528585d02440b37fb93f37e3d15ce2356d2541 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 16:51:48 +0100
Subject: Remove Symbian code from QNativeSocketEngine

.. and move one function around

Reviewed-by: Shane Kearns
---
 src/network/socket/qnativesocketengine.cpp  |  8 ---
 src/network/socket/qnativesocketengine_p.h  | 11 ----
 src/network/socket/qsymbiansocketengine.cpp | 80 ++++++++++++++++++-----------
 3 files changed, 51 insertions(+), 48 deletions(-)

diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index 00d36b4..1fe5572 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -110,10 +110,6 @@
 # include "qtcpserver.h"
 #endif
 
-#ifdef Q_OS_SYMBIAN
-# include <private/qcore_symbian_p.h>
-#endif
-
 QT_BEGIN_NAMESPACE
 
 //#define QNATIVESOCKETENGINE_DEBUG
@@ -164,9 +160,6 @@ QT_BEGIN_NAMESPACE
 */
 QNativeSocketEnginePrivate::QNativeSocketEnginePrivate() :
     socketDescriptor(-1),
-#ifdef Q_OS_SYMBIAN
-    socketServer(qt_symbianGetSocketServer()),
-#endif
     readNotifier(0),
     writeNotifier(0),
     exceptNotifier(0)
@@ -394,7 +387,6 @@ bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAb
 
 
     // Make sure we receive out-of-band data
-    // On Symbian OS this works only with native IP stack, not with WinSock
     if (socketType == QAbstractSocket::TcpSocket
         && !setOption(ReceiveOutOfBandData, 1)) {
         qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index c017065..1f13433 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -198,12 +198,6 @@ public:
     ~QNativeSocketEnginePrivate();
 
     int socketDescriptor;
-#ifdef Q_OS_SYMBIAN
-    mutable RSocket nativeSocket;
-    RSocketServ& socketServer;
-    RConnection connection; //TODO: shared ref
-    mutable RTimer selectTimer;
-#endif
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
 
@@ -241,11 +235,6 @@ public:
         UnknownSocketErrorString = -1
     };
 
-#ifdef Q_OS_SYMBIAN
-    void getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr);
-    void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
-    void setError(TInt symbianError);
-#endif
     void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
     // native functions
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index b553110..7a22918 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -53,6 +53,7 @@
 #ifndef QT_NO_IPV6IFNAME
 #include <net/if.h>
 #endif
+# include <private/qcore_symbian_p.h>
 
 #define QNATIVESOCKETENGINE_DEBUG
 
@@ -229,6 +230,56 @@ int QSymbianSocketEnginePrivate::option(QAbstractSocketEngine::SocketOption opt)
 }
 
 
+void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
+{
+    nativeAddr.SetPort(port);
+#if !defined(QT_NO_IPV6)
+    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+#ifndef QT_NO_IPV6IFNAME
+        TPckgBuf<TSoInetIfQuery> query;
+        query().iName = qt_QString2TPtrC(addr.scopeId());
+        TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
+        if(!err)
+            nativeAddr.SetScope(query().iIndex);
+        else
+            nativeAddr.SetScope(0);
+#else
+        nativeAddr.SetScope(addr.scopeId().toInt());
+#endif
+        Q_IPV6ADDR ip6 = addr.toIPv6Address();
+        TIp6Addr v6addr;
+        memcpy(v6addr.u.iAddr8, ip6.c, 16);
+        nativeAddr.SetAddress(v6addr);
+    } else
+#endif
+    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
+        nativeAddr.SetAddress(addr.toIPv4Address());
+    } else {
+        qWarning("unsupported network protocol (%d)", addr.protocol());
+    }
+}
+
+QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
+    socketDescriptor(-1),
+    socketServer(qt_symbianGetSocketServer()),
+    readNotifier(0),
+    writeNotifier(0),
+    exceptNotifier(0)
+{
+}
+
+
+QSymbianSocketEngine::QSymbianSocketEngine(QObject *parent)
+    : QAbstractSocketEngine(*new QSymbianSocketEnginePrivate(), parent)
+{
+}
+
+
+QSymbianSocketEngine::~QSymbianSocketEngine()
+{
+    close();
+}
+
 /*
     Sets the socket option \a opt to \a v.
 */
@@ -276,35 +327,6 @@ bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, in
     return (KErrNone == nativeSocket.SetOpt(n, level, v));
 }
 
-void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
-{
-    nativeAddr.SetPort(port);
-#if !defined(QT_NO_IPV6)
-    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
-#ifndef QT_NO_IPV6IFNAME
-        TPckgBuf<TSoInetIfQuery> query;
-        query().iName = qt_QString2TPtrC(addr.scopeId());
-        TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
-        if(!err)
-            nativeAddr.SetScope(query().iIndex);
-        else
-            nativeAddr.SetScope(0);
-#else
-        nativeAddr.SetScope(addr.scopeId().toInt());
-#endif
-        Q_IPV6ADDR ip6 = addr.toIPv6Address();
-        TIp6Addr v6addr;
-        memcpy(v6addr.u.iAddr8, ip6.c, 16);
-        nativeAddr.SetAddress(v6addr);
-    } else
-#endif
-    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
-        nativeAddr.SetAddress(addr.toIPv4Address());
-    } else {
-        qWarning("unsupported network protocol (%d)", addr.protocol());
-    }
-}
-
 bool QSymbianSocketEngine::connect(const QHostAddress &addr, quint16 port)
 {
 #ifdef QNATIVESOCKETENGINE_DEBUG
-- 
cgit v0.12


From f16b745ca427e75bc045076f5e14742a2a2c713a Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 17:07:19 +0100
Subject: Create QSymbianSocketEngine when requested

Reviewed-by: Shane Kearns
---
 src/network/socket/qabstractsocketengine.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/network/socket/qabstractsocketengine.cpp b/src/network/socket/qabstractsocketengine.cpp
index 79eed8c..1b2a1f4 100644
--- a/src/network/socket/qabstractsocketengine.cpp
+++ b/src/network/socket/qabstractsocketengine.cpp
@@ -113,7 +113,11 @@ QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket
         return 0;
 #endif
 
+#ifdef Q_OS_SYMBIAN
+    return new QSymbianSocketEngine(parent);
+#else
     return new QNativeSocketEngine(parent);
+#endif
 }
 
 QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(int socketDescripter, QObject *parent)
@@ -123,7 +127,11 @@ QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(int socketDescr
         if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketDescripter, parent))
             return ret;
     }
+#ifdef Q_OS_SYMBIAN
+    return new QSymbianSocketEngine(parent);
+#else
     return new QNativeSocketEngine(parent);
+#endif
 }
 
 QAbstractSocket::SocketError QAbstractSocketEngine::error() const
-- 
cgit v0.12


From c2f9ec2ae225fbaeaa0e463308427fb075d9c2af Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 7 Dec 2010 17:23:15 +0100
Subject: QSymbianSocketEngine: Get global RConnection*

Reviewed-by: Shane Kearns
---
 src/network/socket/qsymbiansocketengine.cpp | 3 ++-
 src/network/socket/qsymbiansocketengine_p.h | 4 +++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 7a22918..55fe12b 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -145,7 +145,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 #endif
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
-    TInt err = nativeSocket.Open(socketServer, family, type, protocol, connection);
+    TInt err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
 
     if (err != KErrNone) {
         switch (err) {
@@ -262,6 +262,7 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
 QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
     socketDescriptor(-1),
     socketServer(qt_symbianGetSocketServer()),
+    connection(QSymbianSocketManager::instance().defaultConnection()),
     readNotifier(0),
     writeNotifier(0),
     exceptNotifier(0)
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 07e1b69..fd449ca 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -156,8 +156,10 @@ public:
     int socketDescriptor;
 #ifdef Q_OS_SYMBIAN
     mutable RSocket nativeSocket;
+    // From QtCore:
     RSocketServ& socketServer;
-    RConnection connection; //TODO: shared ref
+    // From QtCore, check lifetime issues, also should be pulling this out of a QNetworkSession somehow:
+    RConnection *connection;
     mutable RTimer selectTimer;
 #endif
 
-- 
cgit v0.12


From e879d46b2733aa3fe69a3e1dabd2ae377b8a714d Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 09:51:04 +0100
Subject: QSymbianSocketEngine: Compile fixes..

---
 src/network/socket/qabstractsocketengine.cpp |   6 +
 src/network/socket/qsymbiansocketengine.cpp  | 235 ++++++++++++++++++---------
 src/network/socket/qsymbiansocketengine_p.h  |   2 +
 3 files changed, 169 insertions(+), 74 deletions(-)

diff --git a/src/network/socket/qabstractsocketengine.cpp b/src/network/socket/qabstractsocketengine.cpp
index 1b2a1f4..16b9d57 100644
--- a/src/network/socket/qabstractsocketengine.cpp
+++ b/src/network/socket/qabstractsocketengine.cpp
@@ -40,7 +40,13 @@
 ****************************************************************************/
 
 #include "qabstractsocketengine_p.h"
+
+#ifdef Q_OS_SYMBIAN
+#include "qsymbiansocketengine_p.h"
+#else
 #include "qnativesocketengine_p.h"
+#endif
+
 #include "qmutex.h"
 #include "qnetworkproxy.h"
 
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 55fe12b..7957baf 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -40,8 +40,8 @@
 ****************************************************************************/
 
 //#define QNATIVESOCKETENGINE_DEBUG
-#include "qnativesocketengine_p.h"
-#include "private/qnet_unix_p.h"
+#include "qsymbiansocketengine_p.h"
+
 #include "qiodevice.h"
 #include "qhostaddress.h"
 #include "qelapsedtimer.h"
@@ -49,11 +49,17 @@
 #include "qnetworkinterface.h"
 #include <es_sock.h>
 #include <in_sock.h>
-#include <QtCore/private/qcore_symbian_p.h>
 #ifndef QT_NO_IPV6IFNAME
 #include <net/if.h>
 #endif
-# include <private/qcore_symbian_p.h>
+
+#include <private/qcore_symbian_p.h>
+
+#if !defined(QT_NO_NETWORKPROXY)
+# include "qnetworkproxy.h"
+# include "qabstractsocket.h"
+# include "qtcpserver.h"
+#endif
 
 #define QNATIVESOCKETENGINE_DEBUG
 
@@ -137,6 +143,7 @@ void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16
 bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType,
                                          QAbstractSocket::NetworkLayerProtocol socketProtocol)
 {
+    Q_Q(QSymbianSocketEngine);
 #ifndef QT_NO_IPV6
     TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
 #else
@@ -177,10 +184,10 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 /*
     Returns the value of the socket option \a opt.
 */
-int QSymbianSocketEnginePrivate::option(QAbstractSocketEngine::SocketOption opt) const
+int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
 {
-    Q_Q(const QSymbianSocketEngine);
-    if (!q->isValid())
+    Q_D(const QSymbianSocketEngine);
+    if (!isValid())
         return -1;
 
     TUint n;
@@ -222,7 +229,7 @@ int QSymbianSocketEnginePrivate::option(QAbstractSocketEngine::SocketOption opt)
 
     int v = -1;
     //GetOpt() is non const
-    TInt err = nativeSocket.GetOpt(n, level, v);
+    TInt err = d->nativeSocket.GetOpt(n, level, v);
     if (!err)
         return v;
 
@@ -269,6 +276,10 @@ QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
 {
 }
 
+QSymbianSocketEnginePrivate::~QSymbianSocketEnginePrivate()
+{
+}
+
 
 QSymbianSocketEngine::QSymbianSocketEngine(QObject *parent)
     : QAbstractSocketEngine(*new QSymbianSocketEnginePrivate(), parent)
@@ -279,6 +290,7 @@ QSymbianSocketEngine::QSymbianSocketEngine(QObject *parent)
 QSymbianSocketEngine::~QSymbianSocketEngine()
 {
     close();
+    // FIXME what else do we need to free?
 }
 
 /*
@@ -286,8 +298,8 @@ QSymbianSocketEngine::~QSymbianSocketEngine()
 */
 bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, int v)
 {
-    Q_Q(QSymbianSocketEngine);
-    if (!q->isValid())
+    Q_D(QSymbianSocketEngine);
+    if (!isValid())
         return false;
 
     int n = 0;
@@ -325,59 +337,82 @@ bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, in
         break;
     }
 
-    return (KErrNone == nativeSocket.SetOpt(n, level, v));
+    return (KErrNone == d->nativeSocket.SetOpt(n, level, v));
 }
 
-bool QSymbianSocketEngine::connect(const QHostAddress &addr, quint16 port)
+bool QSymbianSocketEngine::connectToHostByName(const QString &name, quint16 port)
 {
+    // FIXME for engines that support hostnames.. not for us then i guess.
+
+    return false;
+}
+
+
+bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
+{
+    Q_D(QSymbianSocketEngine);
+
 #ifdef QNATIVESOCKETENGINE_DEBUG
-    qDebug("QSymbianSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
+    qDebug("QSymbianSocketEngine::connectToHost() : %d ", d->socketDescriptor);
 #endif
 
+#if defined (QT_NO_IPV6)
+    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                    NoIpV6ErrorString);
+        return false;
+    }
+#endif
+    if (!d->checkProxy(addr))
+        return false;
+
+    d->peerAddress = addr;
+    d->peerPort = port;
+
     TInetAddr nativeAddr;
-    setPortAndAddress(nativeAddr, port, addr);
+    d->setPortAndAddress(nativeAddr, port, addr);
     //TODO: async connect with active object - from here to end of function is a mess
     TRequestStatus status;
-    nativeSocket.Connect(nativeAddr, status);
+    d->nativeSocket.Connect(nativeAddr, status);
     User::WaitForRequest(status);
     TInt err = status.Int();
     if (err) {
         switch (err) {
         case KErrCouldNotConnect:
-            setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
+            d->setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrTimedOut:
-            setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
+            d->setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
             break;
         case KErrHostUnreach:
-            setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
+            d->setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrNetUnreach:
-            setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
+            d->setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrInUse:
-            setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
+            d->setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
             break;
         case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
-            socketState = QAbstractSocket::UnconnectedState;
+            d->setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrNotSupported:
         case KErrBadDescriptor:
-            socketState = QAbstractSocket::UnconnectedState;
+            d->socketState = QAbstractSocket::UnconnectedState;
         default:
             break;
         }
 
-        if (socketState != QAbstractSocket::ConnectedState) {
+        if (d->socketState != QAbstractSocket::ConnectedState) {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
             qDebug("QSymbianSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
                    addr.toString().toLatin1().constData(), port,
-                   socketState == QAbstractSocket::ConnectingState
-                   ? "Connection in progress" : socketErrorString.toLatin1().constData());
+                   d->socketState == QAbstractSocket::ConnectingState
+                   ? "Connection in progress" : d->socketErrorString.toLatin1().constData());
 #endif
             return false;
         }
@@ -388,27 +423,29 @@ bool QSymbianSocketEngine::connect(const QHostAddress &addr, quint16 port)
            addr.toString().toLatin1().constData(), port);
 #endif
 
-    socketState = QAbstractSocket::ConnectedState;
+    d->socketState = QAbstractSocket::ConnectedState;
+    d->fetchConnectionParameters();
     return true;
 }
 
 bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 {
+    Q_D(QSymbianSocketEngine);
     TInetAddr nativeAddr;
-    setPortAndAddress(nativeAddr, port, address);
+    d->setPortAndAddress(nativeAddr, port, address);
 
-    TInt err = nativeSocket.Bind(nativeAddr);
+    TInt err = d->nativeSocket.Bind(nativeAddr);
 
     if (err) {
         switch(errno) {
         case KErrInUse:
-            setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
+            d->setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
             break;
         case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+            d->setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
             break;
         case KErrNotSupported:
-            setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
+            d->setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
             break;
         default:
             break;
@@ -416,7 +453,7 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
         qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
-               address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
+               address.toString().toLatin1().constData(), port, d->socketErrorString.toLatin1().constData());
 #endif
 
         return false;
@@ -426,17 +463,20 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == true",
            address.toString().toLatin1().constData(), port);
 #endif
-    socketState = QAbstractSocket::BoundState;
+    d->socketState = QAbstractSocket::BoundState;
     return true;
 }
 
-bool QSymbianSocketEngine::listen(int backlog)
+bool QSymbianSocketEngine::listen()
 {
-    TInt err = nativeSocket.Listen(backlog);
+    Q_D(QSymbianSocketEngine);
+    // TODO the value 50 is from the QNativeSocketEngine. Maybe it's a bit too much
+    // for a mobile platform
+    TInt err = d->nativeSocket.Listen(50);
     if (err) {
         switch (errno) {
         case KErrInUse:
-            setError(QAbstractSocket::AddressInUseError,
+            d->setError(QAbstractSocket::AddressInUseError,
                      PortInuseErrorString);
             break;
         default:
@@ -444,27 +484,28 @@ bool QSymbianSocketEngine::listen(int backlog)
         }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QSymbianSocketEnginePrivate::nativeListen(%i) == false (%s)",
-               backlog, socketErrorString.toLatin1().constData());
+        qDebug("QSymbianSocketEnginePrivate::nativeListen() == false (%s)",
+               d->socketErrorString.toLatin1().constData());
 #endif
         return false;
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeListen(%i) == true", backlog);
+    qDebug("QSymbianSocketEnginePrivate::nativeListen() == true");
 #endif
 
-    socketState = QAbstractSocket::ListeningState;
+    d->socketState = QAbstractSocket::ListeningState;
     return true;
 }
 
 int QSymbianSocketEngine::accept()
 {
+    Q_D(QSymbianSocketEngine);
     RSocket blankSocket;
     //TODO: this is unbelievably broken, needs to be properly async
-    blankSocket.Open(socketServer);
+    blankSocket.Open(d->socketServer);
     TRequestStatus status;
-    nativeSocket.Accept(blankSocket, status);
+    d->nativeSocket.Accept(blankSocket, status);
     User::WaitForRequest(status);
     if(status.Int()) {
         qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
@@ -477,11 +518,12 @@ int QSymbianSocketEngine::accept()
 
 qint64 QSymbianSocketEngine::bytesAvailable() const
 {
+    Q_D(const QSymbianSocketEngine);
     int nbytes = 0;
     qint64 available = 0;
     // FIXME is this the right thing also for UDP?
     // What is expected for UDP, the length for the next packet I guess?
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
+    TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
     if(err)
         return 0;
     available = (qint64) nbytes;
@@ -494,34 +536,39 @@ qint64 QSymbianSocketEngine::bytesAvailable() const
 
 bool QSymbianSocketEngine::hasPendingDatagrams() const
 {
+    Q_D(const QSymbianSocketEngine);
     int nbytes;
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return err == KErrNone && nbytes > 0;
     //TODO: this is pretty horrible too...
+    // FIXME why?
 }
 
 qint64 QSymbianSocketEngine::pendingDatagramSize() const
 {
+    Q_D(const QSymbianSocketEngine);
     int nbytes;
-    TInt err = nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
     // Why = Could it be that this is about header lengths etc? if yes
     // this could be pretty broken, especially for IPv6
 }
 
-qint64 QSymbianSocketEngine::nativeReceiveDatagram(char *data, qint64 maxSize,
+
+qint64 QSymbianSocketEngine::readDatagram(char *data, qint64 maxSize,
                                                     QHostAddress *address, quint16 *port)
 {
+    Q_D(QSymbianSocketEngine);
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TInetAddr addr;
     TRequestStatus status; //TODO: OMG sync receive!
-    nativeSocket.RecvFrom(buffer, addr, 0, status);
+    d->nativeSocket.RecvFrom(buffer, addr, 0, status);
     User::WaitForRequest(status);
 
     if (status.Int()) {
-        setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
+        d->setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
     } else if (port || address) {
-        getPortAndAddress(addr, port, address);
+        d->getPortAndAddress(addr, port, address);
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
@@ -537,15 +584,17 @@ qint64 QSymbianSocketEngine::nativeReceiveDatagram(char *data, qint64 maxSize,
     return qint64(buffer.Length());
 }
 
-qint64 QSymbianSocketEngine::sendDatagram(const char *data, qint64 len,
+
+qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
                                                    const QHostAddress &host, quint16 port)
 {
+    Q_D(QSymbianSocketEngine);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TInetAddr addr;
-    setPortAndAddress(addr, port, host);
+    d->setPortAndAddress(addr, port, host);
     TSockXfrLength sentBytes;
     TRequestStatus status; //TODO: OMG sync send!
-    nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
+    d->nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
     User::WaitForRequest(status);
     TInt err = status.Int(); 
 
@@ -568,6 +617,7 @@ qint64 QSymbianSocketEngine::sendDatagram(const char *data, qint64 len,
     return qint64(sentBytes());
 }
 
+// FIXME check where the native socket engine called that..
 bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
 {
     localPort = 0;
@@ -611,7 +661,8 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
     TProtocolDesc protocol;
     TInt err = nativeSocket.Info(protocol);
     if (err) {
-        QAbstractSocket::UnknownSocketType;
+        // ?
+        // QAbstractSocket::UnknownSocketType;
     } else {
         switch (protocol.iProtocol) {
         case KProtocolInetTcp:
@@ -626,13 +677,13 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
         }
     }
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    QString socketProtocolStr = "UnknownProtocol";
-    if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = "IPv4Protocol";
-    else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = "IPv6Protocol";
+    QString socketProtocolStr = QLatin1String("UnknownProtocol");
+    if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = QLatin1String("IPv4Protocol");
+    else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = QLatin1String("IPv6Protocol");
 
-    QString socketTypeStr = "UnknownSocketType";
-    if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket";
-    else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket";
+    QString socketTypeStr = QLatin1String("UnknownSocketType");
+    if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = QLatin1String("TcpSocket");
+    else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = QLatin1String("UdpSocket");
 
     qDebug("QSymbianSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
            " peer == %s:%i, socket == %s - %s",
@@ -645,22 +696,25 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
 
 void QSymbianSocketEngine::close()
 {
+    Q_D(QSymbianSocketEngine);
 #if defined (QNATIVESOCKETENGINE_DEBUG)
     qDebug("QSymbianSocketEnginePrivate::nativeClose()");
 #endif
 
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
-    nativeSocket.Close();
-    QSymbianSocketManager::instance().removeSocket(nativeSocket);
+    d->nativeSocket.Close();
+    QSymbianSocketManager::instance().removeSocket(d->nativeSocket);
+
+    // FIXME set nativeSocket to 0 ?
 }
 
 qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 {
-    Q_Q(QSymbianSocketEngine);
+    Q_D(QSymbianSocketEngine);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TSockXfrLength sentBytes;
     TRequestStatus status; //TODO: OMG sync send!
-    nativeSocket.Send(buffer, 0, status, sentBytes);
+    d->nativeSocket.Send(buffer, 0, status, sentBytes);
     User::WaitForRequest(status);
     TInt err = status.Int(); 
 
@@ -668,16 +722,16 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
         switch (err) {
         case KErrDisconnected:
             sentBytes = -1;
-            setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
-            q->close();
+            d->setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
+            close();
             break;
         case KErrTooBig:
-            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            d->setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
             break;
         case KErrWouldBlock:
             sentBytes = 0;
         default:
-            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+            d->setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
         }
     }
 
@@ -693,8 +747,8 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 */
 qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
 {
-    Q_Q(QSymbianSocketEngine);
-    if (!q->isValid()) {
+    Q_D(QSymbianSocketEngine);
+    if (!isValid()) {
         qWarning("QSymbianSocketEnginePrivate::nativeRead: Invalid socket");
         return -1;
     }
@@ -702,7 +756,7 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TSockXfrLength received = 0;
     TRequestStatus status; //TODO: OMG sync receive!
-    nativeSocket.RecvOneOrMore(buffer, 0, status, received);
+    d->nativeSocket.RecvOneOrMore(buffer, 0, status, received);
     User::WaitForRequest(status);
     TInt err = status.Int();
     int r = received();
@@ -732,6 +786,7 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     return qint64(r);
 }
 
+// FIXME wait vs select
 int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
 {
     bool readyRead = false;
@@ -826,4 +881,36 @@ bool QSymbianSocketEngine::setMulticastInterface(const QNetworkInterface &iface)
     return false;
 }
 
+bool QSymbianSocketEnginePrivate::checkProxy(const QHostAddress &address)
+{
+    if (address == QHostAddress::LocalHost || address == QHostAddress::LocalHostIPv6)
+        return true;
+
+#if !defined(QT_NO_NETWORKPROXY)
+    QObject *parent = q_func()->parent();
+    QNetworkProxy proxy;
+    if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) {
+        proxy = socket->proxy();
+    } else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) {
+        proxy = server->proxy();
+    } else {
+        // no parent -> no proxy
+        return true;
+    }
+
+    if (proxy.type() == QNetworkProxy::DefaultProxy)
+        proxy = QNetworkProxy::applicationProxy();
+
+    if (proxy.type() != QNetworkProxy::DefaultProxy &&
+        proxy.type() != QNetworkProxy::NoProxy) {
+        // QNativeSocketEngine doesn't do proxies
+        setError(QAbstractSocket::UnsupportedSocketOperationError,
+                 InvalidProxyTypeString);
+        return false;
+    }
+#endif
+
+    return true;
+}
+
 QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index fd449ca..0b385a9 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -207,6 +207,8 @@ public:
     int nativeSelect(int timeout, bool checkRead, bool checkWrite,
                            bool *selectForRead, bool *selectForWrite) const;
 
+    bool createNewSocket(QAbstractSocket::SocketType socketType,
+                                             QAbstractSocket::NetworkLayerProtocol socketProtocol);
 
     bool checkProxy(const QHostAddress &address);
     bool fetchConnectionParameters();
-- 
cgit v0.12


From f71a7c4ef3c4c5a02730544d93200ef96d777aa0 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 11:49:09 +0100
Subject: QSymbianSocketEngine: More compile fixes

---
 src/network/socket/qsymbiansocketengine.cpp | 578 ++++++++++++++++++++++++----
 src/network/socket/qsymbiansocketengine_p.h |   3 +-
 src/network/socket/socket.pri               |  10 +-
 3 files changed, 510 insertions(+), 81 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 7957baf..43f0a36 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -61,6 +61,14 @@
 # include "qtcpserver.h"
 #endif
 
+#include <qabstracteventdispatcher.h>
+#include <qsocketnotifier.h>
+#include <qnetworkinterface.h>
+
+#include "qnativesocketengine_p.h"
+#include <private/qthread_p.h>
+#include <private/qobject_p.h>
+
 #define QNATIVESOCKETENGINE_DEBUG
 
 #if defined QNATIVESOCKETENGINE_DEBUG
@@ -173,70 +181,11 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 
         return false;
     }
-    // FIXME Set socket to nonblocking. While we are still a QNativeSocketEngine this is done already.
-    // Uncomment the following when we switch to QSymbianSocketEngine.
-    // setOption(NonBlockingSocketOption, 1)
 
     socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
     return true;
 }
 
-/*
-    Returns the value of the socket option \a opt.
-*/
-int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
-{
-    Q_D(const QSymbianSocketEngine);
-    if (!isValid())
-        return -1;
-
-    TUint n;
-    TUint level = KSOLSocket; // default
-
-    switch (opt) {
-    case QAbstractSocketEngine::ReceiveBufferSocketOption:
-        n = KSORecvBuf;
-        break;
-    case QAbstractSocketEngine::SendBufferSocketOption:
-        n = KSOSendBuf;
-        break;
-    case QAbstractSocketEngine::NonBlockingSocketOption:
-        n = KSONonBlockingIO;
-        break;
-    case QAbstractSocketEngine::BroadcastSocketOption:
-        return true; //symbian doesn't support or require this option
-    case QAbstractSocketEngine::AddressReusable:
-        level = KSolInetIp;
-        n = KSoReuseAddr;
-        break;
-    case QAbstractSocketEngine::BindExclusively:
-        return true;
-    case QAbstractSocketEngine::ReceiveOutOfBandData:
-        level = KSolInetTcp;
-        n = KSoTcpOobInline;
-        break;
-    case QAbstractSocketEngine::LowDelayOption:
-        level = KSolInetTcp;
-        n = KSoTcpNoDelay;
-        break;
-    case QAbstractSocketEngine::KeepAliveOption:
-        level = KSolInetTcp;
-        n = KSoTcpKeepAlive;
-        break;
-    default:
-        return -1;
-    }
-
-    int v = -1;
-    //GetOpt() is non const
-    TInt err = d->nativeSocket.GetOpt(n, level, v);
-    if (!err)
-        return v;
-
-    return -1;
-}
-
-
 void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
     nativeAddr.SetPort(port);
@@ -293,6 +242,150 @@ QSymbianSocketEngine::~QSymbianSocketEngine()
     // FIXME what else do we need to free?
 }
 
+/*!
+    Initializes a QSymbianSocketEngine by creating a new socket of type \a
+    socketType and network layer protocol \a protocol. Returns true on
+    success; otherwise returns false.
+
+    If the socket was already initialized, this function closes the
+    socket before reeinitializing it.
+
+    The new socket is non-blocking, and for UDP sockets it's also
+    broadcast enabled.
+*/
+bool QSymbianSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol protocol)
+{
+    Q_D(QSymbianSocketEngine);
+    if (isValid())
+        close();
+
+#if defined(QT_NO_IPV6)
+    if (protocol == QAbstractSocket::IPv6Protocol) {
+        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                    d->NoIpV6ErrorString);
+        return false;
+    }
+#endif
+
+    // Create the socket
+    if (!d->createNewSocket(socketType, protocol)) {
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        QString typeStr = QLatin1String("UnknownSocketType");
+        if (socketType == QAbstractSocket::TcpSocket) typeStr = QLatin1String("TcpSocket");
+        else if (socketType == QAbstractSocket::UdpSocket) typeStr = QLatin1String("UdpSocket");
+        QString protocolStr = QLatin1String("UnknownProtocol");
+        if (protocol == QAbstractSocket::IPv4Protocol) protocolStr = QLatin1String("IPv4Protocol");
+        else if (protocol == QAbstractSocket::IPv6Protocol) protocolStr = QLatin1String("IPv6Protocol");
+        qDebug("QNativeSocketEngine::initialize(type == %s, protocol == %s) failed: %s",
+               typeStr.toLatin1().constData(), protocolStr.toLatin1().constData(), d->socketErrorString.toLatin1().constData());
+#endif
+        return false;
+    }
+
+    // Make the socket nonblocking.
+    if (!setOption(NonBlockingSocketOption, 1)) {
+        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                    d->NonBlockingInitFailedErrorString);
+        close();
+        return false;
+    }
+
+    // Set the broadcasting flag if it's a UDP socket.
+    if (socketType == QAbstractSocket::UdpSocket
+        && !setOption(BroadcastSocketOption, 1)) {
+        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                    d->BroadcastingInitFailedErrorString);
+        close();
+        return false;
+    }
+
+
+    // Make sure we receive out-of-band data
+    if (socketType == QAbstractSocket::TcpSocket
+        && !setOption(ReceiveOutOfBandData, 1)) {
+        qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
+    }
+
+
+    d->socketType = socketType;
+    d->socketProtocol = protocol;
+    return true;
+}
+
+/*! \overload
+
+    Initializes the socket using \a socketDescriptor instead of
+    creating a new one. The socket type and network layer protocol are
+    determined automatically. The socket's state is set to \a
+    socketState.
+
+    If the socket type is either TCP or UDP, it is made non-blocking.
+    UDP sockets are also broadcast enabled.
+ */
+bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::SocketState socketState)
+{
+    Q_D(QSymbianSocketEngine);
+
+    if (isValid())
+        close();
+
+    d->socketDescriptor = socketDescriptor;
+
+    // determine socket type and protocol
+    if (!d->fetchConnectionParameters()) {
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+        qDebug("QNativeSocketEngine::initialize(socketDescriptor == %i) failed: %s",
+               socketDescriptor, d->socketErrorString.toLatin1().constData());
+#endif
+        d->socketDescriptor = -1;
+        return false;
+    }
+
+    if (d->socketType != QAbstractSocket::UnknownSocketType) {
+        // Make the socket nonblocking.
+        if (!setOption(NonBlockingSocketOption, 1)) {
+            d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                d->NonBlockingInitFailedErrorString);
+            close();
+            return false;
+        }
+
+        // Set the broadcasting flag if it's a UDP socket.
+        if (d->socketType == QAbstractSocket::UdpSocket
+            && !setOption(BroadcastSocketOption, 1)) {
+            d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+                d->BroadcastingInitFailedErrorString);
+            close();
+            return false;
+        }
+    }
+
+    d->socketState = socketState;
+    return true;
+}
+
+/*!
+    Returns true if the socket is valid; otherwise returns false. A
+    socket is valid if it has not been successfully initialized, or if
+    it has been closed.
+*/
+bool QSymbianSocketEngine::isValid() const
+{
+    Q_D(const QSymbianSocketEngine);
+    return d->socketDescriptor != -1;
+}
+
+
+/*!
+    Returns the native socket descriptor. Any use of this descriptor
+    stands the risk of being non-portable.
+*/
+int QSymbianSocketEngine::socketDescriptor() const
+{
+    Q_D(const QSymbianSocketEngine);
+    return d->socketDescriptor;
+}
+
 /*
     Sets the socket option \a opt to \a v.
 */
@@ -340,6 +433,61 @@ bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, in
     return (KErrNone == d->nativeSocket.SetOpt(n, level, v));
 }
 
+/*
+    Returns the value of the socket option \a opt.
+*/
+int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
+{
+    Q_D(const QSymbianSocketEngine);
+    if (!isValid())
+        return -1;
+
+    TUint n;
+    TUint level = KSOLSocket; // default
+
+    switch (opt) {
+    case QAbstractSocketEngine::ReceiveBufferSocketOption:
+        n = KSORecvBuf;
+        break;
+    case QAbstractSocketEngine::SendBufferSocketOption:
+        n = KSOSendBuf;
+        break;
+    case QAbstractSocketEngine::NonBlockingSocketOption:
+        n = KSONonBlockingIO;
+        break;
+    case QAbstractSocketEngine::BroadcastSocketOption:
+        return true; //symbian doesn't support or require this option
+    case QAbstractSocketEngine::AddressReusable:
+        level = KSolInetIp;
+        n = KSoReuseAddr;
+        break;
+    case QAbstractSocketEngine::BindExclusively:
+        return true;
+    case QAbstractSocketEngine::ReceiveOutOfBandData:
+        level = KSolInetTcp;
+        n = KSoTcpOobInline;
+        break;
+    case QAbstractSocketEngine::LowDelayOption:
+        level = KSolInetTcp;
+        n = KSoTcpNoDelay;
+        break;
+    case QAbstractSocketEngine::KeepAliveOption:
+        level = KSolInetTcp;
+        n = KSoTcpKeepAlive;
+        break;
+    default:
+        return -1;
+    }
+
+    int v = -1;
+    //GetOpt() is non const
+    TInt err = d->nativeSocket.GetOpt(n, level, v);
+    if (!err)
+        return v;
+
+    return -1;
+}
+
 bool QSymbianSocketEngine::connectToHostByName(const QString &name, quint16 port)
 {
     // FIXME for engines that support hostnames.. not for us then i guess.
@@ -347,6 +495,23 @@ bool QSymbianSocketEngine::connectToHostByName(const QString &name, quint16 port
     return false;
 }
 
+/*!
+    If there's a connection activity on the socket, process it. Then
+    notify our parent if there really was activity.
+*/
+void QSymbianSocketEngine::connectionNotification()
+{
+    // FIXME check if we really need to do it like that in Symbian
+    Q_D(QSymbianSocketEngine);
+    Q_ASSERT(state() == QAbstractSocket::ConnectingState);
+
+    connectToHost(d->peerAddress, d->peerPort);
+    if (state() != QAbstractSocket::ConnectingState) {
+        // we changed states
+        QAbstractSocketEngine::connectionNotification();
+    }
+}
+
 
 bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 {
@@ -359,7 +524,7 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 #if defined (QT_NO_IPV6)
     if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
         d->setError(QAbstractSocket::UnsupportedSocketOperationError,
-                    NoIpV6ErrorString);
+                    d->NoIpV6ErrorString);
         return false;
     }
 #endif
@@ -379,25 +544,25 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     if (err) {
         switch (err) {
         case KErrCouldNotConnect:
-            d->setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+            d->setError(QAbstractSocket::ConnectionRefusedError, d->ConnectionRefusedErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrTimedOut:
-            d->setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->ConnectionTimeOutErrorString);
             break;
         case KErrHostUnreach:
-            d->setError(QAbstractSocket::NetworkError, HostUnreachableErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->HostUnreachableErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrNetUnreach:
-            d->setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->NetworkUnreachableErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrInUse:
-            d->setError(QAbstractSocket::NetworkError, AddressInuseErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->AddressInuseErrorString);
             break;
         case KErrPermissionDenied:
-            d->setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+            d->setError(QAbstractSocket::SocketAccessError, d->AccessErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrNotSupported:
@@ -439,13 +604,13 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     if (err) {
         switch(errno) {
         case KErrInUse:
-            d->setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
+            d->setError(QAbstractSocket::AddressInUseError, d->AddressInuseErrorString);
             break;
         case KErrPermissionDenied:
-            d->setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+            d->setError(QAbstractSocket::SocketAccessError, d->AddressProtectedErrorString);
             break;
         case KErrNotSupported:
-            d->setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
+            d->setError(QAbstractSocket::UnsupportedSocketOperationError, d->OperationUnsupportedErrorString);
             break;
         default:
             break;
@@ -477,7 +642,7 @@ bool QSymbianSocketEngine::listen()
         switch (errno) {
         case KErrInUse:
             d->setError(QAbstractSocket::AddressInUseError,
-                     PortInuseErrorString);
+                     d->PortInuseErrorString);
             break;
         default:
             break;
@@ -566,7 +731,7 @@ qint64 QSymbianSocketEngine::readDatagram(char *data, qint64 maxSize,
     User::WaitForRequest(status);
 
     if (status.Int()) {
-        d->setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
+        d->setError(QAbstractSocket::NetworkError, d->ReceiveDatagramErrorString);
     } else if (port || address) {
         d->getPortAndAddress(addr, port, address);
     }
@@ -601,10 +766,10 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
     if (err) {
         switch (err) {
         case KErrTooBig:
-            setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            d->setError(QAbstractSocket::DatagramTooLargeError, d->DatagramTooLargeErrorString);
             break;
         default:
-            setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->SendDatagramErrorString);
         }
     }
 
@@ -722,16 +887,16 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
         switch (err) {
         case KErrDisconnected:
             sentBytes = -1;
-            d->setError(QAbstractSocket::RemoteHostClosedError, RemoteHostClosedErrorString);
+            d->setError(QAbstractSocket::RemoteHostClosedError, d->RemoteHostClosedErrorString);
             close();
             break;
         case KErrTooBig:
-            d->setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
+            d->setError(QAbstractSocket::DatagramTooLargeError, d->DatagramTooLargeErrorString);
             break;
         case KErrWouldBlock:
             sentBytes = 0;
         default:
-            d->setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
+            d->setError(QAbstractSocket::NetworkError, d->SendDatagramErrorString);
         }
     }
 
@@ -913,4 +1078,265 @@ bool QSymbianSocketEnginePrivate::checkProxy(const QHostAddress &address)
     return true;
 }
 
+// FIXME this is also in QNativeSocketEngine, unify it
+/*! \internal
+
+    Sets the error and error string if not set already. The only
+    interesting error is the first one that occurred, and not the last
+    one.
+*/
+void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, ErrorString errorString) const
+{
+    if (hasSetSocketError) {
+        // Only set socket errors once for one engine; expect the
+        // socket to recreate its engine after an error. Note: There's
+        // one exception: SocketError(11) bypasses this as it's purely
+        // a temporary internal error condition.
+        // Another exception is the way the waitFor*() functions set
+        // an error when a timeout occurs. After the call to setError()
+        // they reset the hasSetSocketError to false
+        return;
+    }
+    if (error != QAbstractSocket::SocketError(11))
+        hasSetSocketError = true;
+
+    socketError = error;
+
+    switch (errorString) {
+    case NonBlockingInitFailedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unable to initialize non-blocking socket");
+        break;
+    case BroadcastingInitFailedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unable to initialize broadcast socket");
+        break;
+    case NoIpV6ErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Attempt to use IPv6 socket on a platform with no IPv6 support");
+        break;
+    case RemoteHostClosedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("The remote host closed the connection");
+        break;
+    case TimeOutErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Network operation timed out");
+        break;
+    case ResourceErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Out of resources");
+        break;
+    case OperationUnsupportedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unsupported socket operation");
+        break;
+    case ProtocolUnsupportedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Protocol type not supported");
+        break;
+    case InvalidSocketErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Invalid socket descriptor");
+        break;
+    case HostUnreachableErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Host unreachable");
+        break;
+    case NetworkUnreachableErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Network unreachable");
+        break;
+    case AccessErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Permission denied");
+        break;
+    case ConnectionTimeOutErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Connection timed out");
+        break;
+    case ConnectionRefusedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Connection refused");
+        break;
+    case AddressInuseErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("The bound address is already in use");
+        break;
+    case AddressNotAvailableErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("The address is not available");
+        break;
+    case AddressProtectedErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("The address is protected");
+        break;
+    case DatagramTooLargeErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Datagram was too large to send");
+        break;
+    case SendDatagramErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unable to send a message");
+        break;
+    case ReceiveDatagramErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unable to receive a message");
+        break;
+    case WriteErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unable to write");
+        break;
+    case ReadErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Network error");
+        break;
+    case PortInuseErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Another socket is already listening on the same port");
+        break;
+    case NotSocketErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Operation on non-socket");
+        break;
+    case InvalidProxyTypeString:
+        socketErrorString = QSymbianSocketEngine::tr("The proxy type is invalid for this operation");
+        break;
+    case UnknownSocketErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("Unknown error");
+        break;
+    }
+}
+
+class QReadNotifier : public QSocketNotifier
+{
+public:
+    QReadNotifier(int fd, QSymbianSocketEngine *parent)
+        : QSocketNotifier(fd, QSocketNotifier::Read, parent)
+    { engine = parent; }
+protected:
+    QSymbianSocketEngine *engine;
+};
+
+bool QSymbianSocketEngine::isReadNotificationEnabled() const
+{
+    Q_D(const QSymbianSocketEngine);
+    // TODO
+    return d->readNotifier && d->readNotifier->isEnabled();
+}
+
+void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
+{
+    Q_D(QSymbianSocketEngine);
+    // TODO
+    if (d->readNotifier) {
+        d->readNotifier->setEnabled(enable);
+    } else if (enable && d->threadData->eventDispatcher) {
+        d->readNotifier = new QReadNotifier(d->socketDescriptor, this);
+        d->readNotifier->setEnabled(true);
+    }
+}
+
+
+class QWriteNotifier : public QSocketNotifier
+{
+public:
+    QWriteNotifier(int fd, QSymbianSocketEngine *parent)
+        : QSocketNotifier(fd, QSocketNotifier::Read, parent)
+    { engine = parent; }
+protected:
+    QSymbianSocketEngine *engine;
+};
+
+bool QSymbianSocketEngine::isWriteNotificationEnabled() const
+{
+    Q_D(const QSymbianSocketEngine);
+    // TODO
+    return d->writeNotifier && d->writeNotifier->isEnabled();
+}
+
+void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
+{
+    Q_D(QSymbianSocketEngine);
+    // TODO
+    if (d->writeNotifier) {
+        d->writeNotifier->setEnabled(enable);
+    } else if (enable && d->threadData->eventDispatcher) {
+        d->writeNotifier = new QWriteNotifier(d->socketDescriptor, this);
+        d->writeNotifier->setEnabled(true);
+    }
+}
+
+// FIXME do we really need this for symbian?
+bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
+{
+//    Q_D(const QSymbianSocketEngine);
+//    // TODO
+//    return d->exceptNotifier && d->exceptNotifier->isEnabled();
+    return false;
+}
+
+// FIXME do we really need this for symbian?
+void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
+{
+    Q_D(QSymbianSocketEngine);
+    // TODO
+//    if (d->exceptNotifier) {
+//        d->exceptNotifier->setEnabled(enable);
+//    } else if (enable && d->threadData->eventDispatcher) {
+//        d->exceptNotifier = new QExceptionNotifier(d->socketDescriptor, this);
+//        d->exceptNotifier->setEnabled(true);
+//    }
+}
+
+bool QSymbianSocketEngine::waitForRead(int msecs, bool *timedOut)
+{
+    Q_D(const QSymbianSocketEngine);
+
+    if (timedOut)
+        *timedOut = false;
+
+    int ret = d->nativeSelect(msecs, true);
+    if (ret == 0) {
+        if (timedOut)
+            *timedOut = true;
+        d->setError(QAbstractSocket::SocketTimeoutError,
+            d->TimeOutErrorString);
+        d->hasSetSocketError = false; // A timeout error is temporary in waitFor functions
+        return false;
+    } else if (state() == QAbstractSocket::ConnectingState) {
+        connectToHost(d->peerAddress, d->peerPort);
+    }
+
+    return ret > 0;
+}
+
+bool QSymbianSocketEngine::waitForWrite(int msecs, bool *timedOut)
+{
+    Q_D(QSymbianSocketEngine);
+
+    if (timedOut)
+        *timedOut = false;
+
+    int ret = d->nativeSelect(msecs, false);
+
+    if (ret == 0) {
+        if (timedOut)
+            *timedOut = true;
+        d->setError(QAbstractSocket::SocketTimeoutError,
+                    d->TimeOutErrorString);
+        d->hasSetSocketError = false; // A timeout error is temporary in waitFor functions
+        return false;
+    } else if (state() == QAbstractSocket::ConnectingState) {
+        connectToHost(d->peerAddress, d->peerPort);
+    }
+
+    return ret > 0;
+}
+
+bool QSymbianSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
+                                      bool checkRead, bool checkWrite,
+                                      int msecs, bool *timedOut)
+{
+    Q_D(QSymbianSocketEngine);
+
+    int ret = d->nativeSelect(msecs, checkRead, checkWrite, readyToRead, readyToWrite);
+
+    if (ret == 0) {
+        if (timedOut)
+            *timedOut = true;
+        d->setError(QAbstractSocket::SocketTimeoutError,
+                    d->TimeOutErrorString);
+        d->hasSetSocketError = false; // A timeout error is temporary in waitFor functions
+        return false;
+    } else if (state() == QAbstractSocket::ConnectingState) {
+        connectToHost(d->peerAddress, d->peerPort);
+    }
+
+    return ret > 0;
+}
+
+qint64 QSymbianSocketEngine::bytesToWrite() const
+{
+    // This is what the QNativeSocketEngine does
+    return 0;
+}
+
+
 QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 0b385a9..0c8bc53 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -165,6 +165,7 @@ public:
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
 
+    // FIXME this is duplicated from qnativesocketengine_p.h
     enum ErrorString {
         NonBlockingInitFailedErrorString,
         BroadcastingInitFailedErrorString,
@@ -194,13 +195,13 @@ public:
 
         UnknownSocketErrorString = -1
     };
+    void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
 #ifdef Q_OS_SYMBIAN
     void getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr);
     void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
     void setError(TInt symbianError);
 #endif
-    void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
     // FIXME
     int nativeSelect(int timeout, bool selectForRead) const;
diff --git a/src/network/socket/socket.pri b/src/network/socket/socket.pri
index 3356cdd..3eb54a2 100644
--- a/src/network/socket/socket.pri
+++ b/src/network/socket/socket.pri
@@ -1,7 +1,6 @@
 # Qt network socket
 
 HEADERS += socket/qabstractsocketengine_p.h \
-           socket/qnativesocketengine_p.h \
            socket/qhttpsocketengine_p.h \
            socket/qsocks5socketengine_p.h \
            socket/qabstractsocket.h \
@@ -15,7 +14,6 @@ HEADERS += socket/qabstractsocketengine_p.h \
            socket/qlocalsocket_p.h
 
 SOURCES += socket/qabstractsocketengine.cpp \
-           socket/qnativesocketengine.cpp \
            socket/qhttpsocketengine.cpp \
            socket/qsocks5socketengine.cpp \
            socket/qabstractsocket.cpp \
@@ -25,10 +23,14 @@ SOURCES += socket/qabstractsocketengine.cpp \
            socket/qlocalsocket.cpp \
            socket/qlocalserver.cpp
 
-unix:!symbian:SOURCES += socket/qnativesocketengine_unix.cpp
-
+# On Symbian we use QSymbianSocketEngine
 symbian:SOURCES += socket/qsymbiansocketengine.cpp
 symbian:HEADERS += socket/qsymbiansocketengine_p.h
+# On others we use QNativeSocketEngine
+!symbian:SOURCES += socket/qnativesocketengine.cpp
+!symbian:HEADERS += socket/qnativesocketengine_p.h
+
+unix:!symbian:SOURCES += socket/qnativesocketengine_unix.cpp
 
 unix:SOURCES +=  \
                 socket/qlocalsocket_unix.cpp \
-- 
cgit v0.12


From fc3f909c0cbbe15f2079edefe66ce52eb127a326 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 12:14:26 +0100
Subject: QSymbianSocketEngine: Always support IPv6

---
 src/network/kernel/qnetworkproxy_symbian.cpp | 17 +++++++------
 src/network/socket/qsymbiansocketengine.cpp  | 37 +---------------------------
 2 files changed, 11 insertions(+), 43 deletions(-)

diff --git a/src/network/kernel/qnetworkproxy_symbian.cpp b/src/network/kernel/qnetworkproxy_symbian.cpp
index 62266d1..7f53b4d 100644
--- a/src/network/kernel/qnetworkproxy_symbian.cpp
+++ b/src/network/kernel/qnetworkproxy_symbian.cpp
@@ -48,14 +48,17 @@ QT_BEGIN_NAMESPACE
 QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &)
 {
     // TODO: Get the current QNetworkSession which has the Symbian RConnection we use
-	// I am wondering if we already have a connected QNetworkSession when the code
-	// is run that retrieves the proxy (for QNetworkAccessManager it's somewhere called
-	// from createRequest() which might be too early...)
-	
-	// TODO: Get the proxy from that RConnection
+    // I am wondering if we already have a connected QNetworkSession when the code
+    // is run that retrieves the proxy (for QNetworkAccessManager it's somewhere called
+    // from createRequest() which might be too early...)
 
-	// See http://bugreports.qt.nokia.com/browse/QTBUG-13857 and http://bugreports.qt.nokia.com/browse/QTBUG-11016
-	// and the mails we have received.
+    // TODO: Get the proxy from that RConnection
+
+    // The QNetworkProxyQuery could have a QNetworkSession and then take the RConnection
+    // from there. If it does not have one, we have to use the "global RConnection".
+
+    // See http://bugreports.qt.nokia.com/browse/QTBUG-13857 and http://bugreports.qt.nokia.com/browse/QTBUG-11016
+    // and the mails we have received.
 
     // Default case: No network proxy found/needed
     return QList<QNetworkProxy>() << QNetworkProxy::NoProxy;
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 43f0a36..a937f7c 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -49,9 +49,7 @@
 #include "qnetworkinterface.h"
 #include <es_sock.h>
 #include <in_sock.h>
-#ifndef QT_NO_IPV6IFNAME
 #include <net/if.h>
-#endif
 
 #include <private/qcore_symbian_p.h>
 
@@ -112,7 +110,6 @@ static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
 
 void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
 {
-#if !defined(QT_NO_IPV6)
     if (a.Family() == KAfInet6) {
         Q_IPV6ADDR tmp;
         memcpy(&tmp, a.Ip6Address().u.iAddr8, sizeof(tmp));
@@ -120,21 +117,18 @@ void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16
             QHostAddress tmpAddress;
             tmpAddress.setAddress(tmp);
             *addr = tmpAddress;
-#ifndef QT_NO_IPV6IFNAME
             TPckgBuf<TSoInetIfQuery> query;
             query().iSrcAddr = a;
             TInt err = nativeSocket.GetOpt(KSoInetIfQueryBySrcAddr, KSolInetIfQuery, query);
             if(!err)
                 addr->setScopeId(qt_TDesC2QString(query().iName));
             else
-#endif
             addr->setScopeId(QString::number(a.Scope()));
         }
         if (port)
             *port = a.Port();
         return;
     }
-#endif
     if (port)
         *port = a.Port();
     if (addr) {
@@ -152,12 +146,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
                                          QAbstractSocket::NetworkLayerProtocol socketProtocol)
 {
     Q_Q(QSymbianSocketEngine);
-#ifndef QT_NO_IPV6
     TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
-#else
-    Q_UNUSED(socketProtocol);
-    TUint family = KAfInet;
-#endif
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
     TInt err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
@@ -189,9 +178,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
     nativeAddr.SetPort(port);
-#if !defined(QT_NO_IPV6)
     if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
-#ifndef QT_NO_IPV6IFNAME
         TPckgBuf<TSoInetIfQuery> query;
         query().iName = qt_QString2TPtrC(addr.scopeId());
         TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
@@ -199,16 +186,11 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
             nativeAddr.SetScope(query().iIndex);
         else
             nativeAddr.SetScope(0);
-#else
-        nativeAddr.SetScope(addr.scopeId().toInt());
-#endif
         Q_IPV6ADDR ip6 = addr.toIPv6Address();
         TIp6Addr v6addr;
         memcpy(v6addr.u.iAddr8, ip6.c, 16);
         nativeAddr.SetAddress(v6addr);
-    } else
-#endif
-    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
+    } else if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
         nativeAddr.SetAddress(addr.toIPv4Address());
     } else {
         qWarning("unsupported network protocol (%d)", addr.protocol());
@@ -259,14 +241,6 @@ bool QSymbianSocketEngine::initialize(QAbstractSocket::SocketType socketType, QA
     if (isValid())
         close();
 
-#if defined(QT_NO_IPV6)
-    if (protocol == QAbstractSocket::IPv6Protocol) {
-        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
-                    d->NoIpV6ErrorString);
-        return false;
-    }
-#endif
-
     // Create the socket
     if (!d->createNewSocket(socketType, protocol)) {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
@@ -521,13 +495,6 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     qDebug("QSymbianSocketEngine::connectToHost() : %d ", d->socketDescriptor);
 #endif
 
-#if defined (QT_NO_IPV6)
-    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
-        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
-                    d->NoIpV6ErrorString);
-        return false;
-    }
-#endif
     if (!d->checkProxy(addr))
         return false;
 
@@ -808,11 +775,9 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
     case KAfInet:
         socketProtocol = QAbstractSocket::IPv4Protocol;
         break;
-#if !defined (QT_NO_IPV6)
     case KAfInet6:
         socketProtocol = QAbstractSocket::IPv6Protocol;
         break;
-#endif
     default:
         socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
         break;
-- 
cgit v0.12


From 0975f046497deccd57b59aacded3ffc3c3c912f6 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 12:44:51 +0100
Subject: QNativeSocketEngine: Remove symbian code

---
 src/network/socket/qnativesocketengine_p.h      |   7 --
 src/network/socket/qnativesocketengine_unix.cpp | 105 +-----------------------
 2 files changed, 1 insertion(+), 111 deletions(-)

diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index 1f13433..b122722 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -60,13 +60,6 @@
 #  include <winsock2.h>
 #endif
 
-#ifdef Q_OS_SYMBIAN
-#include <private/qeventdispatcher_symbian_p.h>
-#include <unistd.h>
-#include <es_sock.h>
-#include <in_sock.h>
-#endif
-
 QT_BEGIN_NAMESPACE
 
 // Use our own defines and structs which we know are correct
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index aa55009..47a9084 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -65,12 +65,7 @@
 #include <ctype.h>
 #endif
 
-#ifdef Q_OS_SYMBIAN // ### TODO: Are these headers right?
-#include <sys/socket.h>
-#include <netinet/in.h>
-#else
 #include <netinet/tcp.h>
-#endif
 
 QT_BEGIN_NAMESPACE
 
@@ -1049,11 +1044,7 @@ void QNativeSocketEnginePrivate::nativeClose()
     qDebug("QNativeSocketEngine::nativeClose()");
 #endif
 
-#ifdef Q_OS_SYMBIAN
-    ::close(socketDescriptor);
-#else
-	qt_safe_close(socketDescriptor);
-#endif
+    qt_safe_close(socketDescriptor);
 }
 
 qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
@@ -1064,12 +1055,7 @@ qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len)
     qt_ignore_sigpipe();
 
     ssize_t writtenBytes;
-#ifdef Q_OS_SYMBIAN
-    // Symbian does not support signals natively and Open C returns EINTR when moving to offline
-    writtenBytes = ::write(socketDescriptor, data, len);
-#else
     writtenBytes = qt_safe_write(socketDescriptor, data, len);
-#endif
 
     if (writtenBytes < 0) {
         switch (errno) {
@@ -1109,11 +1095,7 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
     }
 
     ssize_t r = 0;
-#ifdef Q_OS_SYMBIAN
-    r = ::read(socketDescriptor, data, maxSize);
-#else
     r = qt_safe_read(socketDescriptor, data, maxSize);
-#endif
 
     if (r < 0) {
         r = -1;
@@ -1130,9 +1112,6 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
         case EIO:
             //error string is now set in read(), not here in nativeRead()
             break;
-#ifdef Q_OS_SYMBIAN
-        case EPIPE:
-#endif
         case ECONNRESET:
 #if defined(Q_OS_VXWORKS)
         case ESHUTDOWN:
@@ -1163,40 +1142,11 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) co
     tv.tv_sec = timeout / 1000;
     tv.tv_usec = (timeout % 1000) * 1000;
 
-#ifdef Q_OS_SYMBIAN
-    fd_set fdexception;
-    FD_ZERO(&fdexception);
-    FD_SET(socketDescriptor, &fdexception);
-#endif
-
     int retval;
     if (selectForRead)
-#ifdef Q_OS_SYMBIAN
-        retval = ::select(socketDescriptor + 1, &fds, 0, &fdexception, timeout < 0 ? 0 : &tv);
-#else
         retval = qt_safe_select(socketDescriptor + 1, &fds, 0, 0, timeout < 0 ? 0 : &tv);
-#endif
     else
-#ifdef Q_OS_SYMBIAN
-        retval = ::select(socketDescriptor + 1, 0, &fds, &fdexception, timeout < 0 ? 0 : &tv);
-#else
         retval = qt_safe_select(socketDescriptor + 1, 0, &fds, 0, timeout < 0 ? 0 : &tv);
-#endif
-
-
-#ifdef Q_OS_SYMBIAN
-        bool selectForExec = false;
-        if(retval != 0) {
-            if(retval < 0) {
-                qWarning("nativeSelect(....) returned < 0 for socket %d", socketDescriptor);
-            }
-            selectForExec = FD_ISSET(socketDescriptor, &fdexception);
-        }
-        if(selectForExec) {
-            qWarning("nativeSelect (selectForRead %d, retVal %d, errno %d) Unexpected exception for fd %d",
-                    selectForRead, retval, errno, socketDescriptor);
-            }
-#endif
 
     return retval;
 }
@@ -1214,65 +1164,12 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool c
     if (checkWrite)
         FD_SET(socketDescriptor, &fdwrite);
 
-#ifdef Q_OS_SYMBIAN
-    fd_set fdexception;
-    FD_ZERO(&fdexception);
-    FD_SET(socketDescriptor, &fdexception);
-#endif
-
     struct timeval tv;
     tv.tv_sec = timeout / 1000;
     tv.tv_usec = (timeout % 1000) * 1000;
 
     int ret;
-#ifndef Q_OS_SYMBIAN
     ret = qt_safe_select(socketDescriptor + 1, &fdread, &fdwrite, 0, timeout < 0 ? 0 : &tv);
-#else
-    QElapsedTimer timer;
-    timer.start();
-
-    do {
-        ret = ::select(socketDescriptor + 1, &fdread, &fdwrite, &fdexception, timeout < 0 ? 0 : &tv);
-        bool selectForExec = false;
-        if(ret != 0) {
-            if(ret < 0) {
-                qWarning("nativeSelect(....) returned < 0 for socket %d", socketDescriptor);
-            }
-            selectForExec = FD_ISSET(socketDescriptor, &fdexception);
-        }
-        if(selectForExec) {
-            qWarning("nativeSelect (checkRead %d, checkWrite %d, ret %d, errno %d): Unexpected expectfds ready in fd %d",
-                    checkRead, checkWrite, ret, errno, socketDescriptor);
-            if (checkWrite){
-                FD_CLR(socketDescriptor, &fdread);
-                FD_SET(socketDescriptor, &fdwrite);
-            } else if (checkRead)
-                FD_SET(socketDescriptor, &fdread);
-
-
-            if ((ret == -1) && ( errno == ECONNREFUSED || errno == EPIPE ))
-                ret = 1;
-
-        }
-
-        if (ret != -1 || errno != EINTR) {
-            break;
-        }
-
-        if (timeout > 0) {
-            // recalculate the timeout
-            int t = timeout - timer.elapsed();
-            if (t < 0) {
-                // oops, timeout turned negative?
-                ret = -1;
-                break;
-            }
-
-            tv.tv_sec = t / 1000;
-            tv.tv_usec = (t % 1000) * 1000;
-        }
-    } while (true);
-#endif
 
     if (ret <= 0)
         return ret;
-- 
cgit v0.12


From 4b31d0c75755a57667d5d76e44e4b8653aa15219 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 12:50:50 +0100
Subject: Symbian: Enable IPv6 again.

The native QSymbianSocketEngine supports IPv6 just fine.

This reverts commit 0c7d5d106152924dedd822da8c90d9f3247a9947.
---
 configure                        | 8 ++------
 tools/configure/configureapp.cpp | 4 ----
 2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/configure b/configure
index 05b5629..401299b 100755
--- a/configure
+++ b/configure
@@ -6463,13 +6463,9 @@ fi
 
 # find if the platform supports IPv6
 if [ "$CFG_IPV6" != "no" ]; then
-    #
-    # We accidently enabled IPv6 for Qt Symbian in 4.6.x. However the underlying OpenC does not fully support IPV6.
-    # Therefore for 4.7.1 and following we disable it until OpenC either supports it or we have the native Qt
-    # symbian socket engine.
-    #
     if [ "$XPLATFORM_SYMBIAN" = "yes" ]; then
-        CFG_IPV6=no
+        #IPV6 should always be enabled for Symbian release
+        CFG_IPV6=yes
     elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/ipv6 "IPv6" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
         CFG_IPV6=yes
     else
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 479fd4c..f4a558d 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -1522,10 +1522,6 @@ void Configure::applySpecSpecifics()
         dictionary[ "QT3SUPPORT" ]          = "no";
         dictionary[ "OPENGL" ]              = "no";
         dictionary[ "OPENSSL" ]             = "yes";
-        // We accidently enabled IPv6 for Qt Symbian in 4.6.x. However the underlying OpenC does not fully support IPV6.
-        // Therefore for 4.7.1 and following we disable it until OpenC either supports it or we have the native Qt
-        // symbian socket engine.
-        dictionary[ "IPV6" ]                = "no";
         dictionary[ "STL" ]                 = "yes";
         dictionary[ "EXCEPTIONS" ]          = "yes";
         dictionary[ "RTTI" ]                = "yes";
-- 
cgit v0.12


From f237b3ff201c271c386c912f496069825fd5cc12 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 13:02:16 +0100
Subject: Symbian: Also force IPv6 on Windows configure.exe

---
 tools/configure/configureapp.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index f4a558d..62e7859 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -1522,6 +1522,8 @@ void Configure::applySpecSpecifics()
         dictionary[ "QT3SUPPORT" ]          = "no";
         dictionary[ "OPENGL" ]              = "no";
         dictionary[ "OPENSSL" ]             = "yes";
+        // On Symbian we now always will have IPv6 with no chance to disable it
+        dictionary[ "IPV6" ]                = "yes";
         dictionary[ "STL" ]                 = "yes";
         dictionary[ "EXCEPTIONS" ]          = "yes";
         dictionary[ "RTTI" ]                = "yes";
-- 
cgit v0.12


From 664bd5adea54a2235414878d9cc4f1197fa2bd53 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 8 Dec 2010 13:06:14 +0000
Subject: Fix compile errors

including qnativesocketengine_p.h causes link errors

Reviewed-by: Markus Goetz
---
 src/network/socket/qabstractsocket_p.h      | 2 +-
 src/network/socket/qlocalserver_p.h         | 2 +-
 src/network/socket/qlocalsocket_p.h         | 2 +-
 src/network/socket/qsymbiansocketengine.cpp | 1 -
 src/network/socket/qsymbiansocketengine_p.h | 2 --
 src/network/socket/qtcpserver.cpp           | 2 +-
 6 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 8ca83fc..732d609 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -59,7 +59,7 @@
 #include "QtCore/qtimer.h"
 #include "private/qringbuffer_p.h"
 #include "private/qiodevice_p.h"
-#include "private/qnativesocketengine_p.h"
+#include "private/qabstractsocketengine_p.h"
 #include "qnetworkproxy.h"
 
 QT_BEGIN_NAMESPACE
diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h
index 4f92b64..e9c8563 100644
--- a/src/network/socket/qlocalserver_p.h
+++ b/src/network/socket/qlocalserver_p.h
@@ -65,7 +65,7 @@
 #   include <qt_windows.h>
 #   include <private/qwineventnotifier_p.h>
 #else
-#   include <private/qnativesocketengine_p.h>
+#   include <qabstractsocketengine_p.h>
 #   include <qsocketnotifier.h>
 #endif
 
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index 57ca3c2..7b912fb 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -67,7 +67,7 @@
 #   include "private/qringbuffer_p.h"
 #   include <private/qwineventnotifier_p.h>
 #else
-#   include "private/qnativesocketengine_p.h"
+#   include "private/qabstractsocketengine_p.h"
 #   include <qtcpsocket.h>
 #   include <qsocketnotifier.h>
 #   include <errno.h>
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index a937f7c..1d2a11b 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -63,7 +63,6 @@
 #include <qsocketnotifier.h>
 #include <qnetworkinterface.h>
 
-#include "qnativesocketengine_p.h"
 #include <private/qthread_p.h>
 #include <private/qobject_p.h>
 
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 0c8bc53..3111442 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -154,14 +154,12 @@ public:
     ~QSymbianSocketEnginePrivate();
 
     int socketDescriptor;
-#ifdef Q_OS_SYMBIAN
     mutable RSocket nativeSocket;
     // From QtCore:
     RSocketServ& socketServer;
     // From QtCore, check lifetime issues, also should be pulling this out of a QNetworkSession somehow:
     RConnection *connection;
     mutable RTimer selectTimer;
-#endif
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
 
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index 0640c7c..642983f 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -105,7 +105,7 @@
 #include "qhostaddress.h"
 #include "qlist.h"
 #include "qpointer.h"
-#include "qnativesocketengine_p.h"
+#include "qabstractsocketengine_p.h"
 #include "qtcpserver.h"
 #include "qtcpsocket.h"
 #include "qnetworkproxy.h"
-- 
cgit v0.12


From a50a764095f4894790dcb5bdfeb845ca65da7501 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 14:38:19 +0100
Subject: Remove more Q_OS_SYMBIAN stuff from network code

---
 src/network/kernel/qhostinfo_unix.cpp           | 13 +----
 src/network/socket/qnativesocketengine_unix.cpp | 64 +++----------------------
 src/network/socket/qsymbiansocketengine_p.h     |  2 -
 3 files changed, 7 insertions(+), 72 deletions(-)

diff --git a/src/network/kernel/qhostinfo_unix.cpp b/src/network/kernel/qhostinfo_unix.cpp
index 5ca15a3..cb1ec43 100644
--- a/src/network/kernel/qhostinfo_unix.cpp
+++ b/src/network/kernel/qhostinfo_unix.cpp
@@ -147,7 +147,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     if (address.setAddress(hostName)) {
         // Reverse lookup
 // Reverse lookups using getnameinfo are broken on darwin, use gethostbyaddr instead.
-#if !defined (QT_NO_GETADDRINFO) && !defined (Q_OS_DARWIN) && !defined (Q_OS_SYMBIAN)
+#if !defined (QT_NO_GETADDRINFO) && !defined (Q_OS_DARWIN)
         sockaddr_in sa4;
 #ifndef QT_NO_IPV6
         sockaddr_in6 sa6;
@@ -208,23 +208,12 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
 #ifdef Q_ADDRCONFIG
     hints.ai_flags = Q_ADDRCONFIG;
 #endif
-#ifdef Q_OS_SYMBIAN
-#   ifdef QHOSTINFO_DEBUG
-        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
-#   endif
-#endif
 
     int result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
 # ifdef Q_ADDRCONFIG
     if (result == EAI_BADFLAGS) {
         // if the lookup failed with AI_ADDRCONFIG set, try again without it
         hints.ai_flags = 0;
-#ifdef Q_OS_SYMBIAN
-#   ifdef QHOSTINFO_DEBUG
-        qDebug() << "Setting flags: 'hints.ai_flags &= AI_V4MAPPED | AI_ALL'";
-#   endif
-        hints.ai_flags &= AI_V4MAPPED | AI_ALL;
-#endif
         result = getaddrinfo(aceHostname.constData(), 0, &hints, &res);
     }
 # endif
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 47a9084..1aaa6e6 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -169,11 +169,8 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
     int protocol = AF_INET;
 #endif
     int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM;
-#ifdef Q_OS_SYMBIAN
-    int socket = ::socket(protocol, type, 0);
-#else
+
 	int socket = qt_safe_socket(protocol, type, 0);
-#endif
 
     if (socket <= 0) {
         switch (errno) {
@@ -318,11 +315,9 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
         }
 #else // Q_OS_VXWORKS
         int onoff = 1;
-#ifdef Q_OS_SYMBIAN
-        if (::ioctl(socketDescriptor, FIONBIO, &onoff) < 0) {
-#else
+
         if (qt_safe_ioctl(socketDescriptor, FIONBIO, &onoff) < 0) {
-#endif
+
 #ifdef QNATIVESOCKETENGINE_DEBUG
             perror("QNativeSocketEnginePrivate::setOption(): ioctl(FIONBIO, 1) failed");
 #endif
@@ -332,7 +327,7 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
         return true;
     }
     case QNativeSocketEngine::AddressReusable:
-#if defined(SO_REUSEPORT) && !defined(Q_OS_SYMBIAN)
+#if defined(SO_REUSEPORT)
         n = SO_REUSEPORT;
 #else
         n = SO_REUSEADDR;
@@ -425,11 +420,8 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
     } else {
         // unreachable
     }
-#ifdef Q_OS_SYMBIAN
-    int connectResult = ::connect(socketDescriptor, sockAddrPtr, sockAddrSize);
-#else
+
     int connectResult = qt_safe_connect(socketDescriptor, sockAddrPtr, sockAddrSize);
-#endif
     if (connectResult == -1) {
         switch (errno) {
         case EISCONN:
@@ -472,9 +464,6 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint16
         case EBADF:
         case EFAULT:
         case ENOTSOCK:
-#ifdef Q_OS_SYMBIAN
-        case EPIPE:
-#endif
             socketState = QAbstractSocket::UnconnectedState;
         default:
             break;
@@ -573,11 +562,7 @@ bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16
 
 bool QNativeSocketEnginePrivate::nativeListen(int backlog)
 {
-#ifdef Q_OS_SYMBIAN
-    if (::listen(socketDescriptor, backlog) < 0) {
-#else
     if (qt_safe_listen(socketDescriptor, backlog) < 0) {
-#endif
         switch (errno) {
         case EADDRINUSE:
             setError(QAbstractSocket::AddressInUseError,
@@ -604,21 +589,12 @@ bool QNativeSocketEnginePrivate::nativeListen(int backlog)
 
 int QNativeSocketEnginePrivate::nativeAccept()
 {
-#ifdef Q_OS_SYMBIAN
-    int acceptedDescriptor = ::accept(socketDescriptor, 0, 0);
-#else
     int acceptedDescriptor = qt_safe_accept(socketDescriptor, 0, 0);
-#endif
     //check if we have valid descriptor at all
     if(acceptedDescriptor > 0) {
         // Ensure that the socket is closed on exec*()
         ::fcntl(acceptedDescriptor, F_SETFD, FD_CLOEXEC);
     }
-#ifdef Q_OS_SYMBIAN
-    else {
-        qWarning("QNativeSocketEnginePrivate::nativeAccept() - acceptedDescriptor <= 0");
-    }
-#endif
 
     return acceptedDescriptor;
 }
@@ -793,11 +769,7 @@ qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const
     int nbytes = 0;
     // gives shorter than true amounts on Unix domain sockets.
     qint64 available = 0;
-#ifdef Q_OS_SYMBIAN
-	if (::ioctl(socketDescriptor, FIONREAD, (char *) &nbytes) >= 0)
-#else
     if (qt_safe_ioctl(socketDescriptor, FIONREAD, (char *) &nbytes) >= 0)
-#endif
         available = (qint64) nbytes;
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
@@ -816,15 +788,10 @@ bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
     // Peek 0 bytes into the next message. The size of the message may
     // well be 0, so we can't check recvfrom's return value.
     ssize_t readBytes;
-#ifdef Q_OS_SYMBIAN
-    char c;
-    readBytes = ::recvfrom(socketDescriptor, &c, 1, MSG_PEEK, &storage.a, &storageSize);
-#else
     do {
         char c;
         readBytes = ::recvfrom(socketDescriptor, &c, 1, MSG_PEEK, &storage.a, &storageSize);
     } while (readBytes == -1 && errno == EINTR);
-#endif
 
     // If there's no error, or if our buffer was too small, there must be a
     // pending datagram.
@@ -837,14 +804,6 @@ bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
     return result;
 }
 
-#ifdef Q_OS_SYMBIAN
-qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
-{
-    size_t nbytes = 0;
-    ::ioctl(socketDescriptor, E32IONREAD, (char *) &nbytes);
-    return qint64(nbytes-28);
-}
-#else
 qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
 {
     QVarLengthArray<char, 8192> udpMessagePeekBuffer(8192);
@@ -871,7 +830,7 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
 
     return qint64(recvResult);
 }
-#endif
+
 qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxSize,
                                                     QHostAddress *address, quint16 *port)
 {
@@ -881,17 +840,11 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS
     sz = sizeof(aa);
 
     ssize_t recvFromResult = 0;
-#ifdef Q_OS_SYMBIAN
-    char c;
-    recvFromResult = ::recvfrom(socketDescriptor, maxSize ? data : &c, maxSize ? maxSize : 1,
-                                0, &aa.a, &sz);
-#else
     do {
         char c;
         recvFromResult = ::recvfrom(socketDescriptor, maxSize ? data : &c, maxSize ? maxSize : 1,
                                     0, &aa.a, &sz);
     } while (recvFromResult == -1 && errno == EINTR);
-#endif
 
     if (recvFromResult == -1) {
         setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
@@ -940,13 +893,8 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l
 
     // ignore the SIGPIPE signal
     qt_ignore_sigpipe();
-#ifdef Q_OS_SYMBIAN
-    ssize_t sentBytes = ::sendto(socketDescriptor, data, len,
-                                       0, sockAddrPtr, sockAddrSize);
-#else
     ssize_t sentBytes = qt_safe_sendto(socketDescriptor, data, len,
                                        0, sockAddrPtr, sockAddrSize);
-#endif
 
     if (sentBytes < 0) {
         switch (errno) {
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 3111442..43e5e61 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -195,11 +195,9 @@ public:
     };
     void setError(QAbstractSocket::SocketError error, ErrorString errorString) const;
 
-#ifdef Q_OS_SYMBIAN
     void getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr);
     void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
     void setError(TInt symbianError);
-#endif
 
     // FIXME
     int nativeSelect(int timeout, bool selectForRead) const;
-- 
cgit v0.12


From a97d9d6f2038ddab25d3721817b121dcea61f571 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 15:57:34 +0100
Subject: Added manual test for socketengine development

---
 tests/manual/socketengine/main.cpp         | 110 +++++++++++++++++++++++++++++
 tests/manual/socketengine/socketengine.pro |  13 ++++
 2 files changed, 123 insertions(+)
 create mode 100644 tests/manual/socketengine/main.cpp
 create mode 100644 tests/manual/socketengine/socketengine.pro

diff --git a/tests/manual/socketengine/main.cpp b/tests/manual/socketengine/main.cpp
new file mode 100644
index 0000000..f368573
--- /dev/null
+++ b/tests/manual/socketengine/main.cpp
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <qtest.h>
+#include <QtTest/QtTest>
+#include <QtNetwork/qnetworkreply.h>
+#include <QtNetwork/qnetworkrequest.h>
+#include <QtNetwork/qnetworkaccessmanager.h>
+#include "../../auto/network-settings.h"
+#include <QtNetwork>
+#include <QDebug>
+#include <private/qabstractsocketengine_p.h>
+#include <cstdio>
+#include <strings.h>
+
+const int bufsize = 16*1024;
+char buf[bufsize];
+
+int main(int argc, char**argv)
+{
+    // create it
+    QAbstractSocketEngine *socketEngine =
+            QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, QNetworkProxy(QNetworkProxy::NoProxy), 0);
+    if (!socketEngine) {
+        qDebug() << "could not create engine";
+        exit(1);
+    }
+
+    // initialize it
+    bool initialized = socketEngine->initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol);
+    if (!initialized) {
+        qDebug() << "not able to initialize engine";
+        exit(1);
+    }
+
+    // wait for connected
+    socketEngine->connectToHost(QHostAddress("74.125.77.99"), 80); // google
+    bool readyToRead = false;
+    bool readyToWrite = false;
+    socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, true, 10*1000);
+    if (readyToWrite) {
+        // write the request
+        QByteArray request("GET /robots.txt HTTP/1.0\r\n\r\n");
+        int ret = socketEngine->write(request.constData(), request.length());
+        if (ret == request.length()) {
+            // read the response in a loop
+            do {
+                bool waitReadResult = socketEngine->waitForRead(10*1000);
+                int available = socketEngine->bytesAvailable();
+                if (waitReadResult == true && available == 0) {
+                    // disconnected
+                    exit(0);
+                }
+                bzero(buf, bufsize);
+                ret = socketEngine->read(buf, available);
+                if (ret > 0) {
+                    printf("%s", buf);
+                } else {
+                    // some failure when reading
+                    exit(1);
+                }
+            } while (1);
+        } else {
+            qDebug() << "failed writing";
+        }
+    } else {
+        qDebug() << "failed connecting";
+    }
+    delete socketEngine;
+}
+
diff --git a/tests/manual/socketengine/socketengine.pro b/tests/manual/socketengine/socketengine.pro
new file mode 100644
index 0000000..96d0055
--- /dev/null
+++ b/tests/manual/socketengine/socketengine.pro
@@ -0,0 +1,13 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_socketengine
+DEPENDPATH += .
+INCLUDEPATH += .
+
+QT -= gui
+QT += network
+
+CONFIG += release
+
+# Input
+SOURCES += main.cpp
-- 
cgit v0.12


From 12974d3dad6a8db29479dd1bbf9d280081d60d58 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 8 Dec 2010 16:47:07 +0000
Subject: Implement sync & async select for symbian socket engine

Async select is implemented with an active object rather than using the
event dispatcher.
Sync select is implemented using User::WaitForRequest to block the thread
without requiring an event loop.
In both cases, RSocket's KIoctlSelect is used to query the socket state.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 253 +++++++++++++++++++++++-----
 src/network/socket/qsymbiansocketengine_p.h |  36 ++++
 2 files changed, 244 insertions(+), 45 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 1d2a11b..ad1164a 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -938,49 +938,65 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) c
 int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
                        bool *selectForRead, bool *selectForWrite) const
 {
+    //cancel asynchronous notifier (only one IOCTL allowed at a time)
+    if (asyncSelect)
+        asyncSelect->Cancel();
     //TODO: implement
     //as above, but checking both read and write status at the same time
-    if (!selectTimer.Handle())
-        qt_symbian_throwIfError(selectTimer.CreateLocal());
-    TRequestStatus timerStat;
-    selectTimer.HighRes(timerStat, timeout * 1000);
-    TRequestStatus* readStat = 0;
-    TRequestStatus* writeStat = 0;
-    TRequestStatus* array[3];
-    array[0] = &timerStat;
-    int count = 1;
-    if (checkRead) {
-        //TODO: get from read AO
-        //readStat = ?
-        array[count++] = readStat;
-    }
-    if (checkWrite) {
-        //TODO: get from write AO
-        //writeStat = ?
-        array[count++] = writeStat;
-    }
-    // TODO: for selecting, we can use getOpt(KSOSelectPoll) to get the select result
-    // and KIOCtlSelect for the selecting.
 
-    User::WaitForNRequest(array, count);
-    //IMPORTANT - WaitForNRequest only decrements the thread semaphore once, although more than one status may have completed.
-    if (timerStat.Int() != KRequestPending) {
-        //timed out
-        return 0;
+    TPckgBuf<TUint> selectFlags;
+    selectFlags() = KSockSelectExcept;
+    if (selectForRead)
+        selectFlags() |= KSockSelectRead;
+    if (selectForWrite)
+        selectFlags() |= KSockSelectWrite;
+    TRequestStatus selectStat;
+    nativeSocket.Ioctl(KIOctlSelect, selectStat, &selectFlags, KSOLSocket);
+
+    if (timeout < 0)
+        User::WaitForRequest(selectStat); //negative means no timeout
+    else {
+        if (!selectTimer.Handle())
+            qt_symbian_throwIfError(selectTimer.CreateLocal());
+        TRequestStatus timerStat;
+        selectTimer.HighRes(timerStat, timeout * 1000);
+        User::WaitForRequest(timerStat, selectStat);
+        if (selectStat == KRequestPending) {
+            nativeSocket.CancelIoctl();
+            //CancelIoctl completes the request (most likely with KErrCancel)
+            //We need to wait for this to keep the thread semaphore balanced (or active scheduler will panic)
+            User::WaitForRequest(selectStat);
+            //restart asynchronous notifier (only one IOCTL allowed at a time)
+            if (asyncSelect)
+                asyncSelect->IssueRequest();
+            return 0; //timeout
+        } else {
+            selectTimer.Cancel();
+            User::WaitForRequest(timerStat);
+        }
     }
-    selectTimer.Cancel();
-    User::WaitForRequest(timerStat);
 
-    if(readStat && readStat->Int() != KRequestPending) {
+    if (selectStat != KErrNone)
+        return selectStat.Int();
+    if (selectFlags() & KSockSelectExcept) {
+        TInt err;
+        nativeSocket.GetOpt(KSOSelectLastError, KSOLSocket, err);
+        //restart asynchronous notifier (only one IOCTL allowed at a time)
+        if (asyncSelect)
+            asyncSelect->IssueRequest(); //TODO: in error case should we restart or not?
+        return err;
+    }
+    if (selectFlags() & KSockSelectRead) {
         Q_ASSERT(checkRead && selectForRead);
-        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
         *selectForRead = true;
     }
-    if(writeStat && writeStat->Int() != KRequestPending) {
+    if (selectFlags() & KSockSelectWrite) {
         Q_ASSERT(checkWrite && selectForWrite);
-        //TODO: cancel the AO, but call its RunL anyway? looking for an UnsetActive()
         *selectForWrite = true;
     }
+    //restart asynchronous notifier (only one IOCTL allowed at a time)
+    if (asyncSelect)
+        asyncSelect->IssueRequest();
     return 1;
 }
 
@@ -1150,14 +1166,26 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
 
 class QReadNotifier : public QSocketNotifier
 {
+    friend class QAsyncSelect;
 public:
     QReadNotifier(int fd, QSymbianSocketEngine *parent)
         : QSocketNotifier(fd, QSocketNotifier::Read, parent)
     { engine = parent; }
 protected:
+    bool event(QEvent *);
+
     QSymbianSocketEngine *engine;
 };
 
+bool QReadNotifier::event(QEvent *e)
+{
+    if (e->type() == QEvent::SockAct) {
+        engine->readNotification();
+        return true;
+    }
+    return QSocketNotifier::event(e);
+}
+
 bool QSymbianSocketEngine::isReadNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
@@ -1172,22 +1200,44 @@ void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
     if (d->readNotifier) {
         d->readNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
-        d->readNotifier = new QReadNotifier(d->socketDescriptor, this);
+        QReadNotifier *rn = new QReadNotifier(d->socketDescriptor, this);
+        d->readNotifier = rn;
+        if (!d->asyncSelect)
+            d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        d->asyncSelect->setReadNotifier(rn);
         d->readNotifier->setEnabled(true);
     }
+    // TODO: what do we do if event dispatcher doesn't exist yet?
+    if (d->asyncSelect)
+        d->asyncSelect->IssueRequest();
 }
 
 
 class QWriteNotifier : public QSocketNotifier
 {
+    friend class QAsyncSelect;
 public:
     QWriteNotifier(int fd, QSymbianSocketEngine *parent)
-        : QSocketNotifier(fd, QSocketNotifier::Read, parent)
+        : QSocketNotifier(fd, QSocketNotifier::Write, parent)
     { engine = parent; }
 protected:
+    bool event(QEvent *);
+
     QSymbianSocketEngine *engine;
 };
 
+bool QWriteNotifier::event(QEvent *e)
+{
+    if (e->type() == QEvent::SockAct) {
+        if (engine->state() == QAbstractSocket::ConnectingState)
+            engine->connectionNotification();
+        else
+            engine->writeNotification();
+        return true;
+    }
+    return QSocketNotifier::event(e);
+}
+
 bool QSymbianSocketEngine::isWriteNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
@@ -1202,17 +1252,48 @@ void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
     if (d->writeNotifier) {
         d->writeNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
-        d->writeNotifier = new QWriteNotifier(d->socketDescriptor, this);
+        QWriteNotifier *wn = new QWriteNotifier(d->socketDescriptor, this);
+        d->readNotifier = wn;
+        if (!(d->asyncSelect))
+            d->asyncSelect = q_check_ptr(new QAsyncSelect(d->threadData->eventDispatcher, d->nativeSocket, this));
+        d->asyncSelect->setWriteNotifier(wn);
         d->writeNotifier->setEnabled(true);
     }
+    // TODO: what do we do if event dispatcher doesn't exist yet?
+    if (d->asyncSelect)
+        d->asyncSelect->IssueRequest();
+}
+
+class QExceptionNotifier : public QSocketNotifier
+{
+    friend class QAsyncSelect;
+public:
+    QExceptionNotifier(int fd, QSymbianSocketEngine *parent)
+        : QSocketNotifier(fd, QSocketNotifier::Exception, parent) { engine = parent; }
+
+protected:
+    bool event(QEvent *);
+
+    QSymbianSocketEngine *engine;
+};
+
+bool QExceptionNotifier::event(QEvent *e)
+{
+    if (e->type() == QEvent::SockAct) {
+        if (engine->state() == QAbstractSocket::ConnectingState)
+            engine->connectionNotification();
+        else
+            engine->exceptionNotification();
+        return true;
+    }
+    return QSocketNotifier::event(e);
 }
 
-// FIXME do we really need this for symbian?
 bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 {
-//    Q_D(const QSymbianSocketEngine);
-//    // TODO
-//    return d->exceptNotifier && d->exceptNotifier->isEnabled();
+    Q_D(const QSymbianSocketEngine);
+    // TODO
+    return d->exceptNotifier && d->exceptNotifier->isEnabled();
     return false;
 }
 
@@ -1221,12 +1302,18 @@ void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
     // TODO
-//    if (d->exceptNotifier) {
-//        d->exceptNotifier->setEnabled(enable);
-//    } else if (enable && d->threadData->eventDispatcher) {
-//        d->exceptNotifier = new QExceptionNotifier(d->socketDescriptor, this);
-//        d->exceptNotifier->setEnabled(true);
-//    }
+    if (d->exceptNotifier) {
+        d->exceptNotifier->setEnabled(enable);
+    } else if (enable && d->threadData->eventDispatcher) {
+        QExceptionNotifier *en = new QExceptionNotifier(d->socketDescriptor, this);
+        d->exceptNotifier = en;
+        if (!(d->asyncSelect))
+            d->asyncSelect = q_check_ptr(new QAsyncSelect(d->threadData->eventDispatcher, d->nativeSocket, this));
+        d->asyncSelect->setExceptionNotifier(en);
+        d->writeNotifier->setEnabled(true);
+    }
+    if (d->asyncSelect)
+        d->asyncSelect->IssueRequest();
 }
 
 bool QSymbianSocketEngine::waitForRead(int msecs, bool *timedOut)
@@ -1302,5 +1389,81 @@ qint64 QSymbianSocketEngine::bytesToWrite() const
     return 0;
 }
 
+QAsyncSelect::QAsyncSelect(QAbstractEventDispatcher *dispatcher, RSocket& sock, QSymbianSocketEngine *parent)
+    : CActive(CActive::EPriorityStandard),
+      m_inSocketEvent(false),
+      m_deleteLater(false),
+      m_socket(sock),
+      m_selectFlags(0),
+      engine(parent)
+{
+    CActiveScheduler::Add(this);
+}
+
+QAsyncSelect::~QAsyncSelect()
+{
+    Cancel();
+}
+
+void QAsyncSelect::DoCancel()
+{
+    m_socket.CancelIoctl();
+}
+
+void QAsyncSelect::RunL()
+{
+    //TODO: block when event loop demands it
+    //if (maybeQueueForLater())
+    //    return;
+
+    m_inSocketEvent = true;
+    //TODO: KSockSelectReadContinuation does what?
+    if (m_selectBuf() & KSockSelectRead) {
+        QEvent e(QEvent::SockAct);
+        iReadN->event(&e);
+    }
+    if (m_selectBuf() & KSockSelectWrite) {
+        QEvent e(QEvent::SockAct);
+        iWriteN->event(&e);
+    }
+    if ((m_selectBuf() && KSockSelectExcept) || iStatus != KErrNone) {
+        QEvent e(QEvent::SockAct);
+        iExcN->event(&e);
+    }
+    m_inSocketEvent = false;
+    // select again (unless disabled by one of the callbacks)
+    IssueRequest();
+}
+
+void QAsyncSelect::deleteLater()
+{
+    if (m_inSocketEvent) {
+        m_deleteLater = true;
+    } else {
+        delete this;
+    }
+}
+
+void QAsyncSelect::IssueRequest()
+{
+    if (m_inSocketEvent)
+        return; //prevent thrashing during a callback - socket engine enables/disables multiple notifiers
+    TUint selectFlags = 0;
+    if (iReadN && iReadN->isEnabled())
+        selectFlags |= KSockSelectRead;
+    if (iWriteN && iWriteN->isEnabled())
+        selectFlags |= KSockSelectWrite;
+    if (iExcN && iExcN->isEnabled())
+        selectFlags |= KSockSelectExcept;
+    if (selectFlags != m_selectFlags) {
+        Cancel();
+        m_selectFlags = selectFlags;
+    }
+    if (m_selectFlags && !IsActive()) {
+        m_selectBuf() = m_selectFlags;
+        m_socket.Ioctl(KIOctlSelect, iStatus, &m_selectBuf, KSOLSocket);
+        SetActive();
+    }
+}
 
 QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 43e5e61..ebd8092 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -146,6 +146,41 @@ private:
 
 class QSocketNotifier;
 
+class QReadNotifier;
+class QWriteNotifier;
+class QExceptionNotifier;
+class QAsyncSelect : public CActive
+{
+public:
+    QAsyncSelect(QAbstractEventDispatcher *dispatcher, RSocket& sock, QSymbianSocketEngine *parent);
+    ~QAsyncSelect();
+
+    void deleteLater();
+    void IssueRequest();
+
+    void refresh();
+
+    void setReadNotifier(QReadNotifier *rn) { iReadN = rn; }
+    void setWriteNotifier(QWriteNotifier *wn) { iWriteN = wn; }
+    void setExceptionNotifier(QExceptionNotifier *en) { iExcN = en; }
+
+protected:
+    void DoCancel();
+    void RunL();
+
+private:
+    QReadNotifier* iReadN;
+    QWriteNotifier* iWriteN;
+    QExceptionNotifier* iExcN;
+    bool m_inSocketEvent; // TODO ?
+    bool m_deleteLater; // TODO ?
+    RSocket &m_socket;
+
+    TUint m_selectFlags;
+    TPckgBuf<TUint> m_selectBuf; //in & out IPC buffer
+    QSymbianSocketEngine *engine;
+};
+
 class QSymbianSocketEnginePrivate : public QAbstractSocketEnginePrivate
 {
     Q_DECLARE_PUBLIC(QSymbianSocketEngine)
@@ -162,6 +197,7 @@ public:
     mutable RTimer selectTimer;
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
+    QAsyncSelect* asyncSelect;
 
     // FIXME this is duplicated from qnativesocketengine_p.h
     enum ErrorString {
-- 
cgit v0.12


From 82ab30acff0322f51f732c520dd1e5d7b40482a6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 8 Dec 2010 19:25:29 +0000
Subject: Whitespace fixes

Reviewed-by: Trust Me
---
 src/network/kernel/qhostinfo_symbian.cpp    | 2 +-
 src/network/socket/qsymbiansocketengine.cpp | 8 ++++----
 src/network/socket/qsymbiansocketengine_p.h | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index ffa0b46..287021f 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -88,7 +88,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
         results.setErrorString(QString::fromLocal8Bit(gai_strerror(result)));
     }
     */
-	
+
     return results;
 }
 
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index ad1164a..2af2029 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -119,7 +119,7 @@ void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16
             TPckgBuf<TSoInetIfQuery> query;
             query().iSrcAddr = a;
             TInt err = nativeSocket.GetOpt(KSoInetIfQueryBySrcAddr, KSolInetIfQuery, query);
-            if(!err)
+            if (!err)
                 addr->setScopeId(qt_TDesC2QString(query().iName));
             else
             addr->setScopeId(QString::number(a.Scope()));
@@ -181,7 +181,7 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
         TPckgBuf<TSoInetIfQuery> query;
         query().iName = qt_QString2TPtrC(addr.scopeId());
         TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
-        if(!err)
+        if (!err)
             nativeAddr.SetScope(query().iIndex);
         else
             nativeAddr.SetScope(0);
@@ -638,7 +638,7 @@ int QSymbianSocketEngine::accept()
     TRequestStatus status;
     d->nativeSocket.Accept(blankSocket, status);
     User::WaitForRequest(status);
-    if(status.Int()) {
+    if (status.Int()) {
         qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
         return 0;
     }
@@ -655,7 +655,7 @@ qint64 QSymbianSocketEngine::bytesAvailable() const
     // FIXME is this the right thing also for UDP?
     // What is expected for UDP, the length for the next packet I guess?
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
-    if(err)
+    if (err)
         return 0;
     available = (qint64) nbytes;
 
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index ebd8092..2d5bcd8 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -124,8 +124,8 @@ public:
     bool waitForRead(int msecs = 30000, bool *timedOut = 0);
     bool waitForWrite(int msecs = 30000, bool *timedOut = 0);
     bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
-			    bool checkRead, bool checkWrite,
-			    int msecs = 30000, bool *timedOut = 0);
+                bool checkRead, bool checkWrite,
+                int msecs = 30000, bool *timedOut = 0);
 
     bool isReadNotificationEnabled() const;
     void setReadNotificationEnabled(bool enable);
-- 
cgit v0.12


From 92705ba069945bdd9a65b627d89119a893c0cf1e Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 8 Dec 2010 19:33:18 +0000
Subject: Fix handling of select ioctl results

The select ioctl report everything not just the flags we asked for.
So mask off the results to only look at the requested flags.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 2af2029..b1d8bc0 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -986,12 +986,12 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
             asyncSelect->IssueRequest(); //TODO: in error case should we restart or not?
         return err;
     }
-    if (selectFlags() & KSockSelectRead) {
-        Q_ASSERT(checkRead && selectForRead);
+    if (checkRead && (selectFlags() & KSockSelectRead)) {
+        Q_ASSERT(selectForRead);
         *selectForRead = true;
     }
-    if (selectFlags() & KSockSelectWrite) {
-        Q_ASSERT(checkWrite && selectForWrite);
+    if (checkWrite && (selectFlags() & KSockSelectWrite)) {
+        Q_ASSERT(selectForWrite);
         *selectForWrite = true;
     }
     //restart asynchronous notifier (only one IOCTL allowed at a time)
@@ -1417,6 +1417,7 @@ void QAsyncSelect::RunL()
     //    return;
 
     m_inSocketEvent = true;
+    m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
     //TODO: KSockSelectReadContinuation does what?
     if (m_selectBuf() & KSockSelectRead) {
         QEvent e(QEvent::SockAct);
-- 
cgit v0.12


From d7654f94c61d562c8673de577c1cf934f3026614 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 20:14:31 +0100
Subject: QSymbianSocketEngine: Unify a call

---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index b1d8bc0..e7bd425 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -198,7 +198,7 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
 
 QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
     socketDescriptor(-1),
-    socketServer(qt_symbianGetSocketServer()),
+    socketServer(QSymbianSocketManager::instance().getSocketServer()),
     connection(QSymbianSocketManager::instance().defaultConnection()),
     readNotifier(0),
     writeNotifier(0),
-- 
cgit v0.12


From afc7d05995c8f56d0ab9c35f9ca826e0bd0aaea4 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 20:16:27 +0100
Subject: Socket engines: Improve manual test program

Reviewed-by: Shane Kearns
---
 tests/manual/socketengine/main.cpp         | 36 ++++++++++++++++++++++++++++++
 tests/manual/socketengine/socketengine.pro |  2 ++
 2 files changed, 38 insertions(+)

diff --git a/tests/manual/socketengine/main.cpp b/tests/manual/socketengine/main.cpp
index f368573..e475942 100644
--- a/tests/manual/socketengine/main.cpp
+++ b/tests/manual/socketengine/main.cpp
@@ -51,12 +51,48 @@
 #include <private/qabstractsocketengine_p.h>
 #include <cstdio>
 #include <strings.h>
+#include <QNetworkConfigurationManager>
+#include <QNetworkConfiguration>
+#include <QNetworkSession>
+#include <QCoreApplication>
 
 const int bufsize = 16*1024;
 char buf[bufsize];
 
 int main(int argc, char**argv)
 {
+    QCoreApplication app(argc, argv);
+
+#ifdef Q_OS_SYMBIAN
+    QNetworkConfigurationManager configurationManager;
+    QNetworkConfiguration configuration = configurationManager.defaultConfiguration();
+    if (!configuration.isValid()) {
+        qDebug() << "Got an invalid session configuration";
+        exit(1);
+    }
+
+    qDebug() << "Opening session...";
+    QNetworkSession *session = new QNetworkSession(configuration);
+
+    // Does not work:
+//    session->open();
+//    session->waitForOpened();
+
+    // works:
+    QEventLoop loop;
+    QObject::connect(session, SIGNAL(opened()), &loop, SLOT(quit()), Qt::QueuedConnection);
+    QMetaObject::invokeMethod(session, "open", Qt::QueuedConnection);
+    loop.exec();
+
+
+    if (session->isOpen()) {
+        qDebug() << "session opened";
+    } else {
+        qDebug() << "session could not be opened -" << session->errorString();
+        exit(1);
+    }
+#endif
+
     // create it
     QAbstractSocketEngine *socketEngine =
             QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, QNetworkProxy(QNetworkProxy::NoProxy), 0);
diff --git a/tests/manual/socketengine/socketengine.pro b/tests/manual/socketengine/socketengine.pro
index 96d0055..76a40be 100644
--- a/tests/manual/socketengine/socketengine.pro
+++ b/tests/manual/socketengine/socketengine.pro
@@ -9,5 +9,7 @@ QT += network
 
 CONFIG += release
 
+symbian: TARGET.CAPABILITY = NetworkServices
+
 # Input
 SOURCES += main.cpp
-- 
cgit v0.12


From 92f11bd666e8a63d9fc8c5588d843721c5bf68b5 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 8 Dec 2010 20:27:03 +0100
Subject: QSymbianSocketEngine: Fix wrong debug message

---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index e7bd425..5cee340 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -540,7 +540,7 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 
         if (d->socketState != QAbstractSocket::ConnectedState) {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-            qDebug("QSymbianSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
+            qDebug("QSymbianSocketEngine::connectToHost(%s, %i) == false (%s)",
                    addr.toString().toLatin1().constData(), port,
                    d->socketState == QAbstractSocket::ConnectingState
                    ? "Connection in progress" : d->socketErrorString.toLatin1().constData());
-- 
cgit v0.12


From b9080b96b05988776daec35f7e2af9ad346abb0a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 9 Dec 2010 10:05:03 +0000
Subject: Fix bug in select

When waitForRead was called, it was selecting for read and write,
because we were checking the pointers instead of the bools.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 10 +++++++---
 tests/manual/socketengine/main.cpp          |  8 +++++++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 5cee340..1490bdd 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -148,7 +148,11 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
-    TInt err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
+    TInt err;
+    if (connection)
+        err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
+    else
+        err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
     if (err != KErrNone) {
         switch (err) {
@@ -946,9 +950,9 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
 
     TPckgBuf<TUint> selectFlags;
     selectFlags() = KSockSelectExcept;
-    if (selectForRead)
+    if (checkRead)
         selectFlags() |= KSockSelectRead;
-    if (selectForWrite)
+    if (checkWrite)
         selectFlags() |= KSockSelectWrite;
     TRequestStatus selectStat;
     nativeSocket.Ioctl(KIOctlSelect, selectStat, &selectFlags, KSOLSocket);
diff --git a/tests/manual/socketengine/main.cpp b/tests/manual/socketengine/main.cpp
index e475942..2f017a0 100644
--- a/tests/manual/socketengine/main.cpp
+++ b/tests/manual/socketengine/main.cpp
@@ -109,10 +109,12 @@ int main(int argc, char**argv)
     }
 
     // wait for connected
-    socketEngine->connectToHost(QHostAddress("74.125.77.99"), 80); // google
+    int r = socketEngine->connectToHost(QHostAddress("74.125.77.99"), 80); // google
     bool readyToRead = false;
     bool readyToWrite = false;
     socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, true, 10*1000);
+    if (r <= 0) //timeout or error
+        exit(1);
     if (readyToWrite) {
         // write the request
         QByteArray request("GET /robots.txt HTTP/1.0\r\n\r\n");
@@ -129,7 +131,11 @@ int main(int argc, char**argv)
                 bzero(buf, bufsize);
                 ret = socketEngine->read(buf, available);
                 if (ret > 0) {
+#ifdef Q_OS_SYMBIAN
+                    qDebug() << buf; //printf goes only to screen, this goes to remote debug channel
+#else
                     printf("%s", buf);
+#endif
                 } else {
                     // some failure when reading
                     exit(1);
-- 
cgit v0.12


From af62350d83b27421820536b3a19be36a32384f15 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Thu, 9 Dec 2010 14:53:34 +0100
Subject: Move tst_qnativesocketengine to tst_platformsocketengine

---
 tests/auto/platformsocketengine/.gitignore         |   1 +
 .../platformsocketengine/platformsocketengine.pri  |  19 +
 .../platformsocketengine/platformsocketengine.pro  |  13 +
 .../tst_platformsocketengine.cpp                   | 705 +++++++++++++++++++++
 tests/auto/qnativesocketengine/.gitignore          |   1 -
 .../qnativesocketengine/qnativesocketengine.pro    |  13 -
 tests/auto/qnativesocketengine/qsocketengine.pri   |  19 -
 .../tst_qnativesocketengine.cpp                    | 705 ---------------------
 8 files changed, 738 insertions(+), 738 deletions(-)
 create mode 100644 tests/auto/platformsocketengine/.gitignore
 create mode 100644 tests/auto/platformsocketengine/platformsocketengine.pri
 create mode 100644 tests/auto/platformsocketengine/platformsocketengine.pro
 create mode 100644 tests/auto/platformsocketengine/tst_platformsocketengine.cpp
 delete mode 100644 tests/auto/qnativesocketengine/.gitignore
 delete mode 100644 tests/auto/qnativesocketengine/qnativesocketengine.pro
 delete mode 100644 tests/auto/qnativesocketengine/qsocketengine.pri
 delete mode 100644 tests/auto/qnativesocketengine/tst_qnativesocketengine.cpp

diff --git a/tests/auto/platformsocketengine/.gitignore b/tests/auto/platformsocketengine/.gitignore
new file mode 100644
index 0000000..4700e5e
--- /dev/null
+++ b/tests/auto/platformsocketengine/.gitignore
@@ -0,0 +1 @@
+tst_qnativesocketengine
diff --git a/tests/auto/platformsocketengine/platformsocketengine.pri b/tests/auto/platformsocketengine/platformsocketengine.pri
new file mode 100644
index 0000000..15f31fd
--- /dev/null
+++ b/tests/auto/platformsocketengine/platformsocketengine.pri
@@ -0,0 +1,19 @@
+QT += network
+
+QNETWORK_SRC = $$QT_SOURCE_TREE/src/network
+
+INCLUDEPATH += $$QNETWORK_SRC
+
+win32 {
+    wince*: {
+        LIBS += -lws2
+    } else {
+        LIBS += -lws2_32
+    }
+}
+
+unix:contains(QT_CONFIG, reduce_exports) {
+    SOURCES += $$QNETWORK_SRC/socket/qnativesocketengine_unix.cpp
+    SOURCES += $$QNETWORK_SRC/socket/qnativesocketengine.cpp
+    SOURCES += $$QNETWORK_SRC/socket/qabstractsocketengine.cpp
+}
diff --git a/tests/auto/platformsocketengine/platformsocketengine.pro b/tests/auto/platformsocketengine/platformsocketengine.pro
new file mode 100644
index 0000000..0275d37
--- /dev/null
+++ b/tests/auto/platformsocketengine/platformsocketengine.pro
@@ -0,0 +1,13 @@
+load(qttest_p4)
+SOURCES  += tst_qnativesocketengine.cpp
+
+include(../qnativesocketengine/qsocketengine.pri)
+
+requires(contains(QT_CONFIG,private_tests))
+
+MOC_DIR=tmp
+
+QT = core network
+
+symbian: TARGET.CAPABILITY = NetworkServices
+
diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
new file mode 100644
index 0000000..2b0b632
--- /dev/null
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -0,0 +1,705 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+
+#ifdef Q_OS_WIN
+#include <winsock2.h>
+#endif
+
+#include <qcoreapplication.h>
+
+
+#include <qdatastream.h>
+#include <private/qnativesocketengine_p.h>
+
+#include <qhostaddress.h>
+#include <qdatetime.h>
+
+#ifdef Q_OS_UNIX
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
+
+#include <stddef.h>
+
+
+#include <qstringlist.h>
+
+#include "../network-settings.h"
+
+//TESTED_FILES=network/qnativesocketengine.cpp network/qnativesocketengine_p.h network/qnativesocketengine_unix.cpp
+
+class tst_QNativeSocketEngine : public QObject
+{
+    Q_OBJECT
+
+public:
+    tst_QNativeSocketEngine();
+    virtual ~tst_QNativeSocketEngine();
+
+
+public slots:
+    void init();
+    void cleanup();
+private slots:
+    void construction();
+    void simpleConnectToIMAP();
+    void udpLoopbackTest();
+    void udpIPv6LoopbackTest();
+    void broadcastTest();
+    void serverTest();
+    void udpLoopbackPerformance();
+    void tcpLoopbackPerformance();
+    void readWriteBufferSize();
+    void tooManySockets();
+    void bind();
+    void networkError();
+    void setSocketDescriptor();
+    void invalidSend();
+    void receiveUrgentData();
+};
+
+tst_QNativeSocketEngine::tst_QNativeSocketEngine()
+{
+    Q_SET_DEFAULT_IAP
+}
+
+tst_QNativeSocketEngine::~tst_QNativeSocketEngine()
+{
+}
+
+void tst_QNativeSocketEngine::init()
+{
+}
+
+void tst_QNativeSocketEngine::cleanup()
+{
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::construction()
+{
+    QNativeSocketEngine socketDevice;
+
+    QVERIFY(!socketDevice.isValid());
+
+    // Initialize device
+    QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+    QVERIFY(socketDevice.isValid());
+    QVERIFY(socketDevice.protocol() == QAbstractSocket::IPv4Protocol);
+    QVERIFY(socketDevice.socketType() == QAbstractSocket::TcpSocket);
+    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
+    QVERIFY(socketDevice.socketDescriptor() != -1);
+    QVERIFY(socketDevice.localAddress() == QHostAddress());
+    QVERIFY(socketDevice.localPort() == 0);
+    QVERIFY(socketDevice.peerAddress() == QHostAddress());
+    QVERIFY(socketDevice.peerPort() == 0);
+    QVERIFY(socketDevice.error() == QAbstractSocket::UnknownSocketError);
+
+    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::bytesAvailable() was called in QAbstractSocket::UnconnectedState");
+    QVERIFY(socketDevice.bytesAvailable() == 0);
+
+    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::hasPendingDatagrams() was called in QAbstractSocket::UnconnectedState");
+    QVERIFY(!socketDevice.hasPendingDatagrams());
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::simpleConnectToIMAP()
+{
+    QNativeSocketEngine socketDevice;
+
+    // Initialize device
+    QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
+
+    const bool isConnected = socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143);
+    if (!isConnected) {
+        QVERIFY(socketDevice.state() == QAbstractSocket::ConnectingState);
+        QVERIFY(socketDevice.waitForWrite());
+        QVERIFY(socketDevice.state() == QAbstractSocket::ConnectedState);
+    }
+    QVERIFY(socketDevice.state() == QAbstractSocket::ConnectedState);
+    QVERIFY(socketDevice.peerAddress() == QtNetworkSettings::serverIP());
+
+    // Wait for the greeting
+    QVERIFY(socketDevice.waitForRead());
+
+    // Read the greeting
+    qint64 available = socketDevice.bytesAvailable();
+    QVERIFY(available > 0);
+    QByteArray array;
+    array.resize(available);
+    QVERIFY(socketDevice.read(array.data(), array.size()) == available);
+
+    // Check that the greeting is what we expect it to be
+    QCOMPARE(array.constData(), QtNetworkSettings::expectedReplyIMAP().constData());
+
+    // Write a logout message
+    QByteArray array2 = "ZZZ LOGOUT\r\n";
+    QVERIFY(socketDevice.write(array2.data(),
+                              array2.size()) == array2.size());
+
+    // Wait for the response
+    QVERIFY(socketDevice.waitForRead());
+
+    available = socketDevice.bytesAvailable();
+    QVERIFY(available > 0);
+    array.resize(available);
+    QVERIFY(socketDevice.read(array.data(), array.size()) == available);
+
+    // Check that the greeting is what we expect it to be
+    QCOMPARE(array.constData(),
+             "* BYE LOGOUT received\r\n"
+             "ZZZ OK Completed\r\n");
+
+    // Wait for the response
+    QVERIFY(socketDevice.waitForRead());
+    char c;
+    QVERIFY(socketDevice.read(&c, sizeof(c)) == -1);
+    QVERIFY(socketDevice.error() == QAbstractSocket::RemoteHostClosedError);
+    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::udpLoopbackTest()
+{
+#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
+    QSKIP("Not working on Emulator without WinPCAP", SkipAll);
+#endif
+    QNativeSocketEngine udpSocket;
+
+    // Initialize device #1
+    QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
+    QVERIFY(udpSocket.isValid());
+    QVERIFY(udpSocket.socketDescriptor() != -1);
+    QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv4Protocol);
+    QVERIFY(udpSocket.socketType() == QAbstractSocket::UdpSocket);
+    QVERIFY(udpSocket.state() == QAbstractSocket::UnconnectedState);
+
+    // Bind #1 to localhost
+    QVERIFY(udpSocket.bind(QHostAddress("127.0.0.1"), 0));
+    QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
+    quint16 port = udpSocket.localPort();
+    QVERIFY(port != 0);
+
+    // Initialize device #2
+    QNativeSocketEngine udpSocket2;
+    QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
+
+    // Connect device #2 to #1
+    QVERIFY(udpSocket2.connectToHost(QHostAddress("127.0.0.1"), port));
+    QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
+
+    // Write a message to #1
+    QByteArray message1 = "hei der";
+    QVERIFY(udpSocket2.write(message1.data(),
+                            message1.size()) == message1.size());
+
+    // Read the message from #2
+    QVERIFY(udpSocket.waitForRead());
+    QVERIFY(udpSocket.hasPendingDatagrams());
+    qint64 available = udpSocket.pendingDatagramSize();
+    QVERIFY(available > 0);
+    QByteArray answer;
+    answer.resize(available);
+    QHostAddress senderAddress;
+    quint16 senderPort = 0;
+    QVERIFY(udpSocket.readDatagram(answer.data(), answer.size(),
+                                  &senderAddress,
+                                  &senderPort) == message1.size());
+    QVERIFY(senderAddress == QHostAddress("127.0.0.1"));
+    QVERIFY(senderPort != 0);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::udpIPv6LoopbackTest()
+{
+#if defined(Q_OS_SYMBIAN)
+    QSKIP("Symbian: IPv6 is not yet supported", SkipAll);
+#endif
+    QNativeSocketEngine udpSocket;
+
+    // Initialize device #1
+    bool init = udpSocket.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol);
+
+    if (!init) {
+        QVERIFY(udpSocket.error() == QAbstractSocket::UnsupportedSocketOperationError);
+    } else {
+        QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv6Protocol);
+
+        // Bind #1 to localhost
+        QVERIFY(udpSocket.bind(QHostAddress("::1"), 0));
+        QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
+        quint16 port = udpSocket.localPort();
+        QVERIFY(port != 0);
+
+        // Initialize device #2
+        QNativeSocketEngine udpSocket2;
+        QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol));
+
+        // Connect device #2 to #1
+        QVERIFY(udpSocket2.connectToHost(QHostAddress("::1"), port));
+        QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
+
+        // Write a message to #1
+        QByteArray message1 = "hei der";
+        QVERIFY(udpSocket2.write(message1.data(),
+                                message1.size()) == message1.size());
+
+        // Read the message from #2
+        QVERIFY(udpSocket.waitForRead());
+        QVERIFY(udpSocket.hasPendingDatagrams());
+        qint64 available = udpSocket.pendingDatagramSize();
+        QVERIFY(available > 0);
+        QByteArray answer;
+        answer.resize(available);
+        QHostAddress senderAddress;
+        quint16 senderPort = 0;
+        QVERIFY(udpSocket.readDatagram(answer.data(), answer.size(),
+                                      &senderAddress,
+                                      &senderPort) == message1.size());
+        QVERIFY(senderAddress == QHostAddress("::1"));
+        QVERIFY(senderPort != 0);
+    }
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::broadcastTest()
+{
+#ifdef Q_OS_AIX
+    QSKIP("Broadcast does not work on darko", SkipAll);
+#endif
+    QNativeSocketEngine broadcastSocket;
+
+    // Initialize a regular Udp socket
+    QVERIFY(broadcastSocket.initialize(QAbstractSocket::UdpSocket));
+
+    // Bind to any port on all interfaces
+    QVERIFY(broadcastSocket.bind(QHostAddress::Any, 0));
+    QVERIFY(broadcastSocket.state() == QAbstractSocket::BoundState);
+    quint16 port = broadcastSocket.localPort();
+    QVERIFY(port > 0);
+
+    // Broadcast an inappropriate troll message
+    QByteArray trollMessage
+        = "MOOT wtf is a MOOT? talk english not your sutpiD ENGLISH.";
+    QVERIFY(broadcastSocket.writeDatagram(trollMessage.data(),
+                                         trollMessage.size(),
+                                         QHostAddress::Broadcast,
+                                         port) == trollMessage.size());
+
+    // Wait until we receive it ourselves
+#if defined(Q_OS_FREEBSD)
+    QEXPECT_FAIL("", "Broadcasting to 255.255.255.255 does not work on FreeBSD", Abort);
+#endif
+    QVERIFY(broadcastSocket.waitForRead());
+    QVERIFY(broadcastSocket.hasPendingDatagrams());
+
+    qlonglong available = broadcastSocket.pendingDatagramSize();
+    QByteArray response;
+    response.resize(available);
+    QVERIFY(broadcastSocket.readDatagram(response.data(), response.size())
+           == response.size());
+    QCOMPARE(response, trollMessage);
+
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::serverTest()
+{
+    QNativeSocketEngine server;
+
+    // Initialize a Tcp socket
+    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
+
+    // Bind to any port on all interfaces
+    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
+    QVERIFY(server.state() == QAbstractSocket::BoundState);
+    quint16 port = server.localPort();
+
+    // Listen for incoming connections
+    QVERIFY(server.listen());
+    QVERIFY(server.state() == QAbstractSocket::ListeningState);
+
+    // Initialize a Tcp socket
+    QNativeSocketEngine client;
+    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
+    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
+        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
+        QVERIFY(client.waitForWrite());
+        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
+    }
+
+    // The server accepts the connection
+    int socketDescriptor = server.accept();
+    QVERIFY(socketDescriptor > 0);
+
+    // A socket device is initialized on the server side, passing the
+    // socket descriptor from accept(). It's pre-connected.
+    QNativeSocketEngine serverSocket;
+    QVERIFY(serverSocket.initialize(socketDescriptor));
+    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
+
+    // The server socket sends a greeting to the clietn
+    QByteArray greeting = "Greetings!";
+    QVERIFY(serverSocket.write(greeting.data(),
+                              greeting.size()) == greeting.size());
+
+    // The client waits for the greeting to arrive
+    QVERIFY(client.waitForRead());
+    qint64 available = client.bytesAvailable();
+    QVERIFY(available > 0);
+
+    // The client reads the greeting and checks that it's correct
+    QByteArray response;
+    response.resize(available);
+    QVERIFY(client.read(response.data(),
+                       response.size()) == response.size());
+    QCOMPARE(response, greeting);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::udpLoopbackPerformance()
+{
+#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
+    QSKIP("Not working on Emulator without WinPCAP", SkipAll);
+#endif
+    QNativeSocketEngine udpSocket;
+
+    // Initialize device #1
+    QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
+    QVERIFY(udpSocket.isValid());
+    QVERIFY(udpSocket.socketDescriptor() != -1);
+    QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv4Protocol);
+    QVERIFY(udpSocket.socketType() == QAbstractSocket::UdpSocket);
+    QVERIFY(udpSocket.state() == QAbstractSocket::UnconnectedState);
+
+    // Bind #1 to localhost
+    QVERIFY(udpSocket.bind(QHostAddress("127.0.0.1"), 0));
+    QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
+    quint16 port = udpSocket.localPort();
+    QVERIFY(port != 0);
+
+    // Initialize device #2
+    QNativeSocketEngine udpSocket2;
+    QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
+
+    // Connect device #2 to #1
+    QVERIFY(udpSocket2.connectToHost(QHostAddress("127.0.0.1"), port));
+    QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
+
+    const int messageSize = 8192;
+    QByteArray message1(messageSize, '@');
+    QByteArray answer(messageSize, '@');
+
+    QHostAddress localhost = QHostAddress::LocalHost;
+
+    qlonglong readBytes = 0;
+    QTime timer;
+    timer.start();
+    while (timer.elapsed() < 5000) {
+        udpSocket2.write(message1.data(), message1.size());
+        udpSocket.waitForRead();
+        while (udpSocket.hasPendingDatagrams()) {
+            readBytes += (qlonglong) udpSocket.readDatagram(answer.data(),
+                                                             answer.size());
+        }
+    }
+
+    qDebug("\t\t%.1fMB/%.1fs: %.1fMB/s",
+           readBytes / (1024.0 * 1024.0),
+           timer.elapsed() / 1024.0,
+           (readBytes / (timer.elapsed() / 1000.0)) / (1024 * 1024));
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::tcpLoopbackPerformance()
+{
+    QNativeSocketEngine server;
+
+    // Initialize a Tcp socket
+    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
+
+    // Bind to any port on all interfaces
+    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
+    QVERIFY(server.state() == QAbstractSocket::BoundState);
+    quint16 port = server.localPort();
+
+    // Listen for incoming connections
+    QVERIFY(server.listen());
+    QVERIFY(server.state() == QAbstractSocket::ListeningState);
+
+    // Initialize a Tcp socket
+    QNativeSocketEngine client;
+    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
+
+    // Connect to our server
+    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
+        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
+        QVERIFY(client.waitForWrite());
+        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
+    }
+
+    // The server accepts the connectio
+    int socketDescriptor = server.accept();
+    QVERIFY(socketDescriptor > 0);
+
+    // A socket device is initialized on the server side, passing the
+    // socket descriptor from accept(). It's pre-connected.
+    QNativeSocketEngine serverSocket;
+    QVERIFY(serverSocket.initialize(socketDescriptor));
+    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
+
+    const int messageSize = 1024 * 256;
+    QByteArray message1(messageSize, '@');
+    QByteArray answer(messageSize, '@');
+
+    QTime timer;
+    timer.start();
+    qlonglong readBytes = 0;
+    while (timer.elapsed() < 5000) {
+        qlonglong written = serverSocket.write(message1.data(), message1.size());
+        while (written > 0) {
+            client.waitForRead();
+            if (client.bytesAvailable() > 0) {
+                qlonglong readNow = client.read(answer.data(), answer.size());
+                written -= readNow;
+                readBytes += readNow;
+            }
+        }
+    }
+
+    qDebug("\t\t%.1fMB/%.1fs: %.1fMB/s",
+           readBytes / (1024.0 * 1024.0),
+           timer.elapsed() / 1024.0,
+           (readBytes / (timer.elapsed() / 1000.0)) / (1024 * 1024));
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::readWriteBufferSize()
+{
+    QNativeSocketEngine device;
+
+    QVERIFY(device.initialize(QAbstractSocket::TcpSocket));
+
+    qint64 bufferSize = device.receiveBufferSize();
+    QVERIFY(bufferSize != -1);
+    device.setReceiveBufferSize(bufferSize + 1);
+#if defined(Q_OS_WINCE)
+    QEXPECT_FAIL(0, "Not supported by default on WinCE", Continue);
+#endif
+    QVERIFY(device.receiveBufferSize() > bufferSize);
+
+    bufferSize = device.sendBufferSize();
+    QVERIFY(bufferSize != -1);
+    device.setSendBufferSize(bufferSize + 1);
+    QVERIFY(device.sendBufferSize() > bufferSize);
+
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::tooManySockets()
+{
+#if defined Q_OS_WIN
+    QSKIP("Certain windows machines suffocate and spend too much time in this test.", SkipAll);
+#endif
+    QList<QNativeSocketEngine *> sockets;
+    QNativeSocketEngine *socketLayer = 0;
+    for (;;) {
+        socketLayer = new QNativeSocketEngine;
+        sockets.append(socketLayer);
+
+        if (!socketLayer->initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol))
+            break;
+    }
+
+    QCOMPARE(socketLayer->error(), QAbstractSocket::SocketResourceError);
+
+    qDeleteAll(sockets);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::bind()
+{
+#if !defined Q_OS_WIN && !defined Q_OS_SYMBIAN
+    QNativeSocketEngine binder;
+    QVERIFY(binder.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+    QVERIFY(!binder.bind(QHostAddress::Any, 82));
+    QVERIFY(binder.error() == QAbstractSocket::SocketAccessError);
+#endif
+
+    QNativeSocketEngine binder2;
+    QVERIFY(binder2.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+    QVERIFY(binder2.bind(QHostAddress::Any, 31180));
+
+    QNativeSocketEngine binder3;
+    QVERIFY(binder3.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+    QVERIFY(!binder3.bind(QHostAddress::Any, 31180));
+
+#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
+    qDebug("On Symbian Emulator (WinSock) we get EADDRNOTAVAIL instead of EADDRINUSE");
+    QVERIFY(binder3.error() == QAbstractSocket::SocketAddressNotAvailableError);
+#else
+    QVERIFY(binder3.error() == QAbstractSocket::AddressInUseError);
+#endif
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::networkError()
+{
+    QNativeSocketEngine client;
+
+    QVERIFY(client.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
+
+    const bool isConnected = client.connectToHost(QtNetworkSettings::serverIP(), 143);
+    if (!isConnected) {
+        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
+        QVERIFY(client.waitForWrite());
+        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
+    }
+    QVERIFY(client.state() == QAbstractSocket::ConnectedState);
+
+    // An unexpected network error!
+#ifdef Q_OS_WIN
+    // could use shutdown to produce different errors
+    ::closesocket(client.socketDescriptor());
+#else
+    ::close(client.socketDescriptor());
+#endif
+
+    QVERIFY(client.read(0, 0) == -1);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::setSocketDescriptor()
+{
+    QNativeSocketEngine socket1;
+    QVERIFY(socket1.initialize(QAbstractSocket::TcpSocket));
+
+    QNativeSocketEngine socket2;
+    QVERIFY(socket2.initialize(socket1.socketDescriptor()));
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::invalidSend()
+{
+    QNativeSocketEngine socket;
+    QVERIFY(socket.initialize(QAbstractSocket::TcpSocket));
+
+    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::writeDatagram() was"
+                               " called by a socket other than QAbstractSocket::UdpSocket");
+    QCOMPARE(socket.writeDatagram("hei", 3, QHostAddress::LocalHost, 143),
+            (qlonglong) -1);
+}
+
+//---------------------------------------------------------------------------
+void tst_QNativeSocketEngine::receiveUrgentData()
+{
+    QNativeSocketEngine server;
+
+    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
+
+    // Bind to any port on all interfaces
+    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
+    QVERIFY(server.state() == QAbstractSocket::BoundState);
+    quint16 port = server.localPort();
+
+    QVERIFY(server.listen());
+    QVERIFY(server.state() == QAbstractSocket::ListeningState);
+
+    QNativeSocketEngine client;
+    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
+
+    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
+        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
+        QVERIFY(client.waitForWrite());
+        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
+    }
+
+    int socketDescriptor = server.accept();
+    QVERIFY(socketDescriptor > 0);
+
+    QNativeSocketEngine serverSocket;
+    QVERIFY(serverSocket.initialize(socketDescriptor));
+    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
+
+    char msg;
+    int available;
+    QByteArray response;
+
+#if defined Q_OS_HPUX
+    QSKIP("Native OOB data test doesn't work on HP-UX.", SkipAll);
+#elif defined (Q_OS_WINCE)
+    QSKIP("Native OOB data test doesn't work on WinCE.", SkipAll);
+#endif
+
+    // The server sends an urgent message
+    msg = 'Q';
+    QCOMPARE(int(::send(socketDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
+
+    // The client receives the urgent message
+    QVERIFY(client.waitForRead());
+    available = client.bytesAvailable();
+    QCOMPARE(available, 1);
+    response.resize(available);
+    QCOMPARE(client.read(response.data(), response.size()), qint64(1));
+    QCOMPARE(response.at(0), msg);
+
+    // The client sends an urgent message
+    msg = 'T';
+    int clientDescriptor = client.socketDescriptor();
+    QCOMPARE(int(::send(clientDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
+
+    // The server receives the urgent message
+    QVERIFY(serverSocket.waitForRead());
+    available = serverSocket.bytesAvailable();
+    QCOMPARE(available, 1);
+    response.resize(available);
+    QCOMPARE(serverSocket.read(response.data(), response.size()), qint64(1));
+    QCOMPARE(response.at(0), msg);
+
+}
+
+QTEST_MAIN(tst_QNativeSocketEngine)
+#include "tst_qnativesocketengine.moc"
diff --git a/tests/auto/qnativesocketengine/.gitignore b/tests/auto/qnativesocketengine/.gitignore
deleted file mode 100644
index 4700e5e..0000000
--- a/tests/auto/qnativesocketengine/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-tst_qnativesocketengine
diff --git a/tests/auto/qnativesocketengine/qnativesocketengine.pro b/tests/auto/qnativesocketengine/qnativesocketengine.pro
deleted file mode 100644
index 0275d37..0000000
--- a/tests/auto/qnativesocketengine/qnativesocketengine.pro
+++ /dev/null
@@ -1,13 +0,0 @@
-load(qttest_p4)
-SOURCES  += tst_qnativesocketengine.cpp
-
-include(../qnativesocketengine/qsocketengine.pri)
-
-requires(contains(QT_CONFIG,private_tests))
-
-MOC_DIR=tmp
-
-QT = core network
-
-symbian: TARGET.CAPABILITY = NetworkServices
-
diff --git a/tests/auto/qnativesocketengine/qsocketengine.pri b/tests/auto/qnativesocketengine/qsocketengine.pri
deleted file mode 100644
index 15f31fd..0000000
--- a/tests/auto/qnativesocketengine/qsocketengine.pri
+++ /dev/null
@@ -1,19 +0,0 @@
-QT += network
-
-QNETWORK_SRC = $$QT_SOURCE_TREE/src/network
-
-INCLUDEPATH += $$QNETWORK_SRC
-
-win32 {
-    wince*: {
-        LIBS += -lws2
-    } else {
-        LIBS += -lws2_32
-    }
-}
-
-unix:contains(QT_CONFIG, reduce_exports) {
-    SOURCES += $$QNETWORK_SRC/socket/qnativesocketengine_unix.cpp
-    SOURCES += $$QNETWORK_SRC/socket/qnativesocketengine.cpp
-    SOURCES += $$QNETWORK_SRC/socket/qabstractsocketengine.cpp
-}
diff --git a/tests/auto/qnativesocketengine/tst_qnativesocketengine.cpp b/tests/auto/qnativesocketengine/tst_qnativesocketengine.cpp
deleted file mode 100644
index 2b0b632..0000000
--- a/tests/auto/qnativesocketengine/tst_qnativesocketengine.cpp
+++ /dev/null
@@ -1,705 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QtTest/QtTest>
-
-#ifdef Q_OS_WIN
-#include <winsock2.h>
-#endif
-
-#include <qcoreapplication.h>
-
-
-#include <qdatastream.h>
-#include <private/qnativesocketengine_p.h>
-
-#include <qhostaddress.h>
-#include <qdatetime.h>
-
-#ifdef Q_OS_UNIX
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#endif
-
-#include <stddef.h>
-
-
-#include <qstringlist.h>
-
-#include "../network-settings.h"
-
-//TESTED_FILES=network/qnativesocketengine.cpp network/qnativesocketengine_p.h network/qnativesocketengine_unix.cpp
-
-class tst_QNativeSocketEngine : public QObject
-{
-    Q_OBJECT
-
-public:
-    tst_QNativeSocketEngine();
-    virtual ~tst_QNativeSocketEngine();
-
-
-public slots:
-    void init();
-    void cleanup();
-private slots:
-    void construction();
-    void simpleConnectToIMAP();
-    void udpLoopbackTest();
-    void udpIPv6LoopbackTest();
-    void broadcastTest();
-    void serverTest();
-    void udpLoopbackPerformance();
-    void tcpLoopbackPerformance();
-    void readWriteBufferSize();
-    void tooManySockets();
-    void bind();
-    void networkError();
-    void setSocketDescriptor();
-    void invalidSend();
-    void receiveUrgentData();
-};
-
-tst_QNativeSocketEngine::tst_QNativeSocketEngine()
-{
-    Q_SET_DEFAULT_IAP
-}
-
-tst_QNativeSocketEngine::~tst_QNativeSocketEngine()
-{
-}
-
-void tst_QNativeSocketEngine::init()
-{
-}
-
-void tst_QNativeSocketEngine::cleanup()
-{
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::construction()
-{
-    QNativeSocketEngine socketDevice;
-
-    QVERIFY(!socketDevice.isValid());
-
-    // Initialize device
-    QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-    QVERIFY(socketDevice.isValid());
-    QVERIFY(socketDevice.protocol() == QAbstractSocket::IPv4Protocol);
-    QVERIFY(socketDevice.socketType() == QAbstractSocket::TcpSocket);
-    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
-    QVERIFY(socketDevice.socketDescriptor() != -1);
-    QVERIFY(socketDevice.localAddress() == QHostAddress());
-    QVERIFY(socketDevice.localPort() == 0);
-    QVERIFY(socketDevice.peerAddress() == QHostAddress());
-    QVERIFY(socketDevice.peerPort() == 0);
-    QVERIFY(socketDevice.error() == QAbstractSocket::UnknownSocketError);
-
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::bytesAvailable() was called in QAbstractSocket::UnconnectedState");
-    QVERIFY(socketDevice.bytesAvailable() == 0);
-
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::hasPendingDatagrams() was called in QAbstractSocket::UnconnectedState");
-    QVERIFY(!socketDevice.hasPendingDatagrams());
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::simpleConnectToIMAP()
-{
-    QNativeSocketEngine socketDevice;
-
-    // Initialize device
-    QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
-
-    const bool isConnected = socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143);
-    if (!isConnected) {
-        QVERIFY(socketDevice.state() == QAbstractSocket::ConnectingState);
-        QVERIFY(socketDevice.waitForWrite());
-        QVERIFY(socketDevice.state() == QAbstractSocket::ConnectedState);
-    }
-    QVERIFY(socketDevice.state() == QAbstractSocket::ConnectedState);
-    QVERIFY(socketDevice.peerAddress() == QtNetworkSettings::serverIP());
-
-    // Wait for the greeting
-    QVERIFY(socketDevice.waitForRead());
-
-    // Read the greeting
-    qint64 available = socketDevice.bytesAvailable();
-    QVERIFY(available > 0);
-    QByteArray array;
-    array.resize(available);
-    QVERIFY(socketDevice.read(array.data(), array.size()) == available);
-
-    // Check that the greeting is what we expect it to be
-    QCOMPARE(array.constData(), QtNetworkSettings::expectedReplyIMAP().constData());
-
-    // Write a logout message
-    QByteArray array2 = "ZZZ LOGOUT\r\n";
-    QVERIFY(socketDevice.write(array2.data(),
-                              array2.size()) == array2.size());
-
-    // Wait for the response
-    QVERIFY(socketDevice.waitForRead());
-
-    available = socketDevice.bytesAvailable();
-    QVERIFY(available > 0);
-    array.resize(available);
-    QVERIFY(socketDevice.read(array.data(), array.size()) == available);
-
-    // Check that the greeting is what we expect it to be
-    QCOMPARE(array.constData(),
-             "* BYE LOGOUT received\r\n"
-             "ZZZ OK Completed\r\n");
-
-    // Wait for the response
-    QVERIFY(socketDevice.waitForRead());
-    char c;
-    QVERIFY(socketDevice.read(&c, sizeof(c)) == -1);
-    QVERIFY(socketDevice.error() == QAbstractSocket::RemoteHostClosedError);
-    QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpLoopbackTest()
-{
-#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
-    QSKIP("Not working on Emulator without WinPCAP", SkipAll);
-#endif
-    QNativeSocketEngine udpSocket;
-
-    // Initialize device #1
-    QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
-    QVERIFY(udpSocket.isValid());
-    QVERIFY(udpSocket.socketDescriptor() != -1);
-    QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv4Protocol);
-    QVERIFY(udpSocket.socketType() == QAbstractSocket::UdpSocket);
-    QVERIFY(udpSocket.state() == QAbstractSocket::UnconnectedState);
-
-    // Bind #1 to localhost
-    QVERIFY(udpSocket.bind(QHostAddress("127.0.0.1"), 0));
-    QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
-    quint16 port = udpSocket.localPort();
-    QVERIFY(port != 0);
-
-    // Initialize device #2
-    QNativeSocketEngine udpSocket2;
-    QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
-
-    // Connect device #2 to #1
-    QVERIFY(udpSocket2.connectToHost(QHostAddress("127.0.0.1"), port));
-    QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
-
-    // Write a message to #1
-    QByteArray message1 = "hei der";
-    QVERIFY(udpSocket2.write(message1.data(),
-                            message1.size()) == message1.size());
-
-    // Read the message from #2
-    QVERIFY(udpSocket.waitForRead());
-    QVERIFY(udpSocket.hasPendingDatagrams());
-    qint64 available = udpSocket.pendingDatagramSize();
-    QVERIFY(available > 0);
-    QByteArray answer;
-    answer.resize(available);
-    QHostAddress senderAddress;
-    quint16 senderPort = 0;
-    QVERIFY(udpSocket.readDatagram(answer.data(), answer.size(),
-                                  &senderAddress,
-                                  &senderPort) == message1.size());
-    QVERIFY(senderAddress == QHostAddress("127.0.0.1"));
-    QVERIFY(senderPort != 0);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpIPv6LoopbackTest()
-{
-#if defined(Q_OS_SYMBIAN)
-    QSKIP("Symbian: IPv6 is not yet supported", SkipAll);
-#endif
-    QNativeSocketEngine udpSocket;
-
-    // Initialize device #1
-    bool init = udpSocket.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol);
-
-    if (!init) {
-        QVERIFY(udpSocket.error() == QAbstractSocket::UnsupportedSocketOperationError);
-    } else {
-        QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv6Protocol);
-
-        // Bind #1 to localhost
-        QVERIFY(udpSocket.bind(QHostAddress("::1"), 0));
-        QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
-        quint16 port = udpSocket.localPort();
-        QVERIFY(port != 0);
-
-        // Initialize device #2
-        QNativeSocketEngine udpSocket2;
-        QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol));
-
-        // Connect device #2 to #1
-        QVERIFY(udpSocket2.connectToHost(QHostAddress("::1"), port));
-        QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
-
-        // Write a message to #1
-        QByteArray message1 = "hei der";
-        QVERIFY(udpSocket2.write(message1.data(),
-                                message1.size()) == message1.size());
-
-        // Read the message from #2
-        QVERIFY(udpSocket.waitForRead());
-        QVERIFY(udpSocket.hasPendingDatagrams());
-        qint64 available = udpSocket.pendingDatagramSize();
-        QVERIFY(available > 0);
-        QByteArray answer;
-        answer.resize(available);
-        QHostAddress senderAddress;
-        quint16 senderPort = 0;
-        QVERIFY(udpSocket.readDatagram(answer.data(), answer.size(),
-                                      &senderAddress,
-                                      &senderPort) == message1.size());
-        QVERIFY(senderAddress == QHostAddress("::1"));
-        QVERIFY(senderPort != 0);
-    }
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::broadcastTest()
-{
-#ifdef Q_OS_AIX
-    QSKIP("Broadcast does not work on darko", SkipAll);
-#endif
-    QNativeSocketEngine broadcastSocket;
-
-    // Initialize a regular Udp socket
-    QVERIFY(broadcastSocket.initialize(QAbstractSocket::UdpSocket));
-
-    // Bind to any port on all interfaces
-    QVERIFY(broadcastSocket.bind(QHostAddress::Any, 0));
-    QVERIFY(broadcastSocket.state() == QAbstractSocket::BoundState);
-    quint16 port = broadcastSocket.localPort();
-    QVERIFY(port > 0);
-
-    // Broadcast an inappropriate troll message
-    QByteArray trollMessage
-        = "MOOT wtf is a MOOT? talk english not your sutpiD ENGLISH.";
-    QVERIFY(broadcastSocket.writeDatagram(trollMessage.data(),
-                                         trollMessage.size(),
-                                         QHostAddress::Broadcast,
-                                         port) == trollMessage.size());
-
-    // Wait until we receive it ourselves
-#if defined(Q_OS_FREEBSD)
-    QEXPECT_FAIL("", "Broadcasting to 255.255.255.255 does not work on FreeBSD", Abort);
-#endif
-    QVERIFY(broadcastSocket.waitForRead());
-    QVERIFY(broadcastSocket.hasPendingDatagrams());
-
-    qlonglong available = broadcastSocket.pendingDatagramSize();
-    QByteArray response;
-    response.resize(available);
-    QVERIFY(broadcastSocket.readDatagram(response.data(), response.size())
-           == response.size());
-    QCOMPARE(response, trollMessage);
-
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::serverTest()
-{
-    QNativeSocketEngine server;
-
-    // Initialize a Tcp socket
-    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
-
-    // Bind to any port on all interfaces
-    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
-    QVERIFY(server.state() == QAbstractSocket::BoundState);
-    quint16 port = server.localPort();
-
-    // Listen for incoming connections
-    QVERIFY(server.listen());
-    QVERIFY(server.state() == QAbstractSocket::ListeningState);
-
-    // Initialize a Tcp socket
-    QNativeSocketEngine client;
-    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
-    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
-        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
-        QVERIFY(client.waitForWrite());
-        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
-    }
-
-    // The server accepts the connection
-    int socketDescriptor = server.accept();
-    QVERIFY(socketDescriptor > 0);
-
-    // A socket device is initialized on the server side, passing the
-    // socket descriptor from accept(). It's pre-connected.
-    QNativeSocketEngine serverSocket;
-    QVERIFY(serverSocket.initialize(socketDescriptor));
-    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
-
-    // The server socket sends a greeting to the clietn
-    QByteArray greeting = "Greetings!";
-    QVERIFY(serverSocket.write(greeting.data(),
-                              greeting.size()) == greeting.size());
-
-    // The client waits for the greeting to arrive
-    QVERIFY(client.waitForRead());
-    qint64 available = client.bytesAvailable();
-    QVERIFY(available > 0);
-
-    // The client reads the greeting and checks that it's correct
-    QByteArray response;
-    response.resize(available);
-    QVERIFY(client.read(response.data(),
-                       response.size()) == response.size());
-    QCOMPARE(response, greeting);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpLoopbackPerformance()
-{
-#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
-    QSKIP("Not working on Emulator without WinPCAP", SkipAll);
-#endif
-    QNativeSocketEngine udpSocket;
-
-    // Initialize device #1
-    QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
-    QVERIFY(udpSocket.isValid());
-    QVERIFY(udpSocket.socketDescriptor() != -1);
-    QVERIFY(udpSocket.protocol() == QAbstractSocket::IPv4Protocol);
-    QVERIFY(udpSocket.socketType() == QAbstractSocket::UdpSocket);
-    QVERIFY(udpSocket.state() == QAbstractSocket::UnconnectedState);
-
-    // Bind #1 to localhost
-    QVERIFY(udpSocket.bind(QHostAddress("127.0.0.1"), 0));
-    QVERIFY(udpSocket.state() == QAbstractSocket::BoundState);
-    quint16 port = udpSocket.localPort();
-    QVERIFY(port != 0);
-
-    // Initialize device #2
-    QNativeSocketEngine udpSocket2;
-    QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
-
-    // Connect device #2 to #1
-    QVERIFY(udpSocket2.connectToHost(QHostAddress("127.0.0.1"), port));
-    QVERIFY(udpSocket2.state() == QAbstractSocket::ConnectedState);
-
-    const int messageSize = 8192;
-    QByteArray message1(messageSize, '@');
-    QByteArray answer(messageSize, '@');
-
-    QHostAddress localhost = QHostAddress::LocalHost;
-
-    qlonglong readBytes = 0;
-    QTime timer;
-    timer.start();
-    while (timer.elapsed() < 5000) {
-        udpSocket2.write(message1.data(), message1.size());
-        udpSocket.waitForRead();
-        while (udpSocket.hasPendingDatagrams()) {
-            readBytes += (qlonglong) udpSocket.readDatagram(answer.data(),
-                                                             answer.size());
-        }
-    }
-
-    qDebug("\t\t%.1fMB/%.1fs: %.1fMB/s",
-           readBytes / (1024.0 * 1024.0),
-           timer.elapsed() / 1024.0,
-           (readBytes / (timer.elapsed() / 1000.0)) / (1024 * 1024));
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::tcpLoopbackPerformance()
-{
-    QNativeSocketEngine server;
-
-    // Initialize a Tcp socket
-    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
-
-    // Bind to any port on all interfaces
-    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
-    QVERIFY(server.state() == QAbstractSocket::BoundState);
-    quint16 port = server.localPort();
-
-    // Listen for incoming connections
-    QVERIFY(server.listen());
-    QVERIFY(server.state() == QAbstractSocket::ListeningState);
-
-    // Initialize a Tcp socket
-    QNativeSocketEngine client;
-    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
-
-    // Connect to our server
-    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
-        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
-        QVERIFY(client.waitForWrite());
-        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
-    }
-
-    // The server accepts the connectio
-    int socketDescriptor = server.accept();
-    QVERIFY(socketDescriptor > 0);
-
-    // A socket device is initialized on the server side, passing the
-    // socket descriptor from accept(). It's pre-connected.
-    QNativeSocketEngine serverSocket;
-    QVERIFY(serverSocket.initialize(socketDescriptor));
-    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
-
-    const int messageSize = 1024 * 256;
-    QByteArray message1(messageSize, '@');
-    QByteArray answer(messageSize, '@');
-
-    QTime timer;
-    timer.start();
-    qlonglong readBytes = 0;
-    while (timer.elapsed() < 5000) {
-        qlonglong written = serverSocket.write(message1.data(), message1.size());
-        while (written > 0) {
-            client.waitForRead();
-            if (client.bytesAvailable() > 0) {
-                qlonglong readNow = client.read(answer.data(), answer.size());
-                written -= readNow;
-                readBytes += readNow;
-            }
-        }
-    }
-
-    qDebug("\t\t%.1fMB/%.1fs: %.1fMB/s",
-           readBytes / (1024.0 * 1024.0),
-           timer.elapsed() / 1024.0,
-           (readBytes / (timer.elapsed() / 1000.0)) / (1024 * 1024));
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::readWriteBufferSize()
-{
-    QNativeSocketEngine device;
-
-    QVERIFY(device.initialize(QAbstractSocket::TcpSocket));
-
-    qint64 bufferSize = device.receiveBufferSize();
-    QVERIFY(bufferSize != -1);
-    device.setReceiveBufferSize(bufferSize + 1);
-#if defined(Q_OS_WINCE)
-    QEXPECT_FAIL(0, "Not supported by default on WinCE", Continue);
-#endif
-    QVERIFY(device.receiveBufferSize() > bufferSize);
-
-    bufferSize = device.sendBufferSize();
-    QVERIFY(bufferSize != -1);
-    device.setSendBufferSize(bufferSize + 1);
-    QVERIFY(device.sendBufferSize() > bufferSize);
-
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::tooManySockets()
-{
-#if defined Q_OS_WIN
-    QSKIP("Certain windows machines suffocate and spend too much time in this test.", SkipAll);
-#endif
-    QList<QNativeSocketEngine *> sockets;
-    QNativeSocketEngine *socketLayer = 0;
-    for (;;) {
-        socketLayer = new QNativeSocketEngine;
-        sockets.append(socketLayer);
-
-        if (!socketLayer->initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol))
-            break;
-    }
-
-    QCOMPARE(socketLayer->error(), QAbstractSocket::SocketResourceError);
-
-    qDeleteAll(sockets);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::bind()
-{
-#if !defined Q_OS_WIN && !defined Q_OS_SYMBIAN
-    QNativeSocketEngine binder;
-    QVERIFY(binder.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-    QVERIFY(!binder.bind(QHostAddress::Any, 82));
-    QVERIFY(binder.error() == QAbstractSocket::SocketAccessError);
-#endif
-
-    QNativeSocketEngine binder2;
-    QVERIFY(binder2.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-    QVERIFY(binder2.bind(QHostAddress::Any, 31180));
-
-    QNativeSocketEngine binder3;
-    QVERIFY(binder3.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-    QVERIFY(!binder3.bind(QHostAddress::Any, 31180));
-
-#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
-    qDebug("On Symbian Emulator (WinSock) we get EADDRNOTAVAIL instead of EADDRINUSE");
-    QVERIFY(binder3.error() == QAbstractSocket::SocketAddressNotAvailableError);
-#else
-    QVERIFY(binder3.error() == QAbstractSocket::AddressInUseError);
-#endif
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::networkError()
-{
-    QNativeSocketEngine client;
-
-    QVERIFY(client.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
-
-    const bool isConnected = client.connectToHost(QtNetworkSettings::serverIP(), 143);
-    if (!isConnected) {
-        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
-        QVERIFY(client.waitForWrite());
-        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
-    }
-    QVERIFY(client.state() == QAbstractSocket::ConnectedState);
-
-    // An unexpected network error!
-#ifdef Q_OS_WIN
-    // could use shutdown to produce different errors
-    ::closesocket(client.socketDescriptor());
-#else
-    ::close(client.socketDescriptor());
-#endif
-
-    QVERIFY(client.read(0, 0) == -1);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::setSocketDescriptor()
-{
-    QNativeSocketEngine socket1;
-    QVERIFY(socket1.initialize(QAbstractSocket::TcpSocket));
-
-    QNativeSocketEngine socket2;
-    QVERIFY(socket2.initialize(socket1.socketDescriptor()));
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::invalidSend()
-{
-    QNativeSocketEngine socket;
-    QVERIFY(socket.initialize(QAbstractSocket::TcpSocket));
-
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::writeDatagram() was"
-                               " called by a socket other than QAbstractSocket::UdpSocket");
-    QCOMPARE(socket.writeDatagram("hei", 3, QHostAddress::LocalHost, 143),
-            (qlonglong) -1);
-}
-
-//---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::receiveUrgentData()
-{
-    QNativeSocketEngine server;
-
-    QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
-
-    // Bind to any port on all interfaces
-    QVERIFY(server.bind(QHostAddress("0.0.0.0"), 0));
-    QVERIFY(server.state() == QAbstractSocket::BoundState);
-    quint16 port = server.localPort();
-
-    QVERIFY(server.listen());
-    QVERIFY(server.state() == QAbstractSocket::ListeningState);
-
-    QNativeSocketEngine client;
-    QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
-
-    if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
-        QVERIFY(client.state() == QAbstractSocket::ConnectingState);
-        QVERIFY(client.waitForWrite());
-        QVERIFY(client.state() == QAbstractSocket::ConnectedState);
-    }
-
-    int socketDescriptor = server.accept();
-    QVERIFY(socketDescriptor > 0);
-
-    QNativeSocketEngine serverSocket;
-    QVERIFY(serverSocket.initialize(socketDescriptor));
-    QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
-
-    char msg;
-    int available;
-    QByteArray response;
-
-#if defined Q_OS_HPUX
-    QSKIP("Native OOB data test doesn't work on HP-UX.", SkipAll);
-#elif defined (Q_OS_WINCE)
-    QSKIP("Native OOB data test doesn't work on WinCE.", SkipAll);
-#endif
-
-    // The server sends an urgent message
-    msg = 'Q';
-    QCOMPARE(int(::send(socketDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
-
-    // The client receives the urgent message
-    QVERIFY(client.waitForRead());
-    available = client.bytesAvailable();
-    QCOMPARE(available, 1);
-    response.resize(available);
-    QCOMPARE(client.read(response.data(), response.size()), qint64(1));
-    QCOMPARE(response.at(0), msg);
-
-    // The client sends an urgent message
-    msg = 'T';
-    int clientDescriptor = client.socketDescriptor();
-    QCOMPARE(int(::send(clientDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
-
-    // The server receives the urgent message
-    QVERIFY(serverSocket.waitForRead());
-    available = serverSocket.bytesAvailable();
-    QCOMPARE(available, 1);
-    response.resize(available);
-    QCOMPARE(serverSocket.read(response.data(), response.size()), qint64(1));
-    QCOMPARE(response.at(0), msg);
-
-}
-
-QTEST_MAIN(tst_QNativeSocketEngine)
-#include "tst_qnativesocketengine.moc"
-- 
cgit v0.12


From 94226b6865615e844c46c6c068e3d4e9a9eb2068 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Thu, 9 Dec 2010 15:29:30 +0100
Subject: Make tst_platformsocketengine work

Compile and instanciate the right engine.

Reviewed-by: Shane Kearns
---
 tests/auto/network.pro                             |   4 +-
 tests/auto/platformsocketengine/.gitignore         |   2 +-
 .../platformsocketengine/platformsocketengine.pro  |   6 +-
 .../tst_platformsocketengine.cpp                   | 114 +++++++++++----------
 tests/auto/qhttpsocketengine/qhttpsocketengine.pro |   2 +-
 .../qsocks5socketengine/qsocks5socketengine.pro    |   2 +-
 6 files changed, 68 insertions(+), 62 deletions(-)

diff --git a/tests/auto/network.pro b/tests/auto/network.pro
index 31c754c..5bf6a92 100644
--- a/tests/auto/network.pro
+++ b/tests/auto/network.pro
@@ -16,7 +16,7 @@ SUBDIRS=\
     qhttpnetworkconnection \
     qhttpnetworkreply \
     qhttpsocketengine \
-    qnativesocketengine \
+    platformsocketengine \
     qnetworkaccessmanager \
     qnetworkaddressentry \
     qnetworkconfiguration \
@@ -40,7 +40,7 @@ SUBDIRS=\
     qauthenticator \
     qhttpnetworkconnection \
     qhttpnetworkreply \
-    qnativesocketengine \
+    platformsocketengine \
     qsocketnotifier \
     qsocks5socketengine \
 
diff --git a/tests/auto/platformsocketengine/.gitignore b/tests/auto/platformsocketengine/.gitignore
index 4700e5e..afe9389 100644
--- a/tests/auto/platformsocketengine/.gitignore
+++ b/tests/auto/platformsocketengine/.gitignore
@@ -1 +1 @@
-tst_qnativesocketengine
+tst_platformsocketengine
diff --git a/tests/auto/platformsocketengine/platformsocketengine.pro b/tests/auto/platformsocketengine/platformsocketengine.pro
index 0275d37..04816af 100644
--- a/tests/auto/platformsocketengine/platformsocketengine.pro
+++ b/tests/auto/platformsocketengine/platformsocketengine.pro
@@ -1,7 +1,7 @@
 load(qttest_p4)
-SOURCES  += tst_qnativesocketengine.cpp
+SOURCES  += tst_platformsocketengine.cpp
 
-include(../qnativesocketengine/qsocketengine.pri)
+include(../platformsocketengine/platformsocketengine.pri)
 
 requires(contains(QT_CONFIG,private_tests))
 
@@ -10,4 +10,4 @@ MOC_DIR=tmp
 QT = core network
 
 symbian: TARGET.CAPABILITY = NetworkServices
-
+symbian: INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE
\ No newline at end of file
diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
index 2b0b632..bede360 100644
--- a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -50,7 +50,6 @@
 
 
 #include <qdatastream.h>
-#include <private/qnativesocketengine_p.h>
 
 #include <qhostaddress.h>
 #include <qdatetime.h>
@@ -63,6 +62,13 @@
 
 #include <stddef.h>
 
+#ifdef Q_OS_SYMBIAN
+#define PLATFORMSOCKETENGINE QSymbianSocketEngine
+#include <private/qsymbiansocketengine_p.h>
+#else
+#define PLATFORMSOCKETENGINE QNativeSocketEngine
+#include <private/qnativesocketengine_p.h>
+#endif
 
 #include <qstringlist.h>
 
@@ -70,13 +76,13 @@
 
 //TESTED_FILES=network/qnativesocketengine.cpp network/qnativesocketengine_p.h network/qnativesocketengine_unix.cpp
 
-class tst_QNativeSocketEngine : public QObject
+class tst_PlatformSocketEngine : public QObject
 {
     Q_OBJECT
 
 public:
-    tst_QNativeSocketEngine();
-    virtual ~tst_QNativeSocketEngine();
+    tst_PlatformSocketEngine();
+    virtual ~tst_PlatformSocketEngine();
 
 
 public slots:
@@ -100,27 +106,27 @@ private slots:
     void receiveUrgentData();
 };
 
-tst_QNativeSocketEngine::tst_QNativeSocketEngine()
+tst_PlatformSocketEngine::tst_PlatformSocketEngine()
 {
     Q_SET_DEFAULT_IAP
 }
 
-tst_QNativeSocketEngine::~tst_QNativeSocketEngine()
+tst_PlatformSocketEngine::~tst_PlatformSocketEngine()
 {
 }
 
-void tst_QNativeSocketEngine::init()
+void tst_PlatformSocketEngine::init()
 {
 }
 
-void tst_QNativeSocketEngine::cleanup()
+void tst_PlatformSocketEngine::cleanup()
 {
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::construction()
+void tst_PlatformSocketEngine::construction()
 {
-    QNativeSocketEngine socketDevice;
+    PLATFORMSOCKETENGINE socketDevice;
 
     QVERIFY(!socketDevice.isValid());
 
@@ -145,9 +151,9 @@ void tst_QNativeSocketEngine::construction()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::simpleConnectToIMAP()
+void tst_PlatformSocketEngine::simpleConnectToIMAP()
 {
-    QNativeSocketEngine socketDevice;
+    PLATFORMSOCKETENGINE socketDevice;
 
     // Initialize device
     QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
@@ -202,12 +208,12 @@ void tst_QNativeSocketEngine::simpleConnectToIMAP()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpLoopbackTest()
+void tst_PlatformSocketEngine::udpLoopbackTest()
 {
 #ifdef SYMBIAN_WINSOCK_CONNECTIVITY
     QSKIP("Not working on Emulator without WinPCAP", SkipAll);
 #endif
-    QNativeSocketEngine udpSocket;
+    PLATFORMSOCKETENGINE udpSocket;
 
     // Initialize device #1
     QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
@@ -224,7 +230,7 @@ void tst_QNativeSocketEngine::udpLoopbackTest()
     QVERIFY(port != 0);
 
     // Initialize device #2
-    QNativeSocketEngine udpSocket2;
+    PLATFORMSOCKETENGINE udpSocket2;
     QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
 
     // Connect device #2 to #1
@@ -253,12 +259,12 @@ void tst_QNativeSocketEngine::udpLoopbackTest()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpIPv6LoopbackTest()
+void tst_PlatformSocketEngine::udpIPv6LoopbackTest()
 {
 #if defined(Q_OS_SYMBIAN)
     QSKIP("Symbian: IPv6 is not yet supported", SkipAll);
 #endif
-    QNativeSocketEngine udpSocket;
+    PLATFORMSOCKETENGINE udpSocket;
 
     // Initialize device #1
     bool init = udpSocket.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol);
@@ -275,7 +281,7 @@ void tst_QNativeSocketEngine::udpIPv6LoopbackTest()
         QVERIFY(port != 0);
 
         // Initialize device #2
-        QNativeSocketEngine udpSocket2;
+        PLATFORMSOCKETENGINE udpSocket2;
         QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket, QAbstractSocket::IPv6Protocol));
 
         // Connect device #2 to #1
@@ -305,12 +311,12 @@ void tst_QNativeSocketEngine::udpIPv6LoopbackTest()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::broadcastTest()
+void tst_PlatformSocketEngine::broadcastTest()
 {
 #ifdef Q_OS_AIX
     QSKIP("Broadcast does not work on darko", SkipAll);
 #endif
-    QNativeSocketEngine broadcastSocket;
+    PLATFORMSOCKETENGINE broadcastSocket;
 
     // Initialize a regular Udp socket
     QVERIFY(broadcastSocket.initialize(QAbstractSocket::UdpSocket));
@@ -346,9 +352,9 @@ void tst_QNativeSocketEngine::broadcastTest()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::serverTest()
+void tst_PlatformSocketEngine::serverTest()
 {
-    QNativeSocketEngine server;
+    PLATFORMSOCKETENGINE server;
 
     // Initialize a Tcp socket
     QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
@@ -363,7 +369,7 @@ void tst_QNativeSocketEngine::serverTest()
     QVERIFY(server.state() == QAbstractSocket::ListeningState);
 
     // Initialize a Tcp socket
-    QNativeSocketEngine client;
+    PLATFORMSOCKETENGINE client;
     QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
     if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
         QVERIFY(client.state() == QAbstractSocket::ConnectingState);
@@ -377,7 +383,7 @@ void tst_QNativeSocketEngine::serverTest()
 
     // A socket device is initialized on the server side, passing the
     // socket descriptor from accept(). It's pre-connected.
-    QNativeSocketEngine serverSocket;
+    PLATFORMSOCKETENGINE serverSocket;
     QVERIFY(serverSocket.initialize(socketDescriptor));
     QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
 
@@ -400,12 +406,12 @@ void tst_QNativeSocketEngine::serverTest()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::udpLoopbackPerformance()
+void tst_PlatformSocketEngine::udpLoopbackPerformance()
 {
 #ifdef SYMBIAN_WINSOCK_CONNECTIVITY
     QSKIP("Not working on Emulator without WinPCAP", SkipAll);
 #endif
-    QNativeSocketEngine udpSocket;
+    PLATFORMSOCKETENGINE udpSocket;
 
     // Initialize device #1
     QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
@@ -422,7 +428,7 @@ void tst_QNativeSocketEngine::udpLoopbackPerformance()
     QVERIFY(port != 0);
 
     // Initialize device #2
-    QNativeSocketEngine udpSocket2;
+    PLATFORMSOCKETENGINE udpSocket2;
     QVERIFY(udpSocket2.initialize(QAbstractSocket::UdpSocket));
 
     // Connect device #2 to #1
@@ -454,9 +460,9 @@ void tst_QNativeSocketEngine::udpLoopbackPerformance()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::tcpLoopbackPerformance()
+void tst_PlatformSocketEngine::tcpLoopbackPerformance()
 {
-    QNativeSocketEngine server;
+    PLATFORMSOCKETENGINE server;
 
     // Initialize a Tcp socket
     QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
@@ -471,7 +477,7 @@ void tst_QNativeSocketEngine::tcpLoopbackPerformance()
     QVERIFY(server.state() == QAbstractSocket::ListeningState);
 
     // Initialize a Tcp socket
-    QNativeSocketEngine client;
+    PLATFORMSOCKETENGINE client;
     QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
 
     // Connect to our server
@@ -487,7 +493,7 @@ void tst_QNativeSocketEngine::tcpLoopbackPerformance()
 
     // A socket device is initialized on the server side, passing the
     // socket descriptor from accept(). It's pre-connected.
-    QNativeSocketEngine serverSocket;
+    PLATFORMSOCKETENGINE serverSocket;
     QVERIFY(serverSocket.initialize(socketDescriptor));
     QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
 
@@ -517,9 +523,9 @@ void tst_QNativeSocketEngine::tcpLoopbackPerformance()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::readWriteBufferSize()
+void tst_PlatformSocketEngine::readWriteBufferSize()
 {
-    QNativeSocketEngine device;
+    PLATFORMSOCKETENGINE device;
 
     QVERIFY(device.initialize(QAbstractSocket::TcpSocket));
 
@@ -539,15 +545,15 @@ void tst_QNativeSocketEngine::readWriteBufferSize()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::tooManySockets()
+void tst_PlatformSocketEngine::tooManySockets()
 {
 #if defined Q_OS_WIN
     QSKIP("Certain windows machines suffocate and spend too much time in this test.", SkipAll);
 #endif
-    QList<QNativeSocketEngine *> sockets;
-    QNativeSocketEngine *socketLayer = 0;
+    QList<PLATFORMSOCKETENGINE *> sockets;
+    PLATFORMSOCKETENGINE *socketLayer = 0;
     for (;;) {
-        socketLayer = new QNativeSocketEngine;
+        socketLayer = new PLATFORMSOCKETENGINE;
         sockets.append(socketLayer);
 
         if (!socketLayer->initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol))
@@ -560,20 +566,20 @@ void tst_QNativeSocketEngine::tooManySockets()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::bind()
+void tst_PlatformSocketEngine::bind()
 {
 #if !defined Q_OS_WIN && !defined Q_OS_SYMBIAN
-    QNativeSocketEngine binder;
+    PLATFORMSOCKETENGINE binder;
     QVERIFY(binder.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
     QVERIFY(!binder.bind(QHostAddress::Any, 82));
     QVERIFY(binder.error() == QAbstractSocket::SocketAccessError);
 #endif
 
-    QNativeSocketEngine binder2;
+    PLATFORMSOCKETENGINE binder2;
     QVERIFY(binder2.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
     QVERIFY(binder2.bind(QHostAddress::Any, 31180));
 
-    QNativeSocketEngine binder3;
+    PLATFORMSOCKETENGINE binder3;
     QVERIFY(binder3.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
     QVERIFY(!binder3.bind(QHostAddress::Any, 31180));
 
@@ -586,9 +592,9 @@ void tst_QNativeSocketEngine::bind()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::networkError()
+void tst_PlatformSocketEngine::networkError()
 {
-    QNativeSocketEngine client;
+    PLATFORMSOCKETENGINE client;
 
     QVERIFY(client.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
 
@@ -612,19 +618,19 @@ void tst_QNativeSocketEngine::networkError()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::setSocketDescriptor()
+void tst_PlatformSocketEngine::setSocketDescriptor()
 {
-    QNativeSocketEngine socket1;
+    PLATFORMSOCKETENGINE socket1;
     QVERIFY(socket1.initialize(QAbstractSocket::TcpSocket));
 
-    QNativeSocketEngine socket2;
+    PLATFORMSOCKETENGINE socket2;
     QVERIFY(socket2.initialize(socket1.socketDescriptor()));
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::invalidSend()
+void tst_PlatformSocketEngine::invalidSend()
 {
-    QNativeSocketEngine socket;
+    PLATFORMSOCKETENGINE socket;
     QVERIFY(socket.initialize(QAbstractSocket::TcpSocket));
 
     QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::writeDatagram() was"
@@ -634,9 +640,9 @@ void tst_QNativeSocketEngine::invalidSend()
 }
 
 //---------------------------------------------------------------------------
-void tst_QNativeSocketEngine::receiveUrgentData()
+void tst_PlatformSocketEngine::receiveUrgentData()
 {
-    QNativeSocketEngine server;
+    PLATFORMSOCKETENGINE server;
 
     QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
 
@@ -648,7 +654,7 @@ void tst_QNativeSocketEngine::receiveUrgentData()
     QVERIFY(server.listen());
     QVERIFY(server.state() == QAbstractSocket::ListeningState);
 
-    QNativeSocketEngine client;
+    PLATFORMSOCKETENGINE client;
     QVERIFY(client.initialize(QAbstractSocket::TcpSocket));
 
     if (!client.connectToHost(QHostAddress("127.0.0.1"), port)) {
@@ -660,7 +666,7 @@ void tst_QNativeSocketEngine::receiveUrgentData()
     int socketDescriptor = server.accept();
     QVERIFY(socketDescriptor > 0);
 
-    QNativeSocketEngine serverSocket;
+    PLATFORMSOCKETENGINE serverSocket;
     QVERIFY(serverSocket.initialize(socketDescriptor));
     QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
 
@@ -701,5 +707,5 @@ void tst_QNativeSocketEngine::receiveUrgentData()
 
 }
 
-QTEST_MAIN(tst_QNativeSocketEngine)
-#include "tst_qnativesocketengine.moc"
+QTEST_MAIN(tst_PlatformSocketEngine)
+#include "tst_platformsocketengine.moc"
diff --git a/tests/auto/qhttpsocketengine/qhttpsocketengine.pro b/tests/auto/qhttpsocketengine/qhttpsocketengine.pro
index d76ebb6..6df6192 100644
--- a/tests/auto/qhttpsocketengine/qhttpsocketengine.pro
+++ b/tests/auto/qhttpsocketengine/qhttpsocketengine.pro
@@ -2,7 +2,7 @@ load(qttest_p4)
 SOURCES  += tst_qhttpsocketengine.cpp
 
 
-include(../qnativesocketengine/qsocketengine.pri)
+include(../platformsocketengine/platformsocketengine.pri)
 
 MOC_DIR=tmp
 
diff --git a/tests/auto/qsocks5socketengine/qsocks5socketengine.pro b/tests/auto/qsocks5socketengine/qsocks5socketengine.pro
index 171d428..c82c62d 100644
--- a/tests/auto/qsocks5socketengine/qsocks5socketengine.pro
+++ b/tests/auto/qsocks5socketengine/qsocks5socketengine.pro
@@ -2,7 +2,7 @@ load(qttest_p4)
 SOURCES  += tst_qsocks5socketengine.cpp
 
 
-include(../qnativesocketengine/qsocketengine.pri)
+include(../platformsocketengine/platformsocketengine.pri)
 
 
 MOC_DIR=tmp
-- 
cgit v0.12


From 9bbe9bc76222fa6f89283d96cbd9e448e331f909 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Thu, 9 Dec 2010 15:57:23 +0100
Subject: QSymbianSocketEngine: Some missing functions

---
 src/network/socket/qsymbiansocketengine.cpp | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 1490bdd..9eadf0a 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -465,6 +465,26 @@ int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
     return -1;
 }
 
+qint64 QSymbianSocketEngine::receiveBufferSize() const
+{
+    return option(ReceiveBufferSocketOption);
+}
+
+void QSymbianSocketEngine::setReceiveBufferSize(qint64 size)
+{
+    setOption(ReceiveBufferSocketOption, size);
+}
+
+qint64 QSymbianSocketEngine::sendBufferSize() const
+{
+    return option(SendBufferSocketOption);
+}
+
+void QSymbianSocketEngine::setSendBufferSize(qint64 size)
+{
+    setOption(SendBufferSocketOption, size);
+}
+
 bool QSymbianSocketEngine::connectToHostByName(const QString &name, quint16 port)
 {
     // FIXME for engines that support hostnames.. not for us then i guess.
-- 
cgit v0.12


From 931b3189d727f25f97c84f33c1d5fddaf0538777 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 9 Dec 2010 16:08:43 +0000
Subject: Fix some crashes in the symbian socket engine

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qeventdispatcher_symbian.cpp |   8 +-
 src/network/kernel/qhostinfo_symbian.cpp        |   5 ++
 src/network/socket/qsymbiansocketengine.cpp     | 113 ++++++++++++++++++------
 3 files changed, 99 insertions(+), 27 deletions(-)

diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index 55be6eb..f70080a 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -1026,14 +1026,17 @@ bool QEventDispatcherSymbian::hasPendingEvents()
 
 void QEventDispatcherSymbian::registerSocketNotifier ( QSocketNotifier * notifier )
 {
-    QSocketActiveObject *socketAO = new QSocketActiveObject(this, notifier);
+    //TODO: just need to be able to do something when event loop has sockets disabled
+/*    QSocketActiveObject *socketAO = new QSocketActiveObject(this, notifier);
     Q_CHECK_PTR(socketAO);
     m_notifiers.insert(notifier, socketAO);
-    selectThread().requestSocketEvents(notifier, &socketAO->iStatus);
+    selectThread().requestSocketEvents(notifier, &socketAO->iStatus);*/
 }
 
 void QEventDispatcherSymbian::unregisterSocketNotifier ( QSocketNotifier * notifier )
 {
+    //TODO: just need to be able to do something when event loop has sockets disabled
+    /*
     if (m_selectThread)
         m_selectThread->cancelSocketEvents(notifier);
     if (m_notifiers.contains(notifier)) {
@@ -1042,6 +1045,7 @@ void QEventDispatcherSymbian::unregisterSocketNotifier ( QSocketNotifier * notif
         sockObj->deleteLater();
         m_notifiers.remove(notifier);
     }
+    */
 }
 
 void QEventDispatcherSymbian::reactivateSocketNotifier(QSocketNotifier *notifier)
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 287021f..e70f2ce 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -89,6 +89,11 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     }
     */
 
+    //TODO: HACK to return qt-test-server's ip
+    QList<QHostAddress> addresses;
+    addresses.append(QHostAddress("192.168.1.8"));
+    results.setHostName(hostName);
+    results.setAddresses(addresses);
     return results;
 }
 
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 9eadf0a..b92b3bc 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -206,7 +206,8 @@ QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
     connection(QSymbianSocketManager::instance().defaultConnection()),
     readNotifier(0),
     writeNotifier(0),
-    exceptNotifier(0)
+    exceptNotifier(0),
+    asyncSelect(0)
 {
 }
 
@@ -306,6 +307,11 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
     if (isValid())
         close();
 
+    if(!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, d->nativeSocket)) {
+        d->setError(QAbstractSocket::SocketResourceError,
+            QSymbianSocketEnginePrivate::InvalidSocketErrorString);
+        return false;
+    }
     d->socketDescriptor = socketDescriptor;
 
     // determine socket type and protocol
@@ -666,9 +672,7 @@ int QSymbianSocketEngine::accept()
         qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
         return 0;
     }
-    // FIXME Qt Handle of new socket must be retrieved from QSymbianSocketManager
-    // and then returned. Not the SubSessionHandle! Also set the socket to nonblocking.
-    return blankSocket.SubSessionHandle();
+    return QSymbianSocketManager::instance().addSocket(blankSocket);
 }
 
 qint64 QSymbianSocketEngine::bytesAvailable() const
@@ -854,18 +858,47 @@ void QSymbianSocketEngine::close()
     qDebug("QSymbianSocketEnginePrivate::nativeClose()");
 #endif
 
+    if (d->readNotifier)
+        d->readNotifier->setEnabled(false);
+    if (d->writeNotifier)
+        d->writeNotifier->setEnabled(false);
+    if (d->exceptNotifier)
+        d->exceptNotifier->setEnabled(false);
+    if(d->asyncSelect) {
+        d->asyncSelect->deleteLater();
+        d->asyncSelect = 0;
+    }
+
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
     d->nativeSocket.Close();
     QSymbianSocketManager::instance().removeSocket(d->nativeSocket);
-
-    // FIXME set nativeSocket to 0 ?
+    d->socketDescriptor = -1;
+
+    d->socketState = QAbstractSocket::UnconnectedState;
+    d->hasSetSocketError = false;
+    d->localPort = 0;
+    d->localAddress.clear();
+    d->peerPort = 0;
+    d->peerAddress.clear();
+    if (d->readNotifier) {
+        qDeleteInEventHandler(d->readNotifier);
+        d->readNotifier = 0;
+    }
+    if (d->writeNotifier) {
+        qDeleteInEventHandler(d->writeNotifier);
+        d->writeNotifier = 0;
+    }
+    if (d->exceptNotifier) {
+        qDeleteInEventHandler(d->exceptNotifier);
+        d->exceptNotifier = 0;
+    }
 }
 
 qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 {
     Q_D(QSymbianSocketEngine);
     TPtrC8 buffer((TUint8*)data, (int)len);
-    TSockXfrLength sentBytes;
+    TSockXfrLength sentBytes = 0;
     TRequestStatus status; //TODO: OMG sync send!
     d->nativeSocket.Send(buffer, 0, status, sentBytes);
     User::WaitForRequest(status);
@@ -874,6 +907,7 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
     if (err) {
         switch (err) {
         case KErrDisconnected:
+        case KErrEof:
             sentBytes = -1;
             d->setError(QAbstractSocket::RemoteHostClosedError, d->RemoteHostClosedErrorString);
             close();
@@ -882,9 +916,12 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
             d->setError(QAbstractSocket::DatagramTooLargeError, d->DatagramTooLargeErrorString);
             break;
         case KErrWouldBlock:
-            sentBytes = 0;
+            break;
         default:
-            d->setError(QAbstractSocket::NetworkError, d->SendDatagramErrorString);
+            sentBytes = -1;
+            d->setError(err);
+            close();
+            break;
         }
     }
 
@@ -914,20 +951,13 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     TInt err = status.Int();
     int r = received();
 
-    if (err) {
-        switch(err) {
-        case KErrWouldBlock:
-            // No data was available for reading
-            r = -2;
-            break;
-        case KErrDisconnected:
-            r = 0;
-            break;
-        default:
-            r = -1;
-            //error string is now set in read(), not here in nativeRead()
-            break;
-        }
+    if (err == KErrWouldBlock) {
+        // No data was available for reading
+        r = -2;
+    } else if (err != KErrNone) {
+        d->setError(err);
+        close();
+        r = -1;
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
@@ -1188,6 +1218,36 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
     }
 }
 
+//TODO: use QSystemError class when file engine is merged to master
+void QSymbianSocketEnginePrivate::setError(TInt symbianError)
+{
+    hasSetSocketError = true;
+    switch(symbianError) {
+    case KErrDisconnected:
+    case KErrEof:
+        setError(QAbstractSocket::RemoteHostClosedError,
+                 QSymbianSocketEnginePrivate::RemoteHostClosedErrorString);
+        break;
+    case KErrNetUnreach:
+        setError(QAbstractSocket::NetworkError,
+                 QSymbianSocketEnginePrivate::NetworkUnreachableErrorString);
+        break;
+    case KErrHostUnreach:
+        setError(QAbstractSocket::NetworkError,
+                 QSymbianSocketEnginePrivate::HostUnreachableErrorString);
+        break;
+    case KErrNoProtocolOpt:
+        setError(QAbstractSocket::NetworkError,
+                 QSymbianSocketEnginePrivate::ProtocolUnsupportedErrorString);
+        break;
+    default:
+        socketError = QAbstractSocket::NetworkError;
+        socketErrorString = QString::number(symbianError);
+        break;
+    }
+
+}
+
 class QReadNotifier : public QSocketNotifier
 {
     friend class QAsyncSelect;
@@ -1277,7 +1337,7 @@ void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
         d->writeNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
         QWriteNotifier *wn = new QWriteNotifier(d->socketDescriptor, this);
-        d->readNotifier = wn;
+        d->writeNotifier = wn;
         if (!(d->asyncSelect))
             d->asyncSelect = q_check_ptr(new QAsyncSelect(d->threadData->eventDispatcher, d->nativeSocket, this));
         d->asyncSelect->setWriteNotifier(wn);
@@ -1451,7 +1511,7 @@ void QAsyncSelect::RunL()
         QEvent e(QEvent::SockAct);
         iWriteN->event(&e);
     }
-    if ((m_selectBuf() && KSockSelectExcept) || iStatus != KErrNone) {
+    if ((m_selectBuf() & KSockSelectExcept) || iStatus != KErrNone) {
         QEvent e(QEvent::SockAct);
         iExcN->event(&e);
     }
@@ -1463,6 +1523,9 @@ void QAsyncSelect::RunL()
 void QAsyncSelect::deleteLater()
 {
     if (m_inSocketEvent) {
+        iExcN = 0;
+        iReadN = 0;
+        iWriteN = 0;
         m_deleteLater = true;
     } else {
         delete this;
-- 
cgit v0.12


From 9a565b61fc8fdb7dd786072a78e6ae903b59ded2 Mon Sep 17 00:00:00 2001
From: Aaron Tunney <aaron.tunney@accenture.com>
Date: Thu, 9 Dec 2010 18:03:58 +0000
Subject: QHostInfo: Symbian implementation for fromName()

Reviewed-By: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 106 ++++++++++++++++++++++++++-----
 1 file changed, 91 insertions(+), 15 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index e70f2ce..fbd7fe9 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -40,19 +40,44 @@
 ****************************************************************************/
 
 //#define QHOSTINFO_DEBUG
+
+// Symbian Headers
+#include <es_sock.h>
+#include <in_sock.h>
+
+// Qt Headers
 #include <QByteArray>
 #include <QUrl>
+#include <QList>
 
 #include "qplatformdefs.h"
 
 #include "qhostinfo_p.h"
+#include <private/qcore_symbian_p.h>
 
 QT_BEGIN_NAMESPACE
 
+
 QHostInfo QHostInfoAgent::fromName(const QString &hostName)
 {
     QHostInfo results;
 
+    // Connect to ESOCK
+    RSocketServ socketServ(qt_symbianGetSocketServer());
+    RHostResolver hostResolver;
+
+    // Will return both IPv4 and IPv6
+    // TODO: Pass RHostResolver.Open() the global RConnection
+    int err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
+    if (err) {
+        results.setError(QHostInfo::UnknownError);
+        results.setErrorString(tr("Symbian error code: %1").arg(err));
+
+        return results;
+    }
+
+    TNameEntry nameResult;
+
 #if defined(QHOSTINFO_DEBUG)
     qDebug("QHostInfoAgent::fromName(%s) looking up...",
            hostName.toLatin1().constData());
@@ -61,8 +86,26 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     QHostAddress address;
     if (address.setAddress(hostName)) {
         // Reverse lookup
-        // TODO
-        results.setHostName("assume.it.works");
+
+        TInetAddr IpAdd;
+        IpAdd.Input(qt_QString2TPtrC(hostName));
+
+        // Synchronous request. nameResult returns Host Name.
+        hostResolver.GetByAddress(IpAdd, nameResult);
+        if (err) {
+            // TODO - Could there be other errors? Symbian docs don't say.
+            if (err = KErrNotFound) {
+                results.setError(QHostInfo::HostNotFound);
+                results.setErrorString(tr("Host not found"));
+            } else {
+                results.setError(QHostInfo::UnknownError);
+                results.setErrorString(tr("Symbian error code: %1").arg(err));
+            }
+
+            return results;
+        }
+
+        results.setHostName(qt_TDesC2QString(nameResult().iName));
         results.setAddresses(QList<QHostAddress>() << address);
         return results;
     }
@@ -78,32 +121,65 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
         return results;
     }
 
-    // Call getaddrinfo, and place all IPv4 addresses at the start and
+
+    // Call RHostResolver::GetByAddress, and place all IPv4 addresses at the start and
     // the IPv6 addresses at the end of the address list in results.
-    /*
-    results.setError(QHostInfo::HostNotFound);
-    results.setErrorString(tr("Host not found"));
-    } else {
-        results.setError(QHostInfo::UnknownError);
-        results.setErrorString(QString::fromLocal8Bit(gai_strerror(result)));
+
+    // Synchronous request.
+    err = hostResolver.GetByName(qt_QString2TPtrC(aceHostname), nameResult);
+    if (err) {
+        // TODO - Could there be other errors? Symbian docs don't say.
+        if (err = KErrNotFound) {
+            results.setError(QHostInfo::HostNotFound);
+            results.setErrorString(tr("Host not found"));
+        } else {
+            results.setError(QHostInfo::UnknownError);
+            results.setErrorString(tr("Symbian error code: %1").arg(err));
+        }
+
+        return results;
     }
-    */
 
-    //TODO: HACK to return qt-test-server's ip
-    QList<QHostAddress> addresses;
-    addresses.append(QHostAddress("192.168.1.8"));
-    results.setHostName(hostName);
-    results.setAddresses(addresses);
+    QList<QHostAddress> hostAddresses;
+
+    TInetAddr hostAdd = nameResult().iAddr;
+    TBuf<16> ipAddr;
+    // Fill ipAddr with the IP address from hostAdd
+    hostAdd.Output(ipAddr);
+    if (ipAddr.Length() > 0)
+        hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+
+    // Check if there's more than one IP address linkd to this name
+    while (hostResolver.Next(nameResult) == KErrNone) {
+        hostAdd = nameResult().iAddr;
+        hostAdd.Output(ipAddr);
+
+        if (ipAddr.Length() > 0) {
+           if (nameResult().iAddr.Family() == KAfInet) {
+                // IPv4 - prepend
+                hostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
+            } else {
+                // IPv6 - append
+                hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+            }
+        }
+    }
+
+    hostResolver.Close();
+
+    results.setAddresses(hostAddresses);
     return results;
 }
 
 QString QHostInfo::localHostName()
 {
+    // TODO - fill with code.
     return QString();
 }
 
 QString QHostInfo::localDomainName()
 {
+    // TODO - fill with code.
     return QString();
 }
 
-- 
cgit v0.12


From 9c3967b7738b50655a7b9d6a5a0e89fdf2afc1df Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 9 Dec 2010 18:27:51 +0000
Subject: Fix some issues in symbian socket engine

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 97 ++++++++++++++++++++++-------
 1 file changed, 75 insertions(+), 22 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index b92b3bc..602df5c 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -75,6 +75,40 @@
 
 QT_BEGIN_NAMESPACE
 
+// Common constructs
+#define Q_CHECK_VALID_SOCKETLAYER(function, returnValue) do { \
+    if (!isValid()) { \
+        qWarning(""#function" was called on an uninitialized socket device"); \
+        return returnValue; \
+    } } while (0)
+#define Q_CHECK_INVALID_SOCKETLAYER(function, returnValue) do { \
+    if (isValid()) { \
+        qWarning(""#function" was called on an already initialized socket device"); \
+        return returnValue; \
+    } } while (0)
+#define Q_CHECK_STATE(function, checkState, returnValue) do { \
+    if (d->socketState != (checkState)) { \
+        qWarning(""#function" was not called in "#checkState); \
+        return (returnValue); \
+    } } while (0)
+#define Q_CHECK_NOT_STATE(function, checkState, returnValue) do { \
+    if (d->socketState == (checkState)) { \
+        qWarning(""#function" was called in "#checkState); \
+        return (returnValue); \
+    } } while (0)
+#define Q_CHECK_STATES(function, state1, state2, returnValue) do { \
+    if (d->socketState != (state1) && d->socketState != (state2)) { \
+        qWarning(""#function" was called" \
+                 " not in "#state1" or "#state2); \
+        return (returnValue); \
+    } } while (0)
+#define Q_CHECK_TYPE(function, type, returnValue) do { \
+    if (d->socketType != (type)) { \
+        qWarning(#function" was called by a" \
+                 " socket other than "#type""); \
+        return (returnValue); \
+    } } while (0)
+
 #if defined QNATIVESOCKETENGINE_DEBUG
 
 /*
@@ -307,7 +341,7 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
     if (isValid())
         close();
 
-    if(!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, d->nativeSocket)) {
+    if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, d->nativeSocket)) {
         d->setError(QAbstractSocket::SocketResourceError,
             QSymbianSocketEnginePrivate::InvalidSocketErrorString);
         return false;
@@ -539,12 +573,16 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     TInt err = status.Int();
     if (err) {
         switch (err) {
+        case KErrWouldBlock:
+            d->socketState = QAbstractSocket::ConnectingState;
+            break;
         case KErrCouldNotConnect:
             d->setError(QAbstractSocket::ConnectionRefusedError, d->ConnectionRefusedErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrTimedOut:
             d->setError(QAbstractSocket::NetworkError, d->ConnectionTimeOutErrorString);
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         case KErrHostUnreach:
             d->setError(QAbstractSocket::NetworkError, d->HostUnreachableErrorString);
@@ -563,8 +601,8 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
             break;
         case KErrNotSupported:
         case KErrBadDescriptor:
-            d->socketState = QAbstractSocket::UnconnectedState;
         default:
+            d->socketState = QAbstractSocket::UnconnectedState;
             break;
         }
 
@@ -592,25 +630,20 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bind(), false);
+
+    if (!d->checkProxy(address))
+        return false;
+
+    Q_CHECK_STATE(QNativeSocketEngine::bind(), QAbstractSocket::UnconnectedState, false);
+
     TInetAddr nativeAddr;
     d->setPortAndAddress(nativeAddr, port, address);
 
     TInt err = d->nativeSocket.Bind(nativeAddr);
 
     if (err) {
-        switch(errno) {
-        case KErrInUse:
-            d->setError(QAbstractSocket::AddressInUseError, d->AddressInuseErrorString);
-            break;
-        case KErrPermissionDenied:
-            d->setError(QAbstractSocket::SocketAccessError, d->AddressProtectedErrorString);
-            break;
-        case KErrNotSupported:
-            d->setError(QAbstractSocket::UnsupportedSocketOperationError, d->OperationUnsupportedErrorString);
-            break;
-        default:
-            break;
-        }
+        d->setError(err);
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
         qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
@@ -625,6 +658,8 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
            address.toString().toLatin1().constData(), port);
 #endif
     d->socketState = QAbstractSocket::BoundState;
+
+    d->fetchConnectionParameters();
     return true;
 }
 
@@ -708,9 +743,7 @@ qint64 QSymbianSocketEngine::pendingDatagramSize() const
     Q_D(const QSymbianSocketEngine);
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
-    return qint64(nbytes-28); //TODO: why -28 (open C version had this)?
-    // Why = Could it be that this is about header lengths etc? if yes
-    // this could be pretty broken, especially for IPv6
+    return qint64(nbytes);
 }
 
 
@@ -853,6 +886,8 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
 
 void QSymbianSocketEngine::close()
 {
+    if (!isValid())
+        return;
     Q_D(QSymbianSocketEngine);
 #if defined (QNATIVESOCKETENGINE_DEBUG)
     qDebug("QSymbianSocketEnginePrivate::nativeClose()");
@@ -864,12 +899,18 @@ void QSymbianSocketEngine::close()
         d->writeNotifier->setEnabled(false);
     if (d->exceptNotifier)
         d->exceptNotifier->setEnabled(false);
-    if(d->asyncSelect) {
+    if (d->asyncSelect) {
         d->asyncSelect->deleteLater();
         d->asyncSelect = 0;
     }
 
     //TODO: call nativeSocket.Shutdown(EImmediate) in some cases?
+    if (d->socketType == QAbstractSocket::UdpSocket) {
+        //TODO: Close hangs without this, but only for UDP - why?
+        TRequestStatus stat;
+        d->nativeSocket.Shutdown(RSocket::EImmediate, stat);
+        User::WaitForRequest(stat);
+    }
     d->nativeSocket.Close();
     QSymbianSocketManager::instance().removeSocket(d->nativeSocket);
     d->socketDescriptor = -1;
@@ -1221,8 +1262,7 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
 //TODO: use QSystemError class when file engine is merged to master
 void QSymbianSocketEnginePrivate::setError(TInt symbianError)
 {
-    hasSetSocketError = true;
-    switch(symbianError) {
+    switch (symbianError) {
     case KErrDisconnected:
     case KErrEof:
         setError(QAbstractSocket::RemoteHostClosedError,
@@ -1240,12 +1280,21 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
         setError(QAbstractSocket::NetworkError,
                  QSymbianSocketEnginePrivate::ProtocolUnsupportedErrorString);
         break;
+    case KErrInUse:
+        setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
+        break;
+    case KErrPermissionDenied:
+        setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+        break;
+    case KErrNotSupported:
+        setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
+        break;
     default:
         socketError = QAbstractSocket::NetworkError;
         socketErrorString = QString::number(symbianError);
         break;
     }
-
+    hasSetSocketError = true;
 }
 
 class QReadNotifier : public QSocketNotifier
@@ -1516,6 +1565,10 @@ void QAsyncSelect::RunL()
         iExcN->event(&e);
     }
     m_inSocketEvent = false;
+    if (m_deleteLater) {
+        delete this;
+        return;
+    }
     // select again (unless disabled by one of the callbacks)
     IssueRequest();
 }
-- 
cgit v0.12


From cb7a89049f1e41edf02aaab56a00cef8c6005eba Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 10 Dec 2010 10:27:32 +0000
Subject: Fixes for socket engine autotest failures

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qcore_symbian_p.cpp                |  2 +-
 src/network/socket/qsymbiansocketengine.cpp           | 10 ++++++++--
 src/network/socket/qsymbiansocketengine_p.h           |  4 ++--
 .../platformsocketengine/platformsocketengine.pro     |  7 +++++--
 .../platformsocketengine/tst_platformsocketengine.cpp | 19 ++++++++++++++++---
 5 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index ede8464..fdae31b 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -283,7 +283,7 @@ int QSymbianSocketManager::lookupSocket(const RSocket& socket) const {
 
 bool QSymbianSocketManager::lookupSocket(int fd, RSocket& socket) const {
     QMutexLocker l(&iMutex);
-    int id = fd + socket_offset;
+    int id = fd - socket_offset;
     if(!reverseSocketMap.contains(id))
         return false;
     socket = reverseSocketMap.value(id);
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 602df5c..b63dbf6 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -641,6 +641,10 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     d->setPortAndAddress(nativeAddr, port, address);
 
     TInt err = d->nativeSocket.Bind(nativeAddr);
+#ifdef __WINS__
+    if (err == KErrArgument) // winsock prt returns wrong error code
+        err = KErrInUse;
+#endif
 
     if (err) {
         d->setError(err);
@@ -781,6 +785,8 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
                                                    const QHostAddress &host, quint16 port)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::writeDatagram(), -1);
+    Q_CHECK_TYPE(QNativeSocketEngine::writeDatagram(), QAbstractSocket::UdpSocket, -1);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TInetAddr addr;
     d->setPortAndAddress(addr, port, host);
@@ -940,9 +946,9 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
     Q_D(QSymbianSocketEngine);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TSockXfrLength sentBytes = 0;
-    TRequestStatus status; //TODO: OMG sync send!
+    TRequestStatus status;
     d->nativeSocket.Send(buffer, 0, status, sentBytes);
-    User::WaitForRequest(status);
+    User::WaitForRequest(status); //TODO: on emulator this blocks for write >16kB (non blocking IO not implemented properly?)
     TInt err = status.Int(); 
 
     if (err) {
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 2d5bcd8..bc85f9c 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -172,8 +172,8 @@ private:
     QReadNotifier* iReadN;
     QWriteNotifier* iWriteN;
     QExceptionNotifier* iExcN;
-    bool m_inSocketEvent; // TODO ?
-    bool m_deleteLater; // TODO ?
+    bool m_inSocketEvent;
+    bool m_deleteLater;
     RSocket &m_socket;
 
     TUint m_selectFlags;
diff --git a/tests/auto/platformsocketengine/platformsocketengine.pro b/tests/auto/platformsocketengine/platformsocketengine.pro
index 04816af..faf745c 100644
--- a/tests/auto/platformsocketengine/platformsocketengine.pro
+++ b/tests/auto/platformsocketengine/platformsocketengine.pro
@@ -9,5 +9,8 @@ MOC_DIR=tmp
 
 QT = core network
 
-symbian: TARGET.CAPABILITY = NetworkServices
-symbian: INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE
\ No newline at end of file
+symbian {
+    TARGET.CAPABILITY = NetworkServices
+    INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE
+    LIBS += -lesock
+}
diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
index bede360..a7b4235 100644
--- a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -65,6 +65,7 @@
 #ifdef Q_OS_SYMBIAN
 #define PLATFORMSOCKETENGINE QSymbianSocketEngine
 #include <private/qsymbiansocketengine_p.h>
+#include <private/qcore_symbian_p.h>
 #else
 #define PLATFORMSOCKETENGINE QNativeSocketEngine
 #include <private/qnativesocketengine_p.h>
@@ -98,12 +99,12 @@ private slots:
     void udpLoopbackPerformance();
     void tcpLoopbackPerformance();
     void readWriteBufferSize();
-    void tooManySockets();
     void bind();
     void networkError();
     void setSocketDescriptor();
     void invalidSend();
     void receiveUrgentData();
+    void tooManySockets();
 };
 
 tst_PlatformSocketEngine::tst_PlatformSocketEngine()
@@ -179,7 +180,9 @@ void tst_PlatformSocketEngine::simpleConnectToIMAP()
     QVERIFY(socketDevice.read(array.data(), array.size()) == available);
 
     // Check that the greeting is what we expect it to be
-    QCOMPARE(array.constData(), QtNetworkSettings::expectedReplyIMAP().constData());
+    //QCOMPARE(array.constData(), QtNetworkSettings::expectedReplyIMAP().constData());
+    QVERIFY(array.startsWith("* OK"));
+    QVERIFY(array.endsWith("server ready\r\n"));
 
     // Write a logout message
     QByteArray array2 = "ZZZ LOGOUT\r\n";
@@ -487,7 +490,7 @@ void tst_PlatformSocketEngine::tcpLoopbackPerformance()
         QVERIFY(client.state() == QAbstractSocket::ConnectedState);
     }
 
-    // The server accepts the connectio
+    // The server accepts the connection
     int socketDescriptor = server.accept();
     QVERIFY(socketDescriptor > 0);
 
@@ -497,7 +500,11 @@ void tst_PlatformSocketEngine::tcpLoopbackPerformance()
     QVERIFY(serverSocket.initialize(socketDescriptor));
     QVERIFY(serverSocket.state() == QAbstractSocket::ConnectedState);
 
+#if defined (Q_OS_SYMBIAN) && defined (__WINS__)
+    const int messageSize = 1024 * 16;
+#else
     const int messageSize = 1024 * 256;
+#endif
     QByteArray message1(messageSize, '@');
     QByteArray answer(messageSize, '@');
 
@@ -610,6 +617,12 @@ void tst_PlatformSocketEngine::networkError()
 #ifdef Q_OS_WIN
     // could use shutdown to produce different errors
     ::closesocket(client.socketDescriptor());
+#elif defined(Q_OS_SYMBIAN)
+    RSocket sock;
+    QVERIFY(QSymbianSocketManager::instance().lookupSocket(client.socketDescriptor(), sock));
+    TRequestStatus stat;
+    sock.Shutdown(RSocket::EImmediate, stat);
+    User::WaitForRequest(stat);
 #else
     ::close(client.socketDescriptor());
 #endif
-- 
cgit v0.12


From 4d86bacafad3b12ca01c20988bf578cde7bf3dae Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 10 Dec 2010 15:18:24 +0000
Subject: Platform socket engine test fixes & update TODOs

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp        | 20 ++++++++++++-----
 .../tst_platformsocketengine.cpp                   | 25 ++++++++++++++++------
 2 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index b63dbf6..90d5265 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -188,6 +188,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     else
         err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
+    //TODO: combine error handling with setError
     if (err != KErrNone) {
         switch (err) {
         case KErrNotSupported:
@@ -375,6 +376,12 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
             close();
             return false;
         }
+
+        // Make sure we receive out-of-band data
+        if (socketType == QAbstractSocket::TcpSocket
+            && !setOption(ReceiveOutOfBandData, 1)) {
+            qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
+        }
     }
 
     d->socketState = socketState;
@@ -566,11 +573,11 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 
     TInetAddr nativeAddr;
     d->setPortAndAddress(nativeAddr, port, addr);
-    //TODO: async connect with active object - from here to end of function is a mess
     TRequestStatus status;
     d->nativeSocket.Connect(nativeAddr, status);
     User::WaitForRequest(status);
     TInt err = status.Int();
+    //TODO: combine with setError(int)
     if (err) {
         switch (err) {
         case KErrWouldBlock:
@@ -674,7 +681,8 @@ bool QSymbianSocketEngine::listen()
     // for a mobile platform
     TInt err = d->nativeSocket.Listen(50);
     if (err) {
-        switch (errno) {
+        //TODO: combine with setError(int)
+        switch (err) {
         case KErrInUse:
             d->setError(QAbstractSocket::AddressInUseError,
                      d->PortInuseErrorString);
@@ -702,7 +710,6 @@ int QSymbianSocketEngine::accept()
 {
     Q_D(QSymbianSocketEngine);
     RSocket blankSocket;
-    //TODO: this is unbelievably broken, needs to be properly async
     blankSocket.Open(d->socketServer);
     TRequestStatus status;
     d->nativeSocket.Accept(blankSocket, status);
@@ -717,10 +724,10 @@ int QSymbianSocketEngine::accept()
 qint64 QSymbianSocketEngine::bytesAvailable() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bytesAvailable(), -1);
+    Q_CHECK_NOT_STATE(QNativeSocketEngine::bytesAvailable(), QAbstractSocket::UnconnectedState, false);
     int nbytes = 0;
     qint64 available = 0;
-    // FIXME is this the right thing also for UDP?
-    // What is expected for UDP, the length for the next packet I guess?
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
     if (err)
         return 0;
@@ -735,6 +742,9 @@ qint64 QSymbianSocketEngine::bytesAvailable() const
 bool QSymbianSocketEngine::hasPendingDatagrams() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::hasPendingDatagrams(), false);
+    Q_CHECK_NOT_STATE(QNativeSocketEngine::hasPendingDatagrams(), QAbstractSocket::UnconnectedState, false);
+    Q_CHECK_TYPE(QNativeSocketEngine::hasPendingDatagrams(), QAbstractSocket::UdpSocket, false);
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return err == KErrNone && nbytes > 0;
diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
index a7b4235..2fb3724 100644
--- a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -213,9 +213,6 @@ void tst_PlatformSocketEngine::simpleConnectToIMAP()
 //---------------------------------------------------------------------------
 void tst_PlatformSocketEngine::udpLoopbackTest()
 {
-#ifdef SYMBIAN_WINSOCK_CONNECTIVITY
-    QSKIP("Not working on Emulator without WinPCAP", SkipAll);
-#endif
     PLATFORMSOCKETENGINE udpSocket;
 
     // Initialize device #1
@@ -264,9 +261,6 @@ void tst_PlatformSocketEngine::udpLoopbackTest()
 //---------------------------------------------------------------------------
 void tst_PlatformSocketEngine::udpIPv6LoopbackTest()
 {
-#if defined(Q_OS_SYMBIAN)
-    QSKIP("Symbian: IPv6 is not yet supported", SkipAll);
-#endif
     PLATFORMSOCKETENGINE udpSocket;
 
     // Initialize device #1
@@ -695,7 +689,18 @@ void tst_PlatformSocketEngine::receiveUrgentData()
 
     // The server sends an urgent message
     msg = 'Q';
+#if defined(Q_OS_SYMBIAN)
+    RSocket sock;
+    QVERIFY(QSymbianSocketManager::instance().lookupSocket(socketDescriptor, sock));
+    TRequestStatus stat;
+    TSockXfrLength len;
+    sock.Send(TPtrC8((TUint8*)&msg,1), KSockWriteUrgent, stat, len);
+    User::WaitForRequest(stat);
+    QVERIFY(stat == KErrNone);
+    QCOMPARE(len(), 1);
+#else
     QCOMPARE(int(::send(socketDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
+#endif
 
     // The client receives the urgent message
     QVERIFY(client.waitForRead());
@@ -708,7 +713,15 @@ void tst_PlatformSocketEngine::receiveUrgentData()
     // The client sends an urgent message
     msg = 'T';
     int clientDescriptor = client.socketDescriptor();
+#if defined(Q_OS_SYMBIAN)
+    QVERIFY(QSymbianSocketManager::instance().lookupSocket(clientDescriptor, sock));
+    sock.Send(TPtrC8((TUint8*)&msg,1), KSockWriteUrgent, stat, len);
+    User::WaitForRequest(stat);
+    QVERIFY(stat == KErrNone);
+    QCOMPARE(len(), 1);
+#else
     QCOMPARE(int(::send(clientDescriptor, &msg, sizeof(msg), MSG_OOB)), 1);
+#endif
 
     // The server receives the urgent message
     QVERIFY(serverSocket.waitForRead());
-- 
cgit v0.12


From 6beb46f6e2971188c13d8b2922eaa3801a890b71 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 4 Jan 2011 13:47:12 +0000
Subject: Fix compile error

---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 90d5265..a1ff9b9 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -378,7 +378,7 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
         }
 
         // Make sure we receive out-of-band data
-        if (socketType == QAbstractSocket::TcpSocket
+        if (d->socketType == QAbstractSocket::TcpSocket
             && !setOption(ReceiveOutOfBandData, 1)) {
             qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
         }
-- 
cgit v0.12


From 29929a3c6368f62cdb58bd7255aa6f93e8d9f2f6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 12 Jan 2011 13:58:50 +0000
Subject: Fix non blocking connect on symbian devices

The socket server returns KErrAlreadyExists rather than KErrNone when
connect is called as second time after the select ioctl completes.

Reviewed-by: Markus Goetz
Reviewed-by: Aaron Tunney
---
 src/network/socket/qsymbiansocketengine.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index a1ff9b9..2f991de 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -578,7 +578,10 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     User::WaitForRequest(status);
     TInt err = status.Int();
     //TODO: combine with setError(int)
-    if (err) {
+    //For non blocking connect, KErrAlreadyExists is returned from the second Connect() to indicate
+    //the connection is up. So treat this the same as KErrNone which would be returned from the first
+    //call if it wouldn't block. (e.g. winsock wrapper in the emulator ignores the nonblocking flag)
+    if (err && err != KErrAlreadyExists) {
         switch (err) {
         case KErrWouldBlock:
             d->socketState = QAbstractSocket::ConnectingState;
-- 
cgit v0.12


From 1b3b85eca8ccb1cc793586105340980cc238eae3 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 6 Jan 2011 15:16:03 +0000
Subject: Fix KERN-EXEC 0 panic on exit when bearer is searching for WLANs

The access point scanner cancels itself in the destructor.
This requires the handle to be valid, but it was closed in the symbian
engine destructor immediately before deleting the AP scanner.
Because of the way symbian active objects work, the crashing function
is only called if there was an asynchronous request in progress.
So it could be missed in cases where the scan completes faster than the
test case.

Task-number: QTBUG-16484
Reviewed-by: Markus Goetz
---
 src/plugins/bearer/symbian/symbianengine.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
index f025d86..a370d78 100644
--- a/src/plugins/bearer/symbian/symbianengine.cpp
+++ b/src/plugins/bearer/symbian/symbianengine.cpp
@@ -144,6 +144,10 @@ SymbianEngine::~SymbianEngine()
 {
     Cancel();
 
+    //The scanner may be using the connection monitor so it needs to be
+    //deleted first while the handle is still valid.
+    delete ipAccessPointsAvailabilityScanner;
+
     iConnectionMonitor.CancelNotifications();
     iConnectionMonitor.Close();
     
@@ -151,8 +155,6 @@ SymbianEngine::~SymbianEngine()
     iCmManager.Close();
 #endif
     
-    delete ipAccessPointsAvailabilityScanner;
-
     // CCommsDatabase destructor uses cleanup stack. Since QNetworkConfigurationManager
     // is a global static, but the time we are here, E32Main() has been exited already and
     // the thread's default cleanup stack has been deleted. Without this line, a
-- 
cgit v0.12


From 47604a6de645eaabb3a673bcbedafc6d0da00137 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 17 Jan 2011 13:35:58 +0000
Subject: Add QScopedValueRollback tools class.

This template allows a value to be automatically rolled back to a previous
state when the class goes out of scope. This can be used to maintain a
valid state when an exception is thrown.

Reviewed-by: mread
Reviewed-by: joao
---
 src/corelib/tools/qscopedvaluerollback.cpp | 84 ++++++++++++++++++++++++++++++
 src/corelib/tools/qscopedvaluerollback.h   | 81 ++++++++++++++++++++++++++++
 src/corelib/tools/tools.pri                |  7 +--
 3 files changed, 169 insertions(+), 3 deletions(-)
 create mode 100644 src/corelib/tools/qscopedvaluerollback.cpp
 create mode 100644 src/corelib/tools/qscopedvaluerollback.h

diff --git a/src/corelib/tools/qscopedvaluerollback.cpp b/src/corelib/tools/qscopedvaluerollback.cpp
new file mode 100644
index 0000000..8933efc
--- /dev/null
+++ b/src/corelib/tools/qscopedvaluerollback.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qscopedvaluerollback.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \class QScopedValueRollback
+    \brief The QScopedValueRollback resets a variable to its previous value on destruction
+    \since 4.8
+    \ingroup misc
+
+    The QScopedAssignment class can be used to revert state when an
+    exception is thrown without needing to write try-catch blocks.
+
+    It can also be used to manage variables that are temporarily set,
+    such as reentrancy guards. By using this class, the variable will
+    be reset whether the function is exited normally, exited early by
+    a return statement, or exited by an exception.
+
+    The template can only be instantiated with a type that supports assignment.
+
+    \sa QScopedPointer
+*/
+
+/*!
+    \fn QScopedValueRollback::QScopedValueRollback(T &var)
+
+    Stores the previous value of var internally, for revert on destruction.
+*/
+
+/*!
+    \fn QScopedValueRollback::~QScopedValueRollback()
+
+    Assigns the previous value to the managed variable.
+    This is the value at construction time, or at the last call to commit()
+*/
+
+/*!
+    \fn void QScopedValueRollback::commit()
+
+    Updates the previous value of the managed variable to its current value.
+*/
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h
new file mode 100644
index 0000000..d344ed8
--- /dev/null
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCOPEDVALUEROLLBACK_H
+#define QSCOPEDVALUEROLLBACK_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+QT_MODULE(Core)
+
+template <typename T>
+class QScopedValueRollback
+{
+public:
+    QScopedValueRollback(T &var) :
+        varRef(var)
+    {
+        oldValue = varRef;
+    }
+
+    ~QScopedValueRollback()
+    {
+        varRef = oldValue;
+    }
+
+    void commit()
+    {
+        oldValue = varRef;
+    }
+
+private:
+    T& varRef;
+    T oldValue;
+
+    Q_DISABLE_COPY(QScopedValueRollback);
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QSCOPEDVALUEROLLBACK_H
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 03bb32d..9d564a1 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -29,6 +29,9 @@ HEADERS +=  \
         tools/qrect.h \
         tools/qregexp.h \
         tools/qringbuffer_p.h \
+        tools/qscopedpointer.h \
+        tools/qscopedpointer_p.h \
+        tools/qscopedvaluerollback.h \
         tools/qshareddata.h \
         tools/qsharedpointer.h \
         tools/qsharedpointer_impl.h \
@@ -45,9 +48,7 @@ HEADERS +=  \
         tools/qelapsedtimer.h \
         tools/qunicodetables_p.h \
         tools/qvarlengtharray.h \
-        tools/qvector.h \
-        tools/qscopedpointer.h \
-        tools/qscopedpointer_p.h
+        tools/qvector.h
 
 
 SOURCES += \
-- 
cgit v0.12


From b1477e557681372d2c7119d637048123f0bad120 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 17 Jan 2011 15:07:46 +0000
Subject: Add autotest for QScopedValueRollback

Reviewed-by: mread
---
 .../qscopedvaluerollback/qscopedvaluerollback.pro  |   4 +
 .../tst_qscopedvaluerollback.cpp                   | 203 +++++++++++++++++++++
 2 files changed, 207 insertions(+)
 create mode 100644 tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro
 create mode 100644 tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp

diff --git a/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro b/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro
new file mode 100644
index 0000000..f06e21b
--- /dev/null
+++ b/tests/auto/qscopedvaluerollback/qscopedvaluerollback.pro
@@ -0,0 +1,4 @@
+load(qttest_p4)
+SOURCES += tst_qscopedvaluerollback.cpp
+QT -= gui
+CONFIG += parallel_test
diff --git a/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
new file mode 100644
index 0000000..fac5702
--- /dev/null
+++ b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtCore/QScopedValueRollback>
+
+/*!
+ \class tst_QScopedValueRollback
+ \internal
+ \since 4.8
+ \brief Tests class QScopedValueRollback.
+
+ */
+class tst_QScopedValueRollback : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void leavingScope();
+    void leavingScopeAfterCommit();
+    void rollbackToPreviousCommit();
+    void exceptions();
+    void earlyExitScope();
+private:
+    void earlyExitScope_helper(int exitpoint, int &member);
+};
+
+void tst_QScopedValueRollback::leavingScope()
+{
+    int i = 0;
+    bool b = false;
+    QString s("This is useful");
+
+    //test rollback on going out of scope
+    {
+        QScopedValueRollback<int> ri(i);
+        QScopedValueRollback<bool> rb(b);
+        QScopedValueRollback<QString> rs(s);
+        QCOMPARE(b, false);
+        QCOMPARE(i, 0);
+        QCOMPARE(s, QString("This is useful"));
+        b = true;
+        i = 1;
+        s = "Useless";
+        QCOMPARE(b, true);
+        QCOMPARE(i, 1);
+        QCOMPARE(s, QString("Useless"));
+    }
+    QCOMPARE(b, false);
+    QCOMPARE(i, 0);
+    QCOMPARE(s, QString("This is useful"));
+}
+
+void tst_QScopedValueRollback::leavingScopeAfterCommit()
+{
+    int i = 0;
+    bool b = false;
+    QString s("This is useful");
+
+    //test rollback on going out of scope
+    {
+        QScopedValueRollback<int> ri(i);
+        QScopedValueRollback<bool> rb(b);
+        QScopedValueRollback<QString> rs(s);
+        QCOMPARE(b, false);
+        QCOMPARE(i, 0);
+        QCOMPARE(s, QString("This is useful"));
+        b = true;
+        i = 1;
+        s = "Useless";
+        QCOMPARE(b, true);
+        QCOMPARE(i, 1);
+        QCOMPARE(s, QString("Useless"));
+        ri.commit();
+        rb.commit();
+        rs.commit();
+    }
+    QCOMPARE(b, true);
+    QCOMPARE(i, 1);
+    QCOMPARE(s, QString("Useless"));
+}
+
+void tst_QScopedValueRollback::rollbackToPreviousCommit()
+{
+    int i=0;
+    {
+        QScopedValueRollback<int> ri(i);
+        i++;
+        ri.commit();
+        i++;
+    }
+    QCOMPARE(i,1);
+    {
+        QScopedValueRollback<int> ri1(i);
+        i++;
+        ri1.commit();
+        i++;
+        ri1.commit();
+        i++;
+    }
+    QCOMPARE(i,3);
+}
+
+void tst_QScopedValueRollback::exceptions()
+{
+    bool b = false;
+    bool caught = false;
+    QT_TRY
+    {
+        QScopedValueRollback<bool> rb(b);
+        b = true;
+        QT_THROW(std::bad_alloc()); //if Qt compiled without exceptions this is noop
+        rb.commit(); //if Qt compiled without exceptions, true is committed
+    }
+    QT_CATCH(...)
+    {
+        caught = true;
+    }
+    QCOMPARE(b, !caught); //expect false if exception was thrown, true otherwise
+}
+
+void tst_QScopedValueRollback::earlyExitScope()
+{
+    int i=0;
+    int j=0;
+    while (true) {
+        QScopedValueRollback<int> ri(i);
+        i++;
+        j=i;
+        if (i>8) break;
+        ri.commit();
+    }
+    QCOMPARE(i,8);
+    QCOMPARE(j,9);
+
+    for (i = 0; i < 5; i++) {
+        j=1;
+        earlyExitScope_helper(i,j);
+        QCOMPARE(j, 1<<i);
+    }
+}
+
+void tst_QScopedValueRollback::earlyExitScope_helper(int exitpoint, int& member)
+{
+    QScopedValueRollback<int> r(member);
+    member *= 2;
+    if (exitpoint == 0)
+        return;
+    r.commit();
+    member *= 2;
+    if (exitpoint == 1)
+        return;
+    r.commit();
+    member *= 2;
+    if (exitpoint == 2)
+        return;
+    r.commit();
+    member *= 2;
+    if (exitpoint == 3)
+        return;
+    r.commit();
+}
+
+QTEST_MAIN(tst_QScopedValueRollback)
+#include "tst_QScopedValueRollback.moc"
-- 
cgit v0.12


From 4fb5c42ede2b33c3092d70aa3e32cf6c677bd4d8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 17 Jan 2011 15:13:52 +0000
Subject: Fix uncaught exception crash when socket ready read signal throws

When the application (in this case, an autotest) ran out of memory by
calling readAll() in a slot, the exception propagated to the symbian
active scheduler where it caused an assertion failure.
Additionally, QAbstractSocket was left in a bad state because its
member variables that guard against re-entrancy were left set.

1. Catch exceptions and convert to leaves in QAsyncSelect
2. Implement RunError function to set the socket engine error state
3. Use QScopedValueRollback in QAbstractSocket to ensure the reentrancy
   guards are reverted if an exception is thrown.

Reviewed-by: Markus Goetz
Reviewed-by: mread
---
 src/network/socket/qabstractsocket.cpp      | 10 ++++----
 src/network/socket/qsymbiansocketengine.cpp | 37 +++++++++++++++++++++++++----
 src/network/socket/qsymbiansocketengine_p.h |  3 +++
 3 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index c638e2a..156b905 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -375,6 +375,7 @@
 #include <qpointer.h>
 #include <qtimer.h>
 #include <qelapsedtimer.h>
+#include <qscopedvaluerollback.h>
 
 #ifndef QT_NO_OPENSSL
 #include <QtNetwork/qsslsocket.h>
@@ -592,6 +593,7 @@ bool QAbstractSocketPrivate::canReadNotification()
             socketEngine->setReadNotificationEnabled(false);
         }
     }
+    QScopedValueRollback<bool> rsncrollback(readSocketNotifierCalled);
     readSocketNotifierCalled = true;
 
     if (!isBuffered)
@@ -605,7 +607,6 @@ bool QAbstractSocketPrivate::canReadNotification()
 #if defined (QABSTRACTSOCKET_DEBUG)
             qDebug("QAbstractSocketPrivate::canReadNotification() buffer is full");
 #endif
-            readSocketNotifierCalled = false;
             return false;
         }
 
@@ -617,7 +618,6 @@ bool QAbstractSocketPrivate::canReadNotification()
             qDebug("QAbstractSocketPrivate::canReadNotification() disconnecting socket");
 #endif
             q->disconnectFromHost();
-            readSocketNotifierCalled = false;
             return false;
         }
         newBytes = readBuffer.size() - newBytes;
@@ -637,9 +637,9 @@ bool QAbstractSocketPrivate::canReadNotification()
         ;
 
     if (!emittedReadyRead && hasData) {
+        QScopedValueRollback<bool> r(emittedReadyRead);
         emittedReadyRead = true;
         emit q->readyRead();
-        emittedReadyRead = false;
     }
 
     // If we were closed as a result of the readyRead() signal,
@@ -648,7 +648,6 @@ bool QAbstractSocketPrivate::canReadNotification()
 #if defined (QABSTRACTSOCKET_DEBUG)
         qDebug("QAbstractSocketPrivate::canReadNotification() socket is closing - returning");
 #endif
-        readSocketNotifierCalled = false;
         return true;
     }
 
@@ -662,7 +661,6 @@ bool QAbstractSocketPrivate::canReadNotification()
         socketEngine->setReadNotificationEnabled(readSocketNotifierState);
         readSocketNotifierStateSet = false;
     }
-    readSocketNotifierCalled = false;
     return true;
 }
 
@@ -768,9 +766,9 @@ bool QAbstractSocketPrivate::flush()
     if (written > 0) {
         // Don't emit bytesWritten() recursively.
         if (!emittedBytesWritten) {
+            QScopedValueRollback<bool> r(emittedBytesWritten);
             emittedBytesWritten = true;
             emit q->bytesWritten(written);
-            emittedBytesWritten = false;
         }
     }
 
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 2f991de..455bf5e 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1308,6 +1308,9 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
     case KErrNotSupported:
         setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
         break;
+    case KErrNoMemory:
+        setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
+        break;
     default:
         socketError = QAbstractSocket::NetworkError;
         socketErrorString = QString::number(symbianError);
@@ -1564,22 +1567,47 @@ void QAsyncSelect::DoCancel()
 
 void QAsyncSelect::RunL()
 {
+    QT_TRYCATCH_LEAVING(run());
+}
+
+//RunError is called by the active scheduler if RunL leaves.
+//Typically this will happen if a std::bad_alloc propagates down from the application
+TInt QAsyncSelect::RunError(TInt aError)
+{
+    if (engine) {
+        QT_TRY {
+            engine->d_func()->setError(aError);
+            QEvent e(QEvent::SockAct);
+            if (iExcN)
+                iExcN->event(&e);
+            if (iReadN)
+                iReadN->event(&e);
+        }
+        QT_CATCH(...) {}
+    }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QAsyncSelect::RunError" << aError;
+#endif
+    return KErrNone;
+}
+
+void QAsyncSelect::run()
+{
     //TODO: block when event loop demands it
     //if (maybeQueueForLater())
     //    return;
-
     m_inSocketEvent = true;
     m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
     //TODO: KSockSelectReadContinuation does what?
-    if (m_selectBuf() & KSockSelectRead) {
+    if (iReadN && (m_selectBuf() & KSockSelectRead)) {
         QEvent e(QEvent::SockAct);
         iReadN->event(&e);
     }
-    if (m_selectBuf() & KSockSelectWrite) {
+    if (iWriteN && (m_selectBuf() & KSockSelectWrite)) {
         QEvent e(QEvent::SockAct);
         iWriteN->event(&e);
     }
-    if ((m_selectBuf() & KSockSelectExcept) || iStatus != KErrNone) {
+    if (iExcN && ((m_selectBuf() & KSockSelectExcept) || iStatus != KErrNone)) {
         QEvent e(QEvent::SockAct);
         iExcN->event(&e);
     }
@@ -1598,6 +1626,7 @@ void QAsyncSelect::deleteLater()
         iExcN = 0;
         iReadN = 0;
         iWriteN = 0;
+        engine = 0;
         m_deleteLater = true;
     } else {
         delete this;
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index bc85f9c..f36b7dd 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -72,6 +72,7 @@ class QNetworkInterface;
 class Q_AUTOTEST_EXPORT QSymbianSocketEngine : public QAbstractSocketEngine
 {
     Q_OBJECT
+    friend class QAsyncSelect;
 public:
     QSymbianSocketEngine(QObject *parent = 0);
     ~QSymbianSocketEngine();
@@ -167,6 +168,8 @@ public:
 protected:
     void DoCancel();
     void RunL();
+    void run();
+    TInt RunError(TInt aError);
 
 private:
     QReadNotifier* iReadN;
-- 
cgit v0.12


From 066ba528045435519917d37c781d04cea4ca4cfc Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 17 Jan 2011 19:18:39 +0000
Subject: Test case fixes for QNetworkReply

1. Increase maximum heap, as FTP large file test was running out
2. Add an additional QVERIFY so that a test fails instead of suffering
   an assertion failure in case no data is received.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/test/test.pro         | 2 +-
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qnetworkreply/test/test.pro b/tests/auto/qnetworkreply/test/test.pro
index 7efc2fb..12fdf04 100644
--- a/tests/auto/qnetworkreply/test/test.pro
+++ b/tests/auto/qnetworkreply/test/test.pro
@@ -33,6 +33,6 @@ symbian:{
     # Symbian toolchain does not support correct include semantics
     INCLUDEPATH+=..\\..\\..\\..\\include\\QtNetwork\\private
     # bigfile test case requires more heap
-    TARGET.EPOCHEAPSIZE="0x100 0x1000000"
+    TARGET.EPOCHEAPSIZE="0x100 0x10000000"
     TARGET.CAPABILITY="ALL -TCB"
 }
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index c796272..b1fddfa 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -5128,6 +5128,7 @@ public:
 
     void finishedSlot() {
         // We should have already received all readyRead
+        QVERIFY(!bytesAvailableList.isEmpty());
         QVERIFY(bytesAvailableList.last() == uploadSize);
     }
 };
-- 
cgit v0.12


From 4d4bc3f3729a057e428208b4037dddb49b14b1ed Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 18 Jan 2011 14:04:05 +0000
Subject: Fix some issues with socket handle allocation

QAbstractSocket requires a handle of -1 to be returned when accept fails.
This is a common case, as it calls accept() in a loop to get all incoming
connections. Also the blank socket wasn't being closed properly on failure
so that is also fixed.

Fixed a possible race condition in QSymbianSocketEngine::close - the
socket descriptor is now deregistered before closing the symbian socket
to avoid another thread getting the symbian handle reused in open and
asserting when trying to register it.

This patch also adds debug around socket handle allocation when socket
engine debug is enabled.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 35 +++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 455bf5e..cf5f33e 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -208,8 +208,13 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 
         return false;
     }
-
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEnginePrivate::createNewSocket - created" << nativeSocket.SubSessionHandle();
+#endif
     socketDescriptor = QSymbianSocketManager::instance().addSocket(nativeSocket);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << " - allocated socket descriptor" << socketDescriptor;
+#endif
     return true;
 }
 
@@ -343,10 +348,15 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
         close();
 
     if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, d->nativeSocket)) {
+        qWarning("QSymbianSocketEngine::initialize - socket descriptor not found");
         d->setError(QAbstractSocket::SocketResourceError,
             QSymbianSocketEnginePrivate::InvalidSocketErrorString);
         return false;
     }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::initialize - attached to" << d->nativeSocket.SubSessionHandle() << socketDescriptor;
+#endif
+    Q_ASSERT(d->socketDescriptor == socketDescriptor || d->socketDescriptor == -1);
     d->socketDescriptor = socketDescriptor;
 
     // determine socket type and protocol
@@ -712,16 +722,28 @@ bool QSymbianSocketEngine::listen()
 int QSymbianSocketEngine::accept()
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::accept(), -1);
+    Q_CHECK_STATE(QSymbianSocketEngine::accept(), QAbstractSocket::ListeningState, false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::accept(), QAbstractSocket::TcpSocket, false);
     RSocket blankSocket;
     blankSocket.Open(d->socketServer);
     TRequestStatus status;
     d->nativeSocket.Accept(blankSocket, status);
     User::WaitForRequest(status);
     if (status.Int()) {
+        blankSocket.Close();
         qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
-        return 0;
+        return -1;
     }
-    return QSymbianSocketManager::instance().addSocket(blankSocket);
+
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEnginePrivate::accept - created" << blankSocket.SubSessionHandle();
+#endif
+    int fd = QSymbianSocketManager::instance().addSocket(blankSocket);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << " - allocated socket descriptor" << fd;
+#endif
+    return fd;
 }
 
 qint64 QSymbianSocketEngine::bytesAvailable() const
@@ -930,8 +952,13 @@ void QSymbianSocketEngine::close()
         d->nativeSocket.Shutdown(RSocket::EImmediate, stat);
         User::WaitForRequest(stat);
     }
-    d->nativeSocket.Close();
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::close - closing socket" << d->nativeSocket.SubSessionHandle() << d->socketDescriptor;
+#endif
+    //remove must come before close to avoid a race where another thread gets the old subsession handle
+    //reused & asserts when calling QSymbianSocketManager::instance->addSocket
     QSymbianSocketManager::instance().removeSocket(d->nativeSocket);
+    d->nativeSocket.Close();
     d->socketDescriptor = -1;
 
     d->socketState = QAbstractSocket::UnconnectedState;
-- 
cgit v0.12


From 9832c60375a9689e42cd899d1de5afd0b776ae48 Mon Sep 17 00:00:00 2001
From: Aaron Tunney <ext-aaron.2.tunney@nokia.com>
Date: Wed, 19 Jan 2011 16:36:46 +0000
Subject: Initial draft of QHostInfo::localHostName(), plus fix for address
 buffer for IPv6 addresses.

Reviewed-by: Shane Kearns
---
 src/network/kernel/qhostinfo_symbian.cpp | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index fbd7fe9..7fc40bc 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -143,7 +143,9 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     QList<QHostAddress> hostAddresses;
 
     TInetAddr hostAdd = nameResult().iAddr;
-    TBuf<16> ipAddr;
+    // 39 is the maximum length of an IPv6 address.
+    TBuf<39> ipAddr;
+
     // Fill ipAddr with the IP address from hostAdd
     hostAdd.Output(ipAddr);
     if (ipAddr.Length() > 0)
@@ -173,8 +175,24 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
 
 QString QHostInfo::localHostName()
 {
-    // TODO - fill with code.
-    return QString();
+    // Connect to ESOCK
+    RSocketServ socketServ(qt_symbianGetSocketServer());
+    RHostResolver hostResolver;
+
+    // Will return both IPv4 and IPv6
+    // TODO: Pass RHostResolver.Open() the global RConnection
+    int err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
+    if (err)
+        return QString();
+
+    THostName hostName;
+    err = hostResolver.GetHostName(hostName);
+    if (err)
+        return QString();
+
+    hostResolver.Close();
+
+    return qt_TDesC2QString(hostName);
 }
 
 QString QHostInfo::localDomainName()
-- 
cgit v0.12


From 6886c21e0743fdfb1e5d053e0e193aeeed5fe8b2 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 21 Jan 2011 14:49:01 +0000
Subject: Fix error connecting to IPv6 addresses

Incorrect usage of KAfInet6 in the symbian socket engine.
KAfInet is used for both IPv4 and IPv6 as a protocol family.
KAfInet6 is used as the address family for IPv6 addresses.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index cf5f33e..9ed8a42 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -179,7 +179,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
                                          QAbstractSocket::NetworkLayerProtocol socketProtocol)
 {
     Q_Q(QSymbianSocketEngine);
-    TUint family = (socketProtocol == QAbstractSocket::IPv6Protocol) ? KAfInet6 : KAfInet;
+    TUint family = KAfInet; // KAfInet6 is only used as an address family, not as a protocol family
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
     TInt err;
-- 
cgit v0.12


From a2ba4ccd2c2d3daf2a4d719295c59395f03aba0b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 21 Jan 2011 14:51:45 +0000
Subject: Fix crashes in httpProxyCommandsSynchronous test case

Due to a race condition, the test could fail before its QThread had even
started, resulting in a crash during thread startup. This is addressed
using a semaphore to synchronise startup & ensure the sub thread is running
before continuing the test.
Additionally, if the test failed the QThread would be destroyed while
still running, which according to the documentation will cause crashes.
This is addressed using QScopedPointer to clean up when the test exits
early due to failure.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 47 +++++++++++++++++++++-----
 1 file changed, 38 insertions(+), 9 deletions(-)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index b1fddfa..390d5bf 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -47,6 +47,7 @@
 #include <QtCore/QEventLoop>
 #include <QtCore/QFile>
 #include <QtCore/QSharedPointer>
+#include <QtCore/QScopedPointer>
 #include <QtCore/QTemporaryFile>
 #include <QtNetwork/QTcpServer>
 #include <QtNetwork/QTcpSocket>
@@ -410,16 +411,23 @@ public:
     QTcpSocket *client; // always the last one that was received
     QByteArray dataToTransmit;
     QByteArray receivedData;
+    QSemaphore ready;
     bool doClose;
     bool doSsl;
     bool multiple;
     int totalConnections;
 
-    MiniHttpServer(const QByteArray &data, bool ssl = false)
+    MiniHttpServer(const QByteArray &data, bool ssl = false, QThread *thread = 0)
         : client(0), dataToTransmit(data), doClose(true), doSsl(ssl),
           multiple(false), totalConnections(0)
     {
         listen();
+        if (thread) {
+            connect(thread, SIGNAL(started()), this, SLOT(threadStartedSlot()));
+            moveToThread(thread);
+            thread->start();
+            ready.acquire();
+        }
     }
 
 protected:
@@ -492,6 +500,11 @@ public slots:
             }
         }
     }
+
+    void threadStartedSlot()
+    {
+        ready.release();
+    }
 };
 
 class MyCookieJar: public QNetworkCookieJar
@@ -4478,6 +4491,26 @@ void tst_QNetworkReply::httpProxyCommandsSynchronous_data()
     httpProxyCommands_data();
 }
 
+struct QThreadCleanup
+{
+    static inline void cleanup(QThread *thread)
+    {
+        thread->quit();
+        if (thread->wait(3000))
+            delete thread;
+        else
+            qWarning("thread hung, leaking memory so test can finish");
+    }
+};
+
+struct QDeleteLaterCleanup
+{
+    static inline void cleanup(QObject *o)
+    {
+        o->deleteLater();
+    }
+};
+
 void tst_QNetworkReply::httpProxyCommandsSynchronous()
 {
     QFETCH(QUrl, url);
@@ -4487,11 +4520,9 @@ void tst_QNetworkReply::httpProxyCommandsSynchronous()
     // when using synchronous commands, we need a different event loop for
     // the server thread, because the client is never returning to the
     // event loop
-    MiniHttpServer proxyServer(responseToSend);
-    QThread serverThread;
-    proxyServer.moveToThread(&serverThread);
-    serverThread.start();
-    QNetworkProxy proxy(QNetworkProxy::HttpProxy, "127.0.0.1", proxyServer.serverPort());
+    QScopedPointer<QThread, QThreadCleanup> serverThread(new QThread);
+    QScopedPointer<MiniHttpServer, QDeleteLaterCleanup> proxyServer(new MiniHttpServer(responseToSend, false, serverThread.data()));
+    QNetworkProxy proxy(QNetworkProxy::HttpProxy, "127.0.0.1", proxyServer->serverPort());
 
     manager.setProxy(proxy);
     QNetworkRequest request(url);
@@ -4504,8 +4535,6 @@ void tst_QNetworkReply::httpProxyCommandsSynchronous()
     QNetworkReplyPtr reply = manager.get(request);
     QVERIFY(reply->isFinished()); // synchronous
     manager.setProxy(QNetworkProxy());
-    serverThread.quit();
-    serverThread.wait(3000);
 
     //qDebug() << reply->error() << reply->errorString();
 
@@ -4513,7 +4542,7 @@ void tst_QNetworkReply::httpProxyCommandsSynchronous()
     // especially since it won't succeed in the HTTPS case
     // so just check that the command was correct
 
-    QString receivedHeader = proxyServer.receivedData.left(expectedCommand.length());
+    QString receivedHeader = proxyServer->receivedData.left(expectedCommand.length());
     QCOMPARE(receivedHeader, expectedCommand);
 }
 
-- 
cgit v0.12


From 47ac9016fc778f10f4d5ab1abb056b0d0cc2963a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 21 Jan 2011 14:56:27 +0000
Subject: Use the global message pool to avoid KErrServerBusy errors

Symbian IPC has two modes, either a preallocated message pool for the
process (up to 255 allowed), or the global message pool.
The default for the socket server is 8 preallocated slots, which is not
enough to run the qnetworkreply autotest. However preallocating a large
number of slots would be wasteful for an application that only uses one
or two sockets at a time.
Since we can't predict the usage, the global pool seems the best option.

Reviewed-by: Iain
---
 src/corelib/kernel/qcore_symbian_p.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp
index fdae31b..45e07ad 100644
--- a/src/corelib/kernel/qcore_symbian_p.cpp
+++ b/src/corelib/kernel/qcore_symbian_p.cpp
@@ -223,7 +223,9 @@ QSymbianSocketManager::QSymbianSocketManager() :
     // ### In future this could be changed to KAfInet6 when that is more common than IPv4
     preferences.iAddrFamily = KAfInet;
     preferences.iProtocol = KProtocolInetIp;
-    qt_symbian_throwIfError(iSocketServ.Connect(preferences));
+    //use global message pool, as we do not know how many sockets app will use
+    //TODO: is this the right choice?
+    qt_symbian_throwIfError(iSocketServ.Connect(preferences, -1));
     qt_symbian_throwIfError(iSocketServ.ShareAuto());
 }
 
-- 
cgit v0.12


From b10fe4c9efa0767c9591fa19c86ff7e5c3f88860 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 21 Jan 2011 15:08:15 +0000
Subject: Fix IPv6 server connections

Symbian treats listening on "0.0.0.0" to mean "accept any IPv4"
and listening on "::" to mean "accept any IPv6".
To accept any connection, you must listen with an unspecified address

As the Qt documentation explicitly says QHostAddress::Any means to
accept any connection, this is converted to an unspecified address
(KAfUnspec) by the symbian socket engine.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 9ed8a42..cc55f2a 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -221,7 +221,12 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
     nativeAddr.SetPort(port);
-    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+    if (addr == QHostAddress::Any) {
+        //Should allow both IPv4 and IPv6
+        //Listening on "0.0.0.0" accepts ONLY ipv4 connections
+        //Listening on "::" accepts ONLY ipv6 connections
+        nativeAddr.SetFamily(KAFUnspec);
+    } else if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
         TPckgBuf<TSoInetIfQuery> query;
         query().iName = qt_QString2TPtrC(addr.scopeId());
         TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
-- 
cgit v0.12


From b81b429cb43e19b2211990d0aab80e78e08d87f7 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 21 Jan 2011 15:46:01 +0000
Subject: Implement moveToThread in the symbian socket engine

The active object used for socket notifications (QAsyncSelect) is
thread specific, so it needs to be deleted and recreated in the new thread.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 44 +++++++++++++++++++++++++++--
 src/network/socket/qsymbiansocketengine_p.h |  4 +++
 2 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index cc55f2a..487f45c 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -59,6 +59,8 @@
 # include "qtcpserver.h"
 #endif
 
+#include <QCoreApplication>
+
 #include <qabstracteventdispatcher.h>
 #include <qsocketnotifier.h>
 #include <qnetworkinterface.h>
@@ -1576,6 +1578,41 @@ qint64 QSymbianSocketEngine::bytesToWrite() const
     return 0;
 }
 
+//TODO: is defining PostThreadChangeEvent as QEvent::User + 1 safe?
+//TODO: would QMetaObject::invokeMethod(obj, "postThreadChangeSlot", Qt::QueuedConnection) be better?
+//TODO: if QTBUG-16787 is implemented, use that instead
+bool QSymbianSocketEngine::event(QEvent* ev)
+{
+    Q_D(QSymbianSocketEngine);
+    switch (ev->type()) {
+    case QEvent::ThreadChange:
+        if (d->asyncSelect) {
+            delete d->asyncSelect;
+            d->asyncSelect = 0;
+            QEvent *postThreadChangeEvent = new QEvent(PostThreadChangeEvent);
+            QCoreApplication::postEvent(this, postThreadChangeEvent);
+        }
+        return true;
+    case PostThreadChangeEvent:
+        // recreate select in new thread
+        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        if (d->readNotifier) {
+            d->asyncSelect->setReadNotifier(static_cast<QReadNotifier*>(d->readNotifier));
+            setReadNotificationEnabled(d->readNotifier->isEnabled());
+        }
+        if (d->writeNotifier) {
+            d->asyncSelect->setWriteNotifier(static_cast<QWriteNotifier*>(d->writeNotifier));
+            setReadNotificationEnabled(d->writeNotifier->isEnabled());
+        }
+        if (d->exceptNotifier) {
+            d->asyncSelect->setExceptionNotifier(static_cast<QExceptionNotifier*>(d->exceptNotifier));
+            setReadNotificationEnabled(d->exceptNotifier->isEnabled());
+        }
+        return true;
+    }
+    return QAbstractSocketEngine::event(ev);
+}
+
 QAsyncSelect::QAsyncSelect(QAbstractEventDispatcher *dispatcher, RSocket& sock, QSymbianSocketEngine *parent)
     : CActive(CActive::EPriorityStandard),
       m_inSocketEvent(false),
@@ -1631,11 +1668,11 @@ void QAsyncSelect::run()
     m_inSocketEvent = true;
     m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
     //TODO: KSockSelectReadContinuation does what?
-    if (iReadN && (m_selectBuf() & KSockSelectRead)) {
+    if (iReadN && ((m_selectBuf() & KSockSelectRead) || iStatus != KErrNone)) {
         QEvent e(QEvent::SockAct);
         iReadN->event(&e);
     }
-    if (iWriteN && (m_selectBuf() & KSockSelectWrite)) {
+    if (iWriteN && ((m_selectBuf() & KSockSelectWrite) || iStatus != KErrNone)) {
         QEvent e(QEvent::SockAct);
         iWriteN->event(&e);
     }
@@ -1681,7 +1718,8 @@ void QAsyncSelect::IssueRequest()
         m_selectFlags = selectFlags;
     }
     if (m_selectFlags && !IsActive()) {
-        m_selectBuf() = m_selectFlags;
+        //always request errors (write notification does not complete on connect errors)
+        m_selectBuf() = m_selectFlags | KSockSelectExcept;
         m_socket.Ioctl(KIOctlSelect, iStatus, &m_selectBuf, KSOLSocket);
         SetActive();
     }
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index f36b7dd..8a0b8df 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -135,6 +135,10 @@ public:
     bool isExceptionNotificationEnabled() const;
     void setExceptionNotificationEnabled(bool enable);
 
+    bool event(QEvent* ev);
+
+    static const QEvent::Type PostThreadChangeEvent = (QEvent::Type)(QEvent::User + 1);
+
 public Q_SLOTS:
     // TODO: Why do we do this? This is private Qt implementation stuff anyway, no need for it
     // non-virtual override;
-- 
cgit v0.12


From 640152ac8057f026451da814419511cf04446eca Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 24 Jan 2011 11:58:33 +0000
Subject: Fix deprecated cast from ascii warning

Reviewed-by: Aaron Tunney
---
 src/network/kernel/qhostinfo_symbian.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 7fc40bc..9599274 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -126,7 +126,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     // the IPv6 addresses at the end of the address list in results.
 
     // Synchronous request.
-    err = hostResolver.GetByName(qt_QString2TPtrC(aceHostname), nameResult);
+    err = hostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), nameResult);
     if (err) {
         // TODO - Could there be other errors? Symbian docs don't say.
         if (err = KErrNotFound) {
-- 
cgit v0.12


From 5f41f2b4bbe3f4d3f7e2ccb6c14273c5a308b837 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 25 Jan 2011 10:43:45 +0000
Subject: qnetworkreply test stability on symbian

The first few tests could randomly timeout due to delays in starting
the WLAN connection.
This is addressed by opening the default bearer in initTestCase, and
closing it in cleanupTestCase. This will keep the connection active for
the duration of the test, instead of activating/deactivating continuously.

The first SSL test could randomly timeout due to the delay in fetching the
CA certificates from the system (which can be very slow on some phones /
SIM cards).
This is addressed by preloading them in initTestCase - all the tests will
then get system SSL certs from the cache.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 390d5bf..3e07176 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -65,6 +65,11 @@
 #include <QtNetwork/qsslerror.h>
 #include <QtNetwork/qsslconfiguration.h>
 #endif
+#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtNetwork/qnetworkconfigmanager.h>
+#include <QtNetwork/qnetworkconfiguration.h>
+#include <QtNetwork/qnetworksession.h>
+#endif
 
 #include <time.h>
 
@@ -136,6 +141,11 @@ class tst_QNetworkReply: public QObject
     QSslConfiguration storedSslConfiguration;
     QList<QSslError> storedExpectedSslErrors;
 #endif
+#ifndef QT_NO_BEARER_MANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QScopedPointer<QNetworkSession> networkSession;
+#endif
 
 public:
     tst_QNetworkReply();
@@ -1140,6 +1150,18 @@ void tst_QNetworkReply::initTestCase()
 #endif
 
     QDir::setSearchPaths("srcdir", QStringList() << SRCDIR);
+#ifndef QT_NO_OPENSSL
+    QSslSocket::defaultCaCertificates(); //preload certificates
+#endif
+#ifndef QT_NO_BEARERMANAGEMENT
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession.reset(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
 }
 
 void tst_QNetworkReply::cleanupTestCase()
@@ -1147,6 +1169,9 @@ void tst_QNetworkReply::cleanupTestCase()
 #if !defined Q_OS_WIN
     QFile::remove(wronlyFileName);
 #endif
+    if (networkSession && networkSession->isOpen()) {
+        networkSession->close();
+    }
 }
 
 void tst_QNetworkReply::init()
-- 
cgit v0.12


From 00553adc2ab5c38f1870b036d4bec881acb77511 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 25 Jan 2011 13:18:23 +0000
Subject: Fix some qnetworkreply test cases for symbian

The unreachable IP test needs a longer timeout than on desktops.
The manual construction of a file:// URL was incorrect in the case where
SRCDIR is "." - this is changed to the recommended QUrl::fromLocalFile
API.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 3e07176..71a8352 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -5302,7 +5302,7 @@ void tst_QNetworkReply::getFromUnreachableIp()
     QNetworkReplyPtr reply = manager.get(request);
 
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
-    QTestEventLoop::instance().enterLoop(5);
+    QTestEventLoop::instance().enterLoop(10);
     QVERIFY(!QTestEventLoop::instance().timeout());
 
     QVERIFY(reply->error() != QNetworkReply::NoError);
@@ -5469,7 +5469,7 @@ void tst_QNetworkReply::synchronousRequest_data()
         << QString("text/plain");
 
     QTest::newRow("simple-file")
-        << QUrl(QString::fromLatin1("file:///" SRCDIR "/rfc3252.txt"))
+        << QUrl::fromLocalFile(SRCDIR "/rfc3252.txt")
         << QString("file:" SRCDIR "/rfc3252.txt")
         << true
         << QString();
-- 
cgit v0.12


From b36097693f9be745e8da550ea872fd1cda8d7d3a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 25 Jan 2011 13:30:58 +0000
Subject: Handle KErrBadName when connecting to broadcast address

Symbian uses KErrBadName to indicate a badly formed socket address.
It also returns this error if the address is invalid for the attempted
operation, for example calling connect() with a broadcast address.

Now handle this error explicitly rather than returning unknown error.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 7 +++++++
 src/network/socket/qsymbiansocketengine_p.h | 2 ++
 2 files changed, 9 insertions(+)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 487f45c..8ded9ac 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -626,6 +626,10 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
             d->setError(QAbstractSocket::SocketAccessError, d->AccessErrorString);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
+        case KErrBadName:
+            d->setError(QAbstractSocket::NetworkError, d->InvalidAddressError);
+            d->socketState = QAbstractSocket::UnconnectedState;
+            break;
         case KErrNotSupported:
         case KErrBadDescriptor:
         default:
@@ -1306,6 +1310,9 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
     case InvalidProxyTypeString:
         socketErrorString = QSymbianSocketEngine::tr("The proxy type is invalid for this operation");
         break;
+    case InvalidAddressError:
+        socketErrorString = QSymbianSocketEngine::tr("The address is invalid for this operation");
+        break;
     case UnknownSocketErrorString:
         socketErrorString = QSymbianSocketEngine::tr("Unknown error");
         break;
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 8a0b8df..fb64dba 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -233,6 +233,8 @@ public:
         PortInuseErrorString,
         NotSocketErrorString,
         InvalidProxyTypeString,
+        //symbian specific
+        InvalidAddressError,
 
         UnknownSocketErrorString = -1
     };
-- 
cgit v0.12


From 54692812331d24939a0263a1625702670503c17a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 25 Jan 2011 13:37:45 +0000
Subject: Suppress warning for an expected error

QTcpServer calls accept repeatedly until it fails.
So the KErrWouldBlock is an expected error - ignore this so warnings are
only emitted for unexpected errors.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 8ded9ac..bee034e 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -743,7 +743,8 @@ int QSymbianSocketEngine::accept()
     User::WaitForRequest(status);
     if (status.Int()) {
         blankSocket.Close();
-        qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
+        if (status != KErrWouldBlock)
+            qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
         return -1;
     }
 
-- 
cgit v0.12


From cdc4ce0acde93b23c7e4941b5c195a8d23ff6900 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 5 Jan 2011 11:07:56 +0000
Subject: Workaround crash when multiple QNetworkAccessManager instances are
 used

Instead of each QNetworkAccessManager owning a QNetworkSession, they now
share a QNetworkSession if they have the same QNetworkConfiguration.
QNetworkAccessManager now uses passive roaming instead of application
level roaming. The state change signal (entering connected state) is used
to indicate reconnection instead of being triggered when sending an ALR
accept().
This preserves the previous behaviour, as QNAM always accepted the
suggested access point from bearer mobility.
In the case of multithreaded applications, one QNetworkSession will be
created for each thread which uses QNetworkAccessManager, as QNetworkSession
is not thread safe.

Task-number: QT-4378
Reviewed-by: Markus Goetz
Reviewed-by: juhvu
---
 src/network/access/qnetworkaccessmanager.cpp | 42 +++----------
 src/network/access/qnetworkaccessmanager.h   |  2 -
 src/network/access/qnetworkaccessmanager_p.h |  2 +-
 src/network/access/qnetworkreplyimpl.cpp     |  6 +-
 src/network/bearer/bearer.pri                |  6 +-
 src/network/bearer/qsharednetworksession.cpp | 90 ++++++++++++++++++++++++++++
 src/network/bearer/qsharednetworksession_p.h | 81 +++++++++++++++++++++++++
 7 files changed, 188 insertions(+), 41 deletions(-)
 create mode 100644 src/network/bearer/qsharednetworksession.cpp
 create mode 100644 src/network/bearer/qsharednetworksession_p.h

diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index bec217b..94ce3bc 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -48,6 +48,7 @@
 #include "qabstractnetworkcache.h"
 
 #include "QtNetwork/qnetworksession.h"
+#include "qsharednetworksession_p.h"
 
 #include "qnetworkaccesshttpbackend_p.h"
 #include "qnetworkaccessftpbackend_p.h"
@@ -1343,11 +1344,8 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
 
     initializeSession = false;
 
-    if (networkSession)
-        delete networkSession;
-
     if (!config.isValid()) {
-        networkSession = 0;
+        networkSession.clear();
         online = false;
 
         if (networkAccessible == QNetworkAccessManager::NotAccessible)
@@ -1358,18 +1356,12 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
         return;
     }
 
-    networkSession = new QNetworkSession(config, q);
+    networkSession = QSharedNetworkSessionManager::getSession(config);
 
-    QObject::connect(networkSession, SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
-    QObject::connect(networkSession, SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
-    QObject::connect(networkSession, SIGNAL(stateChanged(QNetworkSession::State)),
+    QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
+    QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
+    QObject::connect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
                      q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
-    QObject::connect(networkSession, SIGNAL(newConfigurationActivated()),
-                     q, SLOT(_q_networkSessionNewConfigurationActivated()));
-    QObject::connect(networkSession,
-                     SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
-                     q,
-                     SLOT(_q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool)));
 
     _q_networkSessionStateChanged(networkSession->state());
 }
@@ -1379,32 +1371,16 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
     if (networkSession) {
         networkConfiguration = networkSession->configuration().identifier();
 
-        networkSession->deleteLater();
-        networkSession = 0;
-    }
-}
-
-void QNetworkAccessManagerPrivate::_q_networkSessionNewConfigurationActivated()
-{
-    Q_Q(QNetworkAccessManager);
-
-    if (networkSession) {
-        networkSession->accept();
-
-        emit q->networkSessionConnected();
+        networkSession.clear();
     }
 }
 
-void QNetworkAccessManagerPrivate::_q_networkSessionPreferredConfigurationChanged(const QNetworkConfiguration &, bool)
-{
-    if (networkSession)
-        networkSession->migrate();
-}
-
 void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession::State state)
 {
     Q_Q(QNetworkAccessManager);
 
+    if (state == QNetworkSession::Connected)
+        emit q->networkSessionConnected();
     if (online) {
         if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
             online = false;
diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h
index 95e45f0..9c551a7 100644
--- a/src/network/access/qnetworkaccessmanager.h
+++ b/src/network/access/qnetworkaccessmanager.h
@@ -161,8 +161,6 @@ private:
     Q_PRIVATE_SLOT(d_func(), void _q_replySslErrors(QList<QSslError>))
 #if !defined(QT_NO_BEARERMANAGEMENT) && !defined(QT_MOBILITY_BEARER)
     Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed())
-    Q_PRIVATE_SLOT(d_func(), void _q_networkSessionNewConfigurationActivated())
-    Q_PRIVATE_SLOT(d_func(), void _q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool))
     Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State))
 #endif
 };
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index 2c6ee10..cdc4b3d 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -128,7 +128,7 @@ public:
 #endif
 
 #ifndef QT_NO_BEARERMANAGEMENT
-    QNetworkSession *networkSession;
+    QSharedPointer<QNetworkSession> networkSession;
     QString networkConfiguration;
     QNetworkAccessManager::NetworkAccessibility networkAccessible;
     bool online;
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 70c318c..373cb22 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -97,7 +97,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
         // state changes.
         state = WaitingForSession;
 
-        QNetworkSession *session = manager->d_func()->networkSession;
+        QNetworkSession *session = manager->d_func()->networkSession.data();
 
         if (session) {
             Q_Q(QNetworkReplyImpl);
@@ -257,7 +257,7 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected()
     if (manager.isNull())
         return;
 
-    QNetworkSession *session = manager->d_func()->networkSession;
+    QNetworkSession *session = manager->d_func()->networkSession.data();
     if (!session)
         return;
 
@@ -693,7 +693,7 @@ void QNetworkReplyImplPrivate::finished()
 
     if (!manager.isNull()) {
 #ifndef QT_NO_BEARERMANAGEMENT
-        QNetworkSession *session = manager->d_func()->networkSession;
+        QNetworkSession *session = manager->d_func()->networkSession.data();
         if (session && session->state() == QNetworkSession::Roaming &&
             state == Working && errorCode != QNetworkReply::OperationCanceledError) {
             // only content with a known size will fail with a temporary network failure error
diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri
index bc5b0b5..d58d5ec 100644
--- a/src/network/bearer/bearer.pri
+++ b/src/network/bearer/bearer.pri
@@ -7,11 +7,13 @@ HEADERS += bearer/qnetworkconfiguration.h \
            bearer/qnetworkconfiguration_p.h \
            bearer/qnetworksession_p.h \
            bearer/qbearerengine_p.h \
-           bearer/qbearerplugin_p.h
+           bearer/qbearerplugin_p.h \
+           bearer/qsharednetworksession_p.h
 
 SOURCES += bearer/qnetworksession.cpp \
            bearer/qnetworkconfigmanager.cpp \
            bearer/qnetworkconfiguration.cpp \
            bearer/qnetworkconfigmanager_p.cpp \
            bearer/qbearerengine.cpp \
-           bearer/qbearerplugin.cpp
+           bearer/qbearerplugin.cpp \
+           bearer/qsharednetworksession.cpp
diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
new file mode 100644
index 0000000..51b3a32
--- /dev/null
+++ b/src/network/bearer/qsharednetworksession.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsharednetworksession_p.h"
+#include "qbearerengine_p.h"
+#include <QThreadStorage>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+QThreadStorage<QSharedNetworkSessionManager *> tls;
+
+inline QSharedNetworkSessionManager* sharedNetworkSessionManager()
+{
+    QSharedNetworkSessionManager* rv = tls.localData();
+    if (!rv) {
+        rv = new QSharedNetworkSessionManager;
+        tls.setLocalData(rv);
+    }
+    return rv;
+}
+
+QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetworkConfiguration config)
+{
+    QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
+    //if already have a session, return it
+    if (m->sessions.contains(config)) {
+        QSharedPointer<QNetworkSession> p = m->sessions.value(config).toStrongRef();
+        if (!p.isNull())
+            return p;
+    }
+    //otherwise make one
+    QSharedPointer<QNetworkSession> session(new QNetworkSession(config));
+    m->sessions[config] = session;
+    return session;
+}
+
+void QSharedNetworkSessionManager::setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session)
+{
+    QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
+    m->sessions[config] = session;
+}
+
+uint qHash(const QNetworkConfiguration& config)
+{
+    return ((uint)config.type()) | (((uint)config.bearerType()) << 8) | (((uint)config.purpose()) << 16);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qsharednetworksession_p.h b/src/network/bearer/qsharednetworksession_p.h
new file mode 100644
index 0000000..dc84166
--- /dev/null
+++ b/src/network/bearer/qsharednetworksession_p.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSHAREDNETWORKSESSIONPRIVATE_H
+#define QSHAREDNETWORKSESSIONPRIVATE_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 "qnetworksession.h"
+#include "qnetworkconfiguration.h"
+#include <QHash>
+#include <QSharedPointer>
+#include <QWeakPointer>
+#include <QMutex>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QSharedNetworkSessionManager
+{
+public:
+    static QSharedPointer<QNetworkSession> getSession(QNetworkConfiguration config);
+    static void setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session);
+private:
+    QHash<QNetworkConfiguration, QWeakPointer<QNetworkSession> > sessions;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif //QSHAREDNETWORKSESSIONPRIVATE_H
+
-- 
cgit v0.12


From c546754be723c35a61a8aa5df066aa8dce053d56 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 17 Jan 2011 12:44:06 +0000
Subject: Fix header not found build error

Task-Number: QT-4378
---
 src/network/access/qnetworkaccessmanager.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 94ce3bc..7d37375 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -48,7 +48,7 @@
 #include "qabstractnetworkcache.h"
 
 #include "QtNetwork/qnetworksession.h"
-#include "qsharednetworksession_p.h"
+#include "QtNetwork/private/qsharednetworksession_p.h"
 
 #include "qnetworkaccesshttpbackend_p.h"
 #include "qnetworkaccessftpbackend_p.h"
-- 
cgit v0.12


From 07416116e30ec526506c6f2c97be4499b898dda0 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 27 Jan 2011 14:28:46 +0000
Subject: Fix for QNetworkSession::waitForOpened failing on active connection

When opening an active session, waitForOpened was failing because
the state was Connected rather than Connecting.
This is fixed to allow Connected as a state.

Reviewed-by: Markus Goetz
---
 src/network/bearer/qnetworksession.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index eac0456..41a8854 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -310,7 +310,7 @@ bool QNetworkSession::waitForOpened(int msecs)
     if (d->isOpen)
         return true;
 
-    if (d->state != Connecting)
+    if (d->state != Connecting && d->state != Connected) //state is connected when opening an already active interface
         return false;
 
     QEventLoop loop;
-- 
cgit v0.12


From 85ee65df53ddece16b9d51fae0de1dd36564564a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 28 Jan 2011 17:38:56 +0000
Subject: Fix compile errors when TCP local sockets configured on symbian

Reviewed-by: Markus Goetz
---
 src/network/socket/qlocalserver.cpp | 2 +-
 src/network/socket/qlocalsocket.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp
index ef7fc02..6d8b889 100644
--- a/src/network/socket/qlocalserver.cpp
+++ b/src/network/socket/qlocalserver.cpp
@@ -274,11 +274,11 @@ QLocalSocket *QLocalServer::nextPendingConnection()
     if (d->pendingConnections.isEmpty())
         return 0;
     QLocalSocket *nextSocket = d->pendingConnections.dequeue();
+#ifndef QT_LOCALSOCKET_TCP
 #ifdef Q_OS_SYMBIAN
     if(!d->socketNotifier)
         return nextSocket;
 #endif
-#ifndef QT_LOCALSOCKET_TCP
     if (d->pendingConnections.size() <= d->maxPendingConnections)
 #ifndef Q_OS_WIN
         d->socketNotifier->setEnabled(true);
diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp
index 2eb1700..aa11d05 100644
--- a/src/network/socket/qlocalsocket.cpp
+++ b/src/network/socket/qlocalsocket.cpp
@@ -346,7 +346,7 @@ QLocalSocket::QLocalSocket(QObject * parent)
 QLocalSocket::~QLocalSocket()
 {
     close();
-#ifndef Q_OS_WIN
+#if !defined (Q_OS_WIN) && !defined (QT_LOCALSOCKET_TCP)
     Q_D(QLocalSocket);
     d->unixSocket.setParent(0);
 #endif
-- 
cgit v0.12


From 2ff5c6adbca65405d0a760173e5128b98d5d4a40 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 28 Jan 2011 17:39:57 +0000
Subject: Enable QT_LOCALSOCKET_TCP for symbian

Reviewed-by: Markus Goetz
---
 src/network/socket/socket.pri | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/network/socket/socket.pri b/src/network/socket/socket.pri
index 3eb54a2..32be429 100644
--- a/src/network/socket/socket.pri
+++ b/src/network/socket/socket.pri
@@ -30,11 +30,19 @@ symbian:HEADERS += socket/qsymbiansocketengine_p.h
 !symbian:SOURCES += socket/qnativesocketengine.cpp
 !symbian:HEADERS += socket/qnativesocketengine_p.h
 
-unix:!symbian:SOURCES += socket/qnativesocketengine_unix.cpp
-
-unix:SOURCES +=  \
+unix:!symbian: {
+    SOURCES += socket/qnativesocketengine_unix.cpp \
                 socket/qlocalsocket_unix.cpp \
                 socket/qlocalserver_unix.cpp
+}
+
+symbian: {
+    SOURCES += socket/qlocalsocket_tcp.cpp \
+               socket/qlocalserver_tcp.cpp
+
+    DEFINES += QT_LOCALSOCKET_TCP
+}
+
 unix:HEADERS += \
                 socket/qnet_unix_p.h
 
-- 
cgit v0.12


From 470376b6e0574c8a6740e24229ade859a29817f1 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 2 Feb 2011 13:41:47 +0100
Subject: Fixes QLocale locale name parsing.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Allow BCP47 dash as a language-country separator.
This only changes it one way - parsing 'en-US' will work, but
QLocale::name() will still return name with underscore as separator.

Task-number: QTBUG-15835
Reviewed-by: João Abecasis
---
 src/corelib/tools/qlocale.cpp      | 6 ++++--
 tests/auto/qlocale/tst_qlocale.cpp | 3 +++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 6b1de5e..5499fea 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -274,7 +274,7 @@ static bool splitLocaleName(const QString &name, QChar *lang_begin, QChar *cntry
         switch (state) {
             case 0:
                 // parsing language
-                if (uc->unicode() == '_') {
+                if (uc->unicode() == '_' || uc->unicode() == '-') {
                     state = 1;
                     break;
                 }
@@ -2201,7 +2201,7 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
 /*!
     Constructs a QLocale object with the specified \a name,
     which has the format
-    "language[_country][.codeset][@modifier]" or "C", where:
+    "language[_-country][.codeset][@modifier]" or "C", where:
 
     \list
     \i language is a lowercase, two-letter, ISO 639 language code,
@@ -2209,6 +2209,8 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
     \i and codeset and modifier are ignored.
     \endlist
 
+    The separator can be either underscore or a minus sign.
+
     If the string violates the locale format, or language is not
     a valid ISO 369 code, the "C" locale is used instead. If country
     is not present, or is not a valid ISO 3166 code, the most
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 7e9b8ec..a01cacb 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -316,6 +316,8 @@ void tst_QLocale::ctor()
     TEST_CTOR("en_GB.bla", English, UnitedKingdom)
     TEST_CTOR("en_GB@.bla", English, UnitedKingdom)
     TEST_CTOR("en_GB@bla", English, UnitedKingdom)
+    TEST_CTOR("en-GB", English, UnitedKingdom)
+    TEST_CTOR("en-GB@bla", English, UnitedKingdom)
 
     Q_ASSERT(QLocale::Norwegian == QLocale::NorwegianBokmal);
     TEST_CTOR("no", Norwegian, Norway)
@@ -326,6 +328,7 @@ void tst_QLocale::ctor()
     TEST_CTOR("nn_NO", NorwegianNynorsk, Norway)
     TEST_CTOR("es_ES", Spanish, Spain)
     TEST_CTOR("es_419", Spanish, LatinAmericaAndTheCaribbean)
+    TEST_CTOR("es-419", Spanish, LatinAmericaAndTheCaribbean)
 
     // test default countries for languages
     TEST_CTOR("mn", Mongolian, Mongolia)
-- 
cgit v0.12


From c8a1b65ab2491886ac37a1726b3728e549d505a7 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 28 Jan 2011 18:45:15 +0000
Subject: Implement multicast functions

Reviewed-by: Aaron Tunney
Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 112 ++++++++++++++++------------
 src/network/socket/qsymbiansocketengine_p.h |   5 ++
 2 files changed, 69 insertions(+), 48 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index bee034e..6825374 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -436,40 +436,14 @@ bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, in
     if (!isValid())
         return false;
 
-    int n = 0;
-    int level = SOL_SOCKET; // default
+    TUint n = 0;
+    TUint level = KSOLSocket; // default
 
-    switch (opt) {
-    case QAbstractSocketEngine::ReceiveBufferSocketOption:
-        n = KSORecvBuf;
-        break;
-    case QAbstractSocketEngine::SendBufferSocketOption:
-        n = KSOSendBuf;
-        break;
-    case QAbstractSocketEngine::BroadcastSocketOption:
-        return true;
-    case QAbstractSocketEngine::NonBlockingSocketOption:
-        n = KSONonBlockingIO;
-        break;
-    case QAbstractSocketEngine::AddressReusable:
-        level = KSolInetIp;
-        n = KSoReuseAddr;
-        break;
-    case QAbstractSocketEngine::BindExclusively:
+    if (!QSymbianSocketEnginePrivate::translateSocketOption(opt, n, level))
+        return false;
+
+    if (!level && !n)
         return true;
-    case QAbstractSocketEngine::ReceiveOutOfBandData:
-        level = KSolInetTcp;
-        n = KSoTcpOobInline;
-        break;
-    case QAbstractSocketEngine::LowDelayOption:
-        level = KSolInetTcp;
-        n = KSoTcpNoDelay;
-        break;
-    case QAbstractSocketEngine::KeepAliveOption:
-        level = KSolInetTcp;
-        n = KSoTcpKeepAlive;
-        break;
-    }
 
     return (KErrNone == d->nativeSocket.SetOpt(n, level, v));
 }
@@ -486,6 +460,24 @@ int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
     TUint n;
     TUint level = KSOLSocket; // default
 
+    if (!QSymbianSocketEnginePrivate::translateSocketOption(opt, n, level))
+        return false;
+
+    if (!level && !n)
+        return 1;
+
+    int v = -1;
+    //GetOpt() is non const
+    TInt err = d->nativeSocket.GetOpt(n, level, v);
+    if (!err)
+        return v;
+
+    return -1;
+}
+
+bool QSymbianSocketEnginePrivate::translateSocketOption(QAbstractSocketEngine::SocketOption opt, TUint &n, TUint &level)
+{
+
     switch (opt) {
     case QAbstractSocketEngine::ReceiveBufferSocketOption:
         n = KSORecvBuf;
@@ -496,13 +488,14 @@ int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
     case QAbstractSocketEngine::NonBlockingSocketOption:
         n = KSONonBlockingIO;
         break;
-    case QAbstractSocketEngine::BroadcastSocketOption:
-        return true; //symbian doesn't support or require this option
     case QAbstractSocketEngine::AddressReusable:
         level = KSolInetIp;
         n = KSoReuseAddr;
         break;
+    case QAbstractSocketEngine::BroadcastSocketOption:
     case QAbstractSocketEngine::BindExclusively:
+        level = 0;
+        n = 0;
         return true;
     case QAbstractSocketEngine::ReceiveOutOfBandData:
         level = KSolInetTcp;
@@ -516,17 +509,18 @@ int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
         level = KSolInetTcp;
         n = KSoTcpKeepAlive;
         break;
+    case QAbstractSocketEngine::MulticastLoopbackOption:
+        level = KSolInetIp;
+        n = KSoIp6MulticastLoop;
+        break;
+    case QAbstractSocketEngine::MulticastTtlOption:
+        level = KSolInetIp;
+        n = KSoIp6MulticastHops;
+        break;
     default:
-        return -1;
+        return false;
     }
-
-    int v = -1;
-    //GetOpt() is non const
-    TInt err = d->nativeSocket.GetOpt(n, level, v);
-    if (!err)
-        return v;
-
-    return -1;
+    return true;
 }
 
 qint64 QSymbianSocketEngine::receiveBufferSize() const
@@ -1156,15 +1150,37 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
 bool QSymbianSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress,
                               const QNetworkInterface &iface)
 {
-    //TODO
-    return false;
+    Q_D(QSymbianSocketEngine);
+    return d->multicastGroupMembershipHelper(groupAddress, iface, KSoIp6JoinGroup);
 }
 
 bool QSymbianSocketEngine::leaveMulticastGroup(const QHostAddress &groupAddress,
                                const QNetworkInterface &iface)
 {
-    //TODO
-    return false;
+    Q_D(QSymbianSocketEngine);
+    return d->multicastGroupMembershipHelper(groupAddress, iface, KSoIp6LeaveGroup);
+}
+
+bool QSymbianSocketEnginePrivate::multicastGroupMembershipHelper(const QHostAddress &groupAddress,
+                          const QNetworkInterface &iface,
+                          TUint operation)
+{
+    //TODO - untested
+    //translate address
+    TPckgBuf<TIp6Mreq> option;
+    Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
+    memcpy(option().iAddr.u.iAddr8, ip6.c, 16);
+    //translate interface
+    //TODO - can we just use iface.index() ?
+    TPckgBuf<TSoInetIfQuery> query;
+    query().iName = qt_QString2TPtrC(iface.name());
+    TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
+    if (err == KErrNone)
+        option().iInterface = query().iIndex;
+    else
+        option().iInterface = 0;
+    //join or leave group
+    return (KErrNone == nativeSocket.SetOpt(operation, KSolInetIp, option));
 }
 
 QNetworkInterface QSymbianSocketEngine::multicastInterface() const
@@ -1175,7 +1191,7 @@ QNetworkInterface QSymbianSocketEngine::multicastInterface() const
 
 bool QSymbianSocketEngine::setMulticastInterface(const QNetworkInterface &iface)
 {
-    //TODO
+    //TODO - this is possibly a unix'ism as the RConnection on which the socket was created is probably controlling this
     return false;
 }
 
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index fb64dba..df93fe6 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -254,6 +254,11 @@ public:
 
     bool checkProxy(const QHostAddress &address);
     bool fetchConnectionParameters();
+
+    bool multicastGroupMembershipHelper(const QHostAddress &groupAddress,
+                              const QNetworkInterface &iface,
+                              TUint operation);
+    static bool translateSocketOption(QAbstractSocketEngine::SocketOption opt, TUint &n, TUint &level);
 };
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From c466df7e67b1af663be73fca94bb1f2951ba7371 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 31 Jan 2011 18:35:01 +0000
Subject: Fix for pendingDatagramSize() in symbian socket engine

The low level socket option returns the size including IP headers, as
there is an option in receive to include headers in the datagram.
This is OK for a "size will not exceed" metric for buffer allocation,
but Qt relies on it being an accurate size.
Open C did this by subtracting 28, but that isn't valid for IPv6
which has a 40 byte header. (we can't tell whether the buffered datagram
was received over IPv4 or IPv6)

To fix this, do a read with the peek option set, and only care about the
size. In future it would be good to not peek, but rather return this buffer
to a following call to readDatagram.

Reviewed-by: Aaron Tunney
---
 src/network/socket/qsymbiansocketengine.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 6825374..f2c7b20 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -788,6 +788,20 @@ qint64 QSymbianSocketEngine::pendingDatagramSize() const
     Q_D(const QSymbianSocketEngine);
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
+    if (nbytes > 0) {
+        //nbytes includes IP header, which is of variable length (IPv4 with or without options, IPv6...)
+        QByteArray next(nbytes,0);
+        TPtr8 buffer((TUint8*)next.data(), next.size());
+        TInetAddr addr;
+        TRequestStatus status;
+        //TODO: rather than peek, should we save this for next call to readDatagram?
+        //what if calls don't match though?
+        d->nativeSocket.RecvFrom(buffer, addr, KSockReadPeek, status);
+        User::WaitForRequest(status);
+        if (status.Int())
+            return 0;
+        return buffer.Length();
+    }
     return qint64(nbytes);
 }
 
-- 
cgit v0.12


From f60ed3a2da4889cce6afbb059773a6c070929bb6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 31 Jan 2011 18:50:13 +0000
Subject: Fix low level broadcast test on symbian

Broadcast and multicast are optional features for network interfaces on
Symbian. WLAN supports both, while IPv4 and IPv6 loopback support only
multicast.

The test tries to start the bearer, to get an interface that does support
broadcast.
There is an expect fail for the 0 bytes written case, as this is what
happens on symbian if none of the interfaces support broadcast.
On the phones which don't have WLAN, this is likely.

Reviewed-by: Markus Goetz
---
 .../tst_platformsocketengine.cpp                   | 30 ++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
index 2fb3724..fa21ed8 100644
--- a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -63,6 +63,10 @@
 #include <stddef.h>
 
 #ifdef Q_OS_SYMBIAN
+#include <QNetworkConfigurationManager>
+#include <QNetworkConfiguration>
+#include <QNetworkSession>
+#include <QScopedPointer>
 #define PLATFORMSOCKETENGINE QSymbianSocketEngine
 #include <private/qsymbiansocketengine_p.h>
 #include <private/qcore_symbian_p.h>
@@ -310,6 +314,20 @@ void tst_PlatformSocketEngine::udpIPv6LoopbackTest()
 //---------------------------------------------------------------------------
 void tst_PlatformSocketEngine::broadcastTest()
 {
+#ifdef Q_OS_SYMBIAN
+    //broadcast isn't supported on loopback connections, but is on WLAN
+#ifndef QT_NO_BEARERMANAGEMENT
+    QScopedPointer<QNetworkConfigurationManager> netConfMan(new QNetworkConfigurationManager());
+    QNetworkConfiguration networkConfiguration(netConfMan->defaultConfiguration());
+    QScopedPointer<QNetworkSession> networkSession(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        bool ok = networkSession->waitForOpened(30000);
+        qDebug() << networkSession->isOpen() << networkSession->error() << networkSession->errorString();
+        QVERIFY(ok);
+    }
+#endif
+#endif
 #ifdef Q_OS_AIX
     QSKIP("Broadcast does not work on darko", SkipAll);
 #endif
@@ -327,10 +345,18 @@ void tst_PlatformSocketEngine::broadcastTest()
     // Broadcast an inappropriate troll message
     QByteArray trollMessage
         = "MOOT wtf is a MOOT? talk english not your sutpiD ENGLISH.";
-    QVERIFY(broadcastSocket.writeDatagram(trollMessage.data(),
+    qint64 written = broadcastSocket.writeDatagram(trollMessage.data(),
                                          trollMessage.size(),
                                          QHostAddress::Broadcast,
-                                         port) == trollMessage.size());
+                                         port);
+
+#ifdef Q_OS_SYMBIAN
+    //On symbian, broadcasts return 0 bytes written if none of the interfaces support it.
+    //Notably the loopback interfaces do not. (though they do support multicast!?)
+    if (written == 0)
+        QEXPECT_FAIL("", "No active interface supports broadcast", Abort);
+#endif
+    QCOMPARE((int)written, trollMessage.size());
 
     // Wait until we receive it ourselves
 #if defined(Q_OS_FREEBSD)
-- 
cgit v0.12


From 2a6d7fcde4092f41230841bbe4c078f2e42166bb Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 1 Feb 2011 11:18:19 +0000
Subject: Change default type for http POST to application/octet-stream

When the application did not set the mandatory content-type header for
POST requests, Qt was putting in application/x-www-urlencoded. While
this is the default for HTML forms, it isn't valid because Qt was not
also encoding the data.

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpnetworkrequest.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp
index d2f3212..d4c735d 100644
--- a/src/network/access/qhttpnetworkrequest.cpp
+++ b/src/network/access/qhttpnetworkrequest.cpp
@@ -158,8 +158,10 @@ QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request
     }
     if (request.d->operation == QHttpNetworkRequest::Post) {
         // add content type, if not set in the request
-        if (request.headerField("content-type").isEmpty())
-            ba += "Content-Type: application/x-www-form-urlencoded\r\n";
+        if (request.headerField("content-type").isEmpty()) {
+            qWarning("content-type missing in HTTP POST, defaulting to application/octet-stream");
+            ba += "Content-Type: application/octet-stream\r\n";
+        }
         if (!request.d->uploadByteDevice && request.d->url.hasQuery()) {
             QByteArray query = request.d->url.encodedQuery();
             ba += "Content-Length: ";
-- 
cgit v0.12


From 2d30fce0c46fb5b98aec428869668bc345eeab8a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 1 Feb 2011 15:52:28 +0000
Subject: Unification of error handling in symbian socket engine

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 79 +++++++++--------------------
 1 file changed, 24 insertions(+), 55 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index f2c7b20..df0675e 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -67,6 +67,7 @@
 
 #include <private/qthread_p.h>
 #include <private/qobject_p.h>
+#include <private/qsystemerror_p.h>
 
 #define QNATIVESOCKETENGINE_DEBUG
 
@@ -190,7 +191,6 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     else
         err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
-    //TODO: combine error handling with setError
     if (err != KErrNone) {
         switch (err) {
         case KErrNotSupported:
@@ -198,13 +198,8 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
             setError(QAbstractSocket::UnsupportedSocketOperationError,
                 ProtocolUnsupportedErrorString);
             break;
-        case KErrNoMemory:
-            setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
-            break;
-        case KErrPermissionDenied:
-            setError(QAbstractSocket::SocketAccessError, AccessErrorString);
-            break;
         default:
+            setError(err);
             break;
         }
 
@@ -588,7 +583,6 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     d->nativeSocket.Connect(nativeAddr, status);
     User::WaitForRequest(status);
     TInt err = status.Int();
-    //TODO: combine with setError(int)
     //For non blocking connect, KErrAlreadyExists is returned from the second Connect() to indicate
     //the connection is up. So treat this the same as KErrNone which would be returned from the first
     //call if it wouldn't block. (e.g. winsock wrapper in the emulator ignores the nonblocking flag)
@@ -597,36 +591,8 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
         case KErrWouldBlock:
             d->socketState = QAbstractSocket::ConnectingState;
             break;
-        case KErrCouldNotConnect:
-            d->setError(QAbstractSocket::ConnectionRefusedError, d->ConnectionRefusedErrorString);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrTimedOut:
-            d->setError(QAbstractSocket::NetworkError, d->ConnectionTimeOutErrorString);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrHostUnreach:
-            d->setError(QAbstractSocket::NetworkError, d->HostUnreachableErrorString);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrNetUnreach:
-            d->setError(QAbstractSocket::NetworkError, d->NetworkUnreachableErrorString);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrInUse:
-            d->setError(QAbstractSocket::NetworkError, d->AddressInuseErrorString);
-            break;
-        case KErrPermissionDenied:
-            d->setError(QAbstractSocket::SocketAccessError, d->AccessErrorString);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrBadName:
-            d->setError(QAbstractSocket::NetworkError, d->InvalidAddressError);
-            d->socketState = QAbstractSocket::UnconnectedState;
-            break;
-        case KErrNotSupported:
-        case KErrBadDescriptor:
         default:
+            d->setError(err);
             d->socketState = QAbstractSocket::UnconnectedState;
             break;
         }
@@ -699,15 +665,7 @@ bool QSymbianSocketEngine::listen()
     // for a mobile platform
     TInt err = d->nativeSocket.Listen(50);
     if (err) {
-        //TODO: combine with setError(int)
-        switch (err) {
-        case KErrInUse:
-            d->setError(QAbstractSocket::AddressInUseError,
-                     d->PortInuseErrorString);
-            break;
-        default:
-            break;
-        }
+        d->setError(err);
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
         qDebug("QSymbianSocketEnginePrivate::nativeListen() == false (%s)",
@@ -846,9 +804,9 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
     TInetAddr addr;
     d->setPortAndAddress(addr, port, host);
     TSockXfrLength sentBytes;
-    TRequestStatus status; //TODO: OMG sync send!
+    TRequestStatus status;
     d->nativeSocket.SendTo(buffer, addr, 0, status, sentBytes);
-    User::WaitForRequest(status);
+    User::WaitForRequest(status); //Non blocking send
     TInt err = status.Int(); 
 
     if (err) {
@@ -882,8 +840,10 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
         return false;
 
     if (!nativeSocket.SubSessionHandle()) {
-        if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, nativeSocket))
+        if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, nativeSocket)) {
+            setError(QAbstractSocket::UnsupportedSocketOperationError, InvalidSocketErrorString);
             return false;
+        }
     }
 
     // Determine local address
@@ -912,8 +872,8 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
     TProtocolDesc protocol;
     TInt err = nativeSocket.Info(protocol);
     if (err) {
-        // ?
-        // QAbstractSocket::UnknownSocketType;
+        setError(err);
+        return false;
     } else {
         switch (protocol.iProtocol) {
         case KProtocolInetTcp:
@@ -1052,9 +1012,9 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
 
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TSockXfrLength received = 0;
-    TRequestStatus status; //TODO: OMG sync receive!
+    TRequestStatus status;
     d->nativeSocket.RecvOneOrMore(buffer, 0, status, received);
-    User::WaitForRequest(status);
+    User::WaitForRequest(status); //Non blocking receive
     TInt err = status.Int();
     int r = received();
 
@@ -1375,7 +1335,7 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
         setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
         break;
     case KErrPermissionDenied:
-        setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
+        setError(QAbstractSocket::SocketAccessError, AccessErrorString);
         break;
     case KErrNotSupported:
         setError(QAbstractSocket::UnsupportedSocketOperationError, OperationUnsupportedErrorString);
@@ -1383,9 +1343,18 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
     case KErrNoMemory:
         setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
         break;
+    case KErrCouldNotConnect:
+        setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+        break;
+    case KErrTimedOut:
+        setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
+        break;
+    case KErrBadName:
+        setError(QAbstractSocket::NetworkError, InvalidAddressError);
+        break;
     default:
         socketError = QAbstractSocket::NetworkError;
-        socketErrorString = QString::number(symbianError);
+        socketErrorString = QSystemError(symbianError, QSystemError::NativeError).toString();
         break;
     }
     hasSetSocketError = true;
-- 
cgit v0.12


From 4a8d3f4fb3830536a4a873f3c6bbf98fcdcd63a9 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 1 Feb 2011 19:55:12 +0000
Subject: Clean up TODO and FIXME that are done

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 34 ++++++++++++++---------------
 src/network/socket/qsymbiansocketengine_p.h |  4 ----
 2 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index df0675e..5649a18 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -538,10 +538,21 @@ void QSymbianSocketEngine::setSendBufferSize(qint64 size)
     setOption(SendBufferSocketOption, size);
 }
 
+/*!
+    Connects to the remote host name given by \a name on port \a
+    port. When this function is called, the upper-level will not
+    perform a hostname lookup.
+
+    The native socket engine does not support this operation,
+    but some other socket engines (notably proxy-based ones) do.
+*/
 bool QSymbianSocketEngine::connectToHostByName(const QString &name, quint16 port)
 {
-    // FIXME for engines that support hostnames.. not for us then i guess.
-
+    Q_UNUSED(name);
+    Q_UNUSED(port);
+    Q_D(QSymbianSocketEngine);
+    d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+        QSymbianSocketEnginePrivate::OperationUnsupportedErrorString);
     return false;
 }
 
@@ -737,8 +748,6 @@ bool QSymbianSocketEngine::hasPendingDatagrams() const
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return err == KErrNone && nbytes > 0;
-    //TODO: this is pretty horrible too...
-    // FIXME why?
 }
 
 qint64 QSymbianSocketEngine::pendingDatagramSize() const
@@ -770,9 +779,9 @@ qint64 QSymbianSocketEngine::readDatagram(char *data, qint64 maxSize,
     Q_D(QSymbianSocketEngine);
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TInetAddr addr;
-    TRequestStatus status; //TODO: OMG sync receive!
+    TRequestStatus status;
     d->nativeSocket.RecvFrom(buffer, addr, 0, status);
-    User::WaitForRequest(status);
+    User::WaitForRequest(status); //Non blocking receive
 
     if (status.Int()) {
         d->setError(QAbstractSocket::NetworkError, d->ReceiveDatagramErrorString);
@@ -1036,7 +1045,6 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     return qint64(r);
 }
 
-// FIXME wait vs select
 int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
 {
     bool readyRead = false;
@@ -1062,8 +1070,6 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
     //cancel asynchronous notifier (only one IOCTL allowed at a time)
     if (asyncSelect)
         asyncSelect->Cancel();
-    //TODO: implement
-    //as above, but checking both read and write status at the same time
 
     TPckgBuf<TUint> selectFlags;
     selectFlags() = KSockSelectExcept;
@@ -1310,7 +1316,6 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
     }
 }
 
-//TODO: use QSystemError class when file engine is merged to master
 void QSymbianSocketEnginePrivate::setError(TInt symbianError)
 {
     switch (symbianError) {
@@ -1385,14 +1390,12 @@ bool QReadNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isReadNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
-    // TODO
     return d->readNotifier && d->readNotifier->isEnabled();
 }
 
 void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
-    // TODO
     if (d->readNotifier) {
         d->readNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1437,14 +1440,12 @@ bool QWriteNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isWriteNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
-    // TODO
     return d->writeNotifier && d->writeNotifier->isEnabled();
 }
 
 void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
-    // TODO
     if (d->writeNotifier) {
         d->writeNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1488,7 +1489,6 @@ bool QExceptionNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
-    // TODO
     return d->exceptNotifier && d->exceptNotifier->isEnabled();
     return false;
 }
@@ -1497,7 +1497,6 @@ bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
-    // TODO
     if (d->exceptNotifier) {
         d->exceptNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1674,7 +1673,8 @@ void QAsyncSelect::run()
     //    return;
     m_inSocketEvent = true;
     m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
-    //TODO: KSockSelectReadContinuation does what?
+    //KSockSelectReadContinuation is for reading datagrams in a mode that doesn't discard when the
+    //datagram is larger than the read buffer - Qt doesn't need to use this.
     if (iReadN && ((m_selectBuf() & KSockSelectRead) || iStatus != KErrNone)) {
         QEvent e(QEvent::SockAct);
         iReadN->event(&e);
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index df93fe6..a2904ae 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -60,8 +60,6 @@
 #include <unistd.h>
 #include <es_sock.h>
 #include <in_sock.h>
-// TODO
-
 
 QT_BEGIN_NAMESPACE
 
@@ -121,7 +119,6 @@ public:
     int option(SocketOption option) const;
     bool setOption(SocketOption option, int value);
 
-    // FIXME actually implement
     bool waitForRead(int msecs = 30000, bool *timedOut = 0);
     bool waitForWrite(int msecs = 30000, bool *timedOut = 0);
     bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
@@ -244,7 +241,6 @@ public:
     void setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr);
     void setError(TInt symbianError);
 
-    // FIXME
     int nativeSelect(int timeout, bool selectForRead) const;
     int nativeSelect(int timeout, bool checkRead, bool checkWrite,
                            bool *selectForRead, bool *selectForWrite) const;
-- 
cgit v0.12


From 027d9f026d3a668638ca6e687c687e0f4aa0cc02 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 2 Feb 2011 14:05:34 +0000
Subject: Add precondition checks to symbian socket engine entry points

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 112 +++++++++++++++++++---------
 1 file changed, 75 insertions(+), 37 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 5649a18..d6b893a 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -78,6 +78,7 @@
 
 QT_BEGIN_NAMESPACE
 
+#define Q_VOID
 // Common constructs
 #define Q_CHECK_VALID_SOCKETLAYER(function, returnValue) do { \
     if (!isValid()) { \
@@ -186,9 +187,9 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
     TInt err;
-    if (connection)
-        err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
-    else
+//    if (connection)
+//        err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
+//    else
         err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
     if (err != KErrNone) {
@@ -296,7 +297,7 @@ bool QSymbianSocketEngine::initialize(QAbstractSocket::SocketType socketType, QA
         QString protocolStr = QLatin1String("UnknownProtocol");
         if (protocol == QAbstractSocket::IPv4Protocol) protocolStr = QLatin1String("IPv4Protocol");
         else if (protocol == QAbstractSocket::IPv6Protocol) protocolStr = QLatin1String("IPv6Protocol");
-        qDebug("QNativeSocketEngine::initialize(type == %s, protocol == %s) failed: %s",
+        qDebug("QSymbianSocketEngine::initialize(type == %s, protocol == %s) failed: %s",
                typeStr.toLatin1().constData(), protocolStr.toLatin1().constData(), d->socketErrorString.toLatin1().constData());
 #endif
         return false;
@@ -323,7 +324,7 @@ bool QSymbianSocketEngine::initialize(QAbstractSocket::SocketType socketType, QA
     // Make sure we receive out-of-band data
     if (socketType == QAbstractSocket::TcpSocket
         && !setOption(ReceiveOutOfBandData, 1)) {
-        qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
+        qWarning("QSymbianSocketEngine::initialize unable to inline out-of-band data");
     }
 
 
@@ -364,7 +365,7 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
     // determine socket type and protocol
     if (!d->fetchConnectionParameters()) {
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QNativeSocketEngine::initialize(socketDescriptor == %i) failed: %s",
+        qDebug("QSymbianSocketEngine::initialize(socketDescriptor == %i) failed: %s",
                socketDescriptor, d->socketErrorString.toLatin1().constData());
 #endif
         d->socketDescriptor = -1;
@@ -392,7 +393,7 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
         // Make sure we receive out-of-band data
         if (d->socketType == QAbstractSocket::TcpSocket
             && !setOption(ReceiveOutOfBandData, 1)) {
-            qWarning("QNativeSocketEngine::initialize unable to inline out-of-band data");
+            qWarning("QSymbianSocketEngine::initialize unable to inline out-of-band data");
         }
     }
 
@@ -428,8 +429,7 @@ int QSymbianSocketEngine::socketDescriptor() const
 bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, int v)
 {
     Q_D(QSymbianSocketEngine);
-    if (!isValid())
-        return false;
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setOption(), false);
 
     TUint n = 0;
     TUint level = KSOLSocket; // default
@@ -449,8 +449,7 @@ bool QSymbianSocketEngine::setOption(QAbstractSocketEngine::SocketOption opt, in
 int QSymbianSocketEngine::option(QAbstractSocketEngine::SocketOption opt) const
 {
     Q_D(const QSymbianSocketEngine);
-    if (!isValid())
-        return -1;
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::option(), -1);
 
     TUint n;
     TUint level = KSOLSocket; // default
@@ -520,21 +519,25 @@ bool QSymbianSocketEnginePrivate::translateSocketOption(QAbstractSocketEngine::S
 
 qint64 QSymbianSocketEngine::receiveBufferSize() const
 {
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::receiveBufferSize(), -1);
     return option(ReceiveBufferSocketOption);
 }
 
 void QSymbianSocketEngine::setReceiveBufferSize(qint64 size)
 {
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setReceiveBufferSize(), Q_VOID);
     setOption(ReceiveBufferSocketOption, size);
 }
 
 qint64 QSymbianSocketEngine::sendBufferSize() const
 {
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setSendBufferSize(), -1);
     return option(SendBufferSocketOption);
 }
 
 void QSymbianSocketEngine::setSendBufferSize(qint64 size)
 {
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setSendBufferSize(), Q_VOID);
     setOption(SendBufferSocketOption, size);
 }
 
@@ -577,6 +580,7 @@ void QSymbianSocketEngine::connectionNotification()
 bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::connectToHost(), false);
 
 #ifdef QNATIVESOCKETENGINE_DEBUG
     qDebug("QSymbianSocketEngine::connectToHost() : %d ", d->socketDescriptor);
@@ -620,7 +624,7 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
+    qDebug("QSymbianSocketEngine::Connect(%s, %i) == true",
            addr.toString().toLatin1().constData(), port);
 #endif
 
@@ -632,12 +636,12 @@ bool QSymbianSocketEngine::connectToHost(const QHostAddress &addr, quint16 port)
 bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 {
     Q_D(QSymbianSocketEngine);
-    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bind(), false);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::bind(), false);
 
     if (!d->checkProxy(address))
         return false;
 
-    Q_CHECK_STATE(QNativeSocketEngine::bind(), QAbstractSocket::UnconnectedState, false);
+    Q_CHECK_STATE(QSymbianSocketEngine::bind(), QAbstractSocket::UnconnectedState, false);
 
     TInetAddr nativeAddr;
     d->setPortAndAddress(nativeAddr, port, address);
@@ -652,7 +656,7 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
         d->setError(err);
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
+        qDebug("QSymbianSocketEngine::bind(%s, %i) == false (%s)",
                address.toString().toLatin1().constData(), port, d->socketErrorString.toLatin1().constData());
 #endif
 
@@ -660,7 +664,7 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeBind(%s, %i) == true",
+    qDebug("QSymbianSocketEngine::bind(%s, %i) == true",
            address.toString().toLatin1().constData(), port);
 #endif
     d->socketState = QAbstractSocket::BoundState;
@@ -672,21 +676,24 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 bool QSymbianSocketEngine::listen()
 {
     Q_D(QSymbianSocketEngine);
-    // TODO the value 50 is from the QNativeSocketEngine. Maybe it's a bit too much
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::listen(), false);
+    Q_CHECK_STATE(QSymbianSocketEngine::listen(), QAbstractSocket::BoundState, false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::listen(), QAbstractSocket::TcpSocket, false);
+   // TODO the value 50 is from the QNativeSocketEngine. Maybe it's a bit too much
     // for a mobile platform
     TInt err = d->nativeSocket.Listen(50);
     if (err) {
         d->setError(err);
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-        qDebug("QSymbianSocketEnginePrivate::nativeListen() == false (%s)",
+        qDebug("QSymbianSocketEngine::listen() == false (%s)",
                d->socketErrorString.toLatin1().constData());
 #endif
         return false;
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeListen() == true");
+    qDebug("QSymbianSocketEngine::listen() == true");
 #endif
 
     d->socketState = QAbstractSocket::ListeningState;
@@ -707,7 +714,7 @@ int QSymbianSocketEngine::accept()
     if (status.Int()) {
         blankSocket.Close();
         if (status != KErrWouldBlock)
-            qWarning("QSymbianSocketEnginePrivate::nativeAccept() - error %d", status.Int());
+            qWarning("QSymbianSocketEngine::accept() - error %d", status.Int());
         return -1;
     }
 
@@ -724,8 +731,8 @@ int QSymbianSocketEngine::accept()
 qint64 QSymbianSocketEngine::bytesAvailable() const
 {
     Q_D(const QSymbianSocketEngine);
-    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bytesAvailable(), -1);
-    Q_CHECK_NOT_STATE(QNativeSocketEngine::bytesAvailable(), QAbstractSocket::UnconnectedState, false);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::bytesAvailable(), -1);
+    Q_CHECK_NOT_STATE(QSymbianSocketEngine::bytesAvailable(), QAbstractSocket::UnconnectedState, false);
     int nbytes = 0;
     qint64 available = 0;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending, KSOLSocket, nbytes);
@@ -734,7 +741,7 @@ qint64 QSymbianSocketEngine::bytesAvailable() const
     available = (qint64) nbytes;
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
+    qDebug("QSymbianSocketEngine::bytesAvailable() == %lli", available);
 #endif
     return available;
 }
@@ -742,9 +749,9 @@ qint64 QSymbianSocketEngine::bytesAvailable() const
 bool QSymbianSocketEngine::hasPendingDatagrams() const
 {
     Q_D(const QSymbianSocketEngine);
-    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::hasPendingDatagrams(), false);
-    Q_CHECK_NOT_STATE(QNativeSocketEngine::hasPendingDatagrams(), QAbstractSocket::UnconnectedState, false);
-    Q_CHECK_TYPE(QNativeSocketEngine::hasPendingDatagrams(), QAbstractSocket::UdpSocket, false);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::hasPendingDatagrams(), false);
+    Q_CHECK_NOT_STATE(QSymbianSocketEngine::hasPendingDatagrams(), QAbstractSocket::UnconnectedState, false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::hasPendingDatagrams(), QAbstractSocket::UdpSocket, false);
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     return err == KErrNone && nbytes > 0;
@@ -753,6 +760,8 @@ bool QSymbianSocketEngine::hasPendingDatagrams() const
 qint64 QSymbianSocketEngine::pendingDatagramSize() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::pendingDatagramSize(), false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::hasPendingDatagrams(), QAbstractSocket::UdpSocket, false);
     int nbytes;
     TInt err = d->nativeSocket.GetOpt(KSOReadBytesPending,KSOLSocket, nbytes);
     if (nbytes > 0) {
@@ -777,6 +786,8 @@ qint64 QSymbianSocketEngine::readDatagram(char *data, qint64 maxSize,
                                                     QHostAddress *address, quint16 *port)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::readDatagram(), -1);
+    Q_CHECK_TYPE(QSymbianSocketEngine::readDatagram(), QAbstractSocket::UdpSocket, false);
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TInetAddr addr;
     TRequestStatus status;
@@ -791,7 +802,7 @@ qint64 QSymbianSocketEngine::readDatagram(char *data, qint64 maxSize,
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
     int len = buffer.Length();
-    qDebug("QSymbianSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
+    qDebug("QSymbianSocketEngine::receiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
            data, qt_prettyDebug(data, qMin(len, ssize_t(16)), len).data(), maxSize,
            address ? address->toString().toLatin1().constData() : "(nil)",
            port ? *port : 0, (qint64) len);
@@ -807,8 +818,8 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
                                                    const QHostAddress &host, quint16 port)
 {
     Q_D(QSymbianSocketEngine);
-    Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::writeDatagram(), -1);
-    Q_CHECK_TYPE(QNativeSocketEngine::writeDatagram(), QAbstractSocket::UdpSocket, -1);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::writeDatagram(), -1);
+    Q_CHECK_TYPE(QSymbianSocketEngine::writeDatagram(), QAbstractSocket::UdpSocket, -1);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TInetAddr addr;
     d->setPortAndAddress(addr, port, host);
@@ -920,7 +931,7 @@ void QSymbianSocketEngine::close()
         return;
     Q_D(QSymbianSocketEngine);
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeClose()");
+    qDebug("QSymbianSocketEngine::close()");
 #endif
 
     if (d->readNotifier)
@@ -973,6 +984,8 @@ void QSymbianSocketEngine::close()
 qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::write(), -1);
+    Q_CHECK_STATE(QSymbianSocketEngine::write(), QAbstractSocket::ConnectedState, -1);
     TPtrC8 buffer((TUint8*)data, (int)len);
     TSockXfrLength sentBytes = 0;
     TRequestStatus status;
@@ -1002,7 +1015,7 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
+    qDebug("QSymbianSocketEngine::write(%p \"%s\", %llu) == %i",
            data, qt_prettyDebug(data, qMin((int) len, 16),
                                 (int) len).data(), len, (int) sentBytes());
 #endif
@@ -1014,10 +1027,8 @@ qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
 qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
 {
     Q_D(QSymbianSocketEngine);
-    if (!isValid()) {
-        qWarning("QSymbianSocketEnginePrivate::nativeRead: Invalid socket");
-        return -1;
-    }
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::read(), -1);
+    Q_CHECK_STATES(QSymbianSocketEngine::read(), QAbstractSocket::ConnectedState, QAbstractSocket::BoundState, -1);
 
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TSockXfrLength received = 0;
@@ -1037,7 +1048,7 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %i",
+    qDebug("QSymbianSocketEngine::read(%p \"%s\", %llu) == %i",
            data, qt_prettyDebug(data, qMin(r, ssize_t(16)), r).data(),
            maxSize, r);
 #endif
@@ -1131,6 +1142,9 @@ bool QSymbianSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress,
                               const QNetworkInterface &iface)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::joinMulticastGroup(), false);
+    Q_CHECK_STATE(QSymbianSocketEngine::joinMulticastGroup(), QAbstractSocket::BoundState, false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::joinMulticastGroup(), QAbstractSocket::UdpSocket, false);
     return d->multicastGroupMembershipHelper(groupAddress, iface, KSoIp6JoinGroup);
 }
 
@@ -1138,6 +1152,9 @@ bool QSymbianSocketEngine::leaveMulticastGroup(const QHostAddress &groupAddress,
                                const QNetworkInterface &iface)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::leaveMulticastGroup(), false);
+    Q_CHECK_STATE(QSymbianSocketEngine::leaveMulticastGroup(), QAbstractSocket::BoundState, false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::leaveMulticastGroup(), QAbstractSocket::UdpSocket, false);
     return d->multicastGroupMembershipHelper(groupAddress, iface, KSoIp6LeaveGroup);
 }
 
@@ -1166,12 +1183,18 @@ bool QSymbianSocketEnginePrivate::multicastGroupMembershipHelper(const QHostAddr
 QNetworkInterface QSymbianSocketEngine::multicastInterface() const
 {
     //TODO
+    const Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::multicastInterface(), QNetworkInterface());
+    Q_CHECK_TYPE(QSymbianSocketEngine::multicastInterface(), QAbstractSocket::UdpSocket, QNetworkInterface());
     return QNetworkInterface();
 }
 
 bool QSymbianSocketEngine::setMulticastInterface(const QNetworkInterface &iface)
 {
     //TODO - this is possibly a unix'ism as the RConnection on which the socket was created is probably controlling this
+    Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setMulticastInterface(), false);
+    Q_CHECK_TYPE(QSymbianSocketEngine::setMulticastInterface(), QAbstractSocket::UdpSocket, false);
     return false;
 }
 
@@ -1197,7 +1220,7 @@ bool QSymbianSocketEnginePrivate::checkProxy(const QHostAddress &address)
 
     if (proxy.type() != QNetworkProxy::DefaultProxy &&
         proxy.type() != QNetworkProxy::NoProxy) {
-        // QNativeSocketEngine doesn't do proxies
+        // QSymbianSocketEngine doesn't do proxies
         setError(QAbstractSocket::UnsupportedSocketOperationError,
                  InvalidProxyTypeString);
         return false;
@@ -1390,12 +1413,14 @@ bool QReadNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isReadNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isReadNotificationEnabled(), false);
     return d->readNotifier && d->readNotifier->isEnabled();
 }
 
 void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setReadNotificationEnabled(), Q_VOID);
     if (d->readNotifier) {
         d->readNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1440,12 +1465,14 @@ bool QWriteNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isWriteNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isWriteNotificationEnabled(), false);
     return d->writeNotifier && d->writeNotifier->isEnabled();
 }
 
 void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setWriteNotificationEnabled(), Q_VOID);
     if (d->writeNotifier) {
         d->writeNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1489,6 +1516,7 @@ bool QExceptionNotifier::event(QEvent *e)
 bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isExceptionNotificationEnabled(), false);
     return d->exceptNotifier && d->exceptNotifier->isEnabled();
     return false;
 }
@@ -1497,6 +1525,7 @@ bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setExceptionNotificationEnabled(), Q_VOID);
     if (d->exceptNotifier) {
         d->exceptNotifier->setEnabled(enable);
     } else if (enable && d->threadData->eventDispatcher) {
@@ -1514,6 +1543,9 @@ void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 bool QSymbianSocketEngine::waitForRead(int msecs, bool *timedOut)
 {
     Q_D(const QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::waitForRead(), false);
+    Q_CHECK_NOT_STATE(QSymbianSocketEngine::waitForRead(),
+                      QAbstractSocket::UnconnectedState, false);
 
     if (timedOut)
         *timedOut = false;
@@ -1536,6 +1568,9 @@ bool QSymbianSocketEngine::waitForRead(int msecs, bool *timedOut)
 bool QSymbianSocketEngine::waitForWrite(int msecs, bool *timedOut)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::waitForWrite(), false);
+    Q_CHECK_NOT_STATE(QSymbianSocketEngine::waitForWrite(),
+                      QAbstractSocket::UnconnectedState, false);
 
     if (timedOut)
         *timedOut = false;
@@ -1561,6 +1596,9 @@ bool QSymbianSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWr
                                       int msecs, bool *timedOut)
 {
     Q_D(QSymbianSocketEngine);
+    Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::waitForWrite(), false);
+    Q_CHECK_NOT_STATE(QSymbianSocketEngine::waitForReadOrWrite(),
+                      QAbstractSocket::UnconnectedState, false);
 
     int ret = d->nativeSelect(msecs, checkRead, checkWrite, readyToRead, readyToWrite);
 
-- 
cgit v0.12


From d0c0aaf859452349c5cd64cbdba4ebb722c7722f Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 12 Jan 2011 15:21:45 +0000
Subject: Fix for using search paths with a dirty path

Opening "searchpath:/file" and other non clean paths was failing

Reviewed-by: joao
---
 src/corelib/io/qfilesystemengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
index d9d802e..799c109 100644
--- a/src/corelib/io/qfilesystemengine.cpp
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -168,7 +168,7 @@ static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &ent
 
             const QStringList &paths = QDir::searchPaths(filePath.left(prefixSeparator));
             for (int i = 0; i < paths.count(); i++) {
-                entry = QFileSystemEntry(paths.at(i) % QLatin1Char('/') % filePath.mid(prefixSeparator + 1));
+                entry = QFileSystemEntry(QDir::cleanPath(paths.at(i) % QLatin1Char('/') % filePath.mid(prefixSeparator + 1)));
                 // Recurse!
                 if (_q_resolveEntryAndCreateLegacyEngine_recursive(entry, data, engine, true))
                     return true;
-- 
cgit v0.12


From 97512b51ca8addc4fe1f8b5a4f7af14a13d4fd83 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 3 Feb 2011 12:16:35 +0000
Subject: Fix random crashes when bearer suddenly goes down

1. QNetworkSession being deleted from the closed signal caused data
   abort or E32User-CBase 49 panics. (both observed)
2. Potential E32User-CBase 46 panic in
   ConnectionProgressNotifier::StartNotifications()

Reviewed-by: Aaron Tunney
Reviewed-By: Markus Goetz

Task-Number: QTBUG-17196
---
 src/network/access/qnetworkaccessmanager.cpp        | 7 ++++---
 src/network/bearer/qnetworksession.cpp              | 3 +++
 src/network/bearer/qnetworksession.h                | 3 +++
 src/plugins/bearer/symbian/qnetworksession_impl.cpp | 6 +++---
 4 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 7d37375..9c5a035 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1358,10 +1358,11 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
 
     networkSession = QSharedNetworkSessionManager::getSession(config);
 
-    QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
-    QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
+    QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
+    //QueuedConnection is used to avoid deleting the networkSession inside its closed signal
+    QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
     QObject::connect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
-                     q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
+                     q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)), Qt::QueuedConnection);
 
     _q_networkSessionStateChanged(networkSession->state());
 }
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 41a8854..474ac6d 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -250,6 +250,9 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig,
             }
         }
     }
+
+    qRegisterMetaType<QNetworkSession::State>();
+    qRegisterMetaType<QNetworkSession::SessionError>();
 }
 
 /*!
diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
index 717e085..da0c486 100644
--- a/src/network/bearer/qnetworksession.h
+++ b/src/network/bearer/qnetworksession.h
@@ -140,6 +140,9 @@ private:
     QNetworkSessionPrivate *d;
 };
 
+Q_DECLARE_METATYPE(QNetworkSession::State);
+Q_DECLARE_METATYPE(QNetworkSession::SessionError);
+
 #ifndef QT_MOBILITY_BEARER
 QT_END_NAMESPACE
 #else
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 759c86a..bbaf47b 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -1550,8 +1550,8 @@ void ConnectionProgressNotifier::StartNotifications()
 {
     if (!IsActive()) {
         SetActive();
+        iConnection.ProgressNotification(iProgress, iStatus);
     }
-    iConnection.ProgressNotification(iProgress, iStatus);
 }
 
 void ConnectionProgressNotifier::StopNotifications()
@@ -1567,10 +1567,10 @@ void ConnectionProgressNotifier::DoCancel()
 void ConnectionProgressNotifier::RunL()
 {
     if (iStatus == KErrNone) {
-        QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
-    
         SetActive();
         iConnection.ProgressNotification(iProgress, iStatus);
+        // warning, this object may be deleted in the callback - do nothing after handleSymbianConnectionStatusChange
+        QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
     }
 }
 
-- 
cgit v0.12


From cb0150aec0099ecc1569b20b58a75cdf9e5a5177 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 27 Jan 2011 14:57:59 +0000
Subject: add qscopedvaluerollback autotest to corelib.pro

---
 tests/auto/corelib.pro | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/auto/corelib.pro b/tests/auto/corelib.pro
index 3451b53..6810f76 100644
--- a/tests/auto/corelib.pro
+++ b/tests/auto/corelib.pro
@@ -59,6 +59,7 @@ SUBDIRS=\
    qresourceengine \
    qringbuffer \
    qscopedpointer \
+   qscopedvaluerollback \
    qsemaphore \
    qsequentialanimationgroup \
    qset \
-- 
cgit v0.12


From 9d7a1b187a76db52283429e38a0210c1dac82bf5 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 27 Jan 2011 15:02:08 +0000
Subject: Fix GCC compiler warning

---
 src/corelib/tools/qscopedvaluerollback.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h
index d344ed8..e874428 100644
--- a/src/corelib/tools/qscopedvaluerollback.h
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -72,7 +72,7 @@ private:
     T& varRef;
     T oldValue;
 
-    Q_DISABLE_COPY(QScopedValueRollback);
+    Q_DISABLE_COPY(QScopedValueRollback)
 };
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From b9307547c717606e08661cf474eeaf81cc0789e6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 28 Jan 2011 14:52:41 +0100
Subject: Fix for linux build error

---
 tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
index fac5702..956253f 100644
--- a/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
+++ b/tests/auto/qscopedvaluerollback/tst_qscopedvaluerollback.cpp
@@ -200,4 +200,4 @@ void tst_QScopedValueRollback::earlyExitScope_helper(int exitpoint, int& member)
 }
 
 QTEST_MAIN(tst_QScopedValueRollback)
-#include "tst_QScopedValueRollback.moc"
+#include "tst_qscopedvaluerollback.moc"
-- 
cgit v0.12


From bf024acae38226a2430d8c82b0f940781e33a7ef Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 7 Feb 2011 17:39:43 +0000
Subject: rebuild configure.exe

---
 configure.exe | Bin 1326592 -> 1397760 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/configure.exe b/configure.exe
index 293d667..9d450b5 100755
Binary files a/configure.exe and b/configure.exe differ
-- 
cgit v0.12


From b1fa3580515e7f10a9bd06b6a9e7733635f95cab Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Feb 2011 16:05:53 +0000
Subject: Workaround public header depending on private in symbian^3

f32file.h (public) depends on e32svr.h (private), and in symbian^3 the
private headers have been moved to a different include path.

Reviewed-by: axis
---
 mkspecs/features/qt_functions.prf | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index 964e13b..bc1a297 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -46,7 +46,12 @@ defineTest(qtAddLibrary) {
        }
     }
     symbian {
-        isEqual(LIB_NAME, QtGui) {
+        isEqual(LIB_NAME, QtCore) {
+            #workaround for dependency from f32file.h on e32svr.h which has moved location in symbian3
+            contains(SYMBIAN_VERSION, Symbian3) {
+                INCLUDEPATH *= $$OS_LAYER_SYSTEMINCLUDE
+            }
+        } else:isEqual(LIB_NAME, QtGui) {
             # Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
             INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
         } else:isEqual(LIB_NAME, QtWebKit) {
-- 
cgit v0.12


From 049cc0e6717f684453d40f78e9ec0e9093df2c1d Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Tue, 15 Feb 2011 13:50:20 +0100
Subject: Implemented QLocale::firstDayOfWeek()

REMARK: This commit is missing updated static cldr data in
src/corelib/tools/qlocale_data_p.h that has been left out
intentionally to avoid repository bloating.
Before compiling make sure to update that file using the scripts
util/local_database/cldr2qlocalexml.py and
util/local_database/qlocalexml2cpp.py.
Otherwise you will most likely experience segmentation faults.

Reviewed-By: Denis Dzyubenko
---
 src/corelib/tools/qlocale.cpp          | 41 ++++++++++++++++++++++++++++++++++
 src/corelib/tools/qlocale.h            |  5 ++++-
 src/corelib/tools/qlocale_p.h          |  1 +
 util/local_database/cldr2qlocalexml.py | 37 ++++++++++++++++++++++++++++++
 util/local_database/qlocalexml2cpp.py  | 10 +++++++--
 5 files changed, 91 insertions(+), 3 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index fcfa8f0..3f19c27 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -647,6 +647,17 @@ static QString winSystemPMText()
     return QString();
 }
 
+static quint8 winSystemFirstDayOfWeek()
+{
+    LCID id = GetUserDefaultLCID();
+    wchar_t output[4]; // maximum length including  terminating zero character for Win2003+
+
+    if (GetLocaleInfo(id, LOCALE_IFIRSTDAYOFWEEK, output, 4))
+        return QString::fromWCharArray(output).toUInt()+1;
+
+    return 1;
+}
+
 /*!
     \since 4.6
     Returns the fallback locale obtained from the system.
@@ -736,6 +747,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(winSystemAMText());
     case PMText:
         return QVariant(winSystemPMText());
+    case FirstDayOfWeek:
+        return QVariant(winSystemFirstDayOfWeek());
     default:
         break;
     }
@@ -1162,6 +1175,15 @@ static QLocale::MeasurementSystem macMeasurementSystem()
     }
 }
 
+static quint8 macFirstDayOfWeek()
+{
+    QCFType<CFCalendarRef> calendar = CFCalendarCopyCurrent();
+    quint8 day = static_cast<quint8>(CFCalendarGetFirstWeekday(calendar))-1;
+    if (day == 0)
+        day = 7;
+    return day;
+}
+
 static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
 {
     QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
@@ -1243,6 +1265,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case AMText:
     case PMText:
         break;
+    case FirstDayOfWeek:
+        return QVariant(macFirstDayOfWeek());
     default:
         break;
     }
@@ -3449,6 +3473,23 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
 }
 
 /*!
+    \since 4.8
+
+    Returns the first day of the week according to the current locale.
+*/
+Qt::DayOfWeek QLocale::firstDayOfWeek() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
+        if (!res.isNull())
+            return static_cast<Qt::DayOfWeek>(res.toUInt());
+    }
+#endif
+    return static_cast<Qt::DayOfWeek>(d()->m_first_day_of_week);
+}
+
+/*!
     \since 4.4
 
     Returns the measurement system for the locale.
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 6bb9f79..be58faf 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -94,7 +94,8 @@ public:
         MeasurementSystem, // uint
         PositiveSign, // QString
         AMText, // QString
-        PMText // QString
+        PMText, // QString
+        FirstDayOfWeek // Qt::DayOfWeek
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -661,6 +662,8 @@ public:
     QString dayName(int, FormatType format = LongFormat) const;
     QString standaloneDayName(int, FormatType format = LongFormat) const;
 
+    Qt::DayOfWeek firstDayOfWeek() const;
+
     QString amText() const;
     QString pmText() const;
 
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index d310d9b..b2c86d8 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -167,6 +167,7 @@ public:
     quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
     quint16 m_am_idx, m_am_size;
     quint16 m_pm_idx, m_pm_size;
+    quint8  m_first_day_of_week : 3;
 };
 
 inline char QLocalePrivate::digitToCLocale(const QChar &in) const
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index 2567a89..8b5ec16 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -322,6 +322,40 @@ def usage():
     print "Usage: cldr2qlocalexml.py <path-to-cldr-main>"
     sys.exit()
 
+def integrateWeekData(filePath):
+    if not filePath.endswith(".xml"):
+        return {}
+    monFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=mon]", attribute="territories")[0].split(" ")
+    tueFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=tue]", attribute="territories")[0].split(" ")
+    wedFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=wed]", attribute="territories")[0].split(" ")
+    thuFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=thu]", attribute="territories")[0].split(" ")
+    friFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=fri]", attribute="territories")[0].split(" ")
+    satFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=sat]", attribute="territories")[0].split(" ")
+    sunFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=sun]", attribute="territories")[0].split(" ")
+
+    firstDayByCountryCode = {}
+    for countryCode in monFirstDayIn:
+        firstDayByCountryCode[countryCode] = "mon"
+    for countryCode in tueFirstDayIn:
+        firstDayByCountryCode[countryCode] = "tue"
+    for countryCode in wedFirstDayIn:
+        firstDayByCountryCode[countryCode] = "wed"
+    for countryCode in thuFirstDayIn:
+        firstDayByCountryCode[countryCode] = "thu"
+    for countryCode in friFirstDayIn:
+        firstDayByCountryCode[countryCode] = "fri"
+    for countryCode in satFirstDayIn:
+        firstDayByCountryCode[countryCode] = "sat"
+    for countryCode in sunFirstDayIn:
+        firstDayByCountryCode[countryCode] = "sun"
+
+    for (key,locale) in locale_database.iteritems():
+        countryCode = locale['country_code']
+        if countryCode in firstDayByCountryCode:
+            locale_database[key]['firstDayOfWeek'] = firstDayByCountryCode[countryCode]
+        else:
+            locale_database[key]['firstDayOfWeek'] = firstDayByCountryCode["001"]
+
 if len(sys.argv) != 2:
     usage()
 
@@ -341,6 +375,7 @@ for file in cldr_files:
 
     locale_database[(l['language_id'], l['country_id'], l['script_code'], l['variant_code'])] = l
 
+integrateWeekData(cldr_dir+"/../supplemental/supplementalData.xml")
 locale_keys = locale_database.keys()
 locale_keys.sort()
 
@@ -484,6 +519,7 @@ print \
             <exp>101</exp>\n\
             <am>AM</am>\n\
             <pm>PM</pm>\n\
+            <firstDayOfWeek>mon</firstDayOfWeek>\n\
             <longDateFormat>EEEE, d MMMM yyyy</longDateFormat>\n\
             <shortDateFormat>d MMM yyyy</shortDateFormat>\n\
             <longTimeFormat>HH:mm:ss z</longTimeFormat>\n\
@@ -520,6 +556,7 @@ for key in locale_keys:
     print "            <exp>"      + fixOrdStrExp(l['exp'])     + "</exp>"
     print "            <am>"       + l['am'].encode('utf-8') + "</am>"
     print "            <pm>"       + l['pm'].encode('utf-8') + "</pm>"
+    print "            <firstDayOfWeek>"  + l['firstDayOfWeek'].encode('utf-8') + "</firstDayOfWeek>"
     print "            <longDateFormat>"  + l['longDateFormat'].encode('utf-8')  + "</longDateFormat>"
     print "            <shortDateFormat>" + l['shortDateFormat'].encode('utf-8') + "</shortDateFormat>"
     print "            <longTimeFormat>"  + l['longTimeFormat'].encode('utf-8')  + "</longTimeFormat>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 9251e1f..9bc3c7e 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -188,6 +188,10 @@ def convertFormat(format):
 
     return result
 
+def convertToQtDayOfWeek(firstDay):
+    qtDayOfWeek = {"mon":1, "tue":2, "wed":3, "thu":4, "fri":5, "sat":6, "sun":7}
+    return qtDayOfWeek[firstDay]
+
 class Locale:
     def __init__(self, elt):
         self.language = eltText(firstChildElt(elt, "language"))
@@ -202,6 +206,7 @@ class Locale:
         self.exp = int(eltText(firstChildElt(elt, "exp")))
         self.am = eltText(firstChildElt(elt, "am"))
         self.pm = eltText(firstChildElt(elt, "pm"))
+        self.firstDayOfWeek = convertToQtDayOfWeek(eltText(firstChildElt(elt, "firstDayOfWeek")))
         self.longDateFormat = convertFormat(eltText(firstChildElt(elt, "longDateFormat")))
         self.shortDateFormat = convertFormat(eltText(firstChildElt(elt, "shortDateFormat")))
         self.longTimeFormat = convertFormat(eltText(firstChildElt(elt, "longTimeFormat")))
@@ -397,7 +402,7 @@ def main():
     for key in locale_keys:
         l = locale_map[key]
 
-        print "    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s }, // %s/%s" \
+        print "    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%6d }, // %s/%s" \
                     % (key[0], key[1],
                         l.decimal,
                         l.group,
@@ -425,9 +430,10 @@ def main():
                         days_data.append(l.narrowDays),
                         am_data.append(l.am),
                         pm_data.append(l.pm),
+                        l.firstDayOfWeek,
                         l.language,
                         l.country)
-    print "    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0 }  // trailing 0s"
+    print "    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,     0 }  // trailing 0s"
     print "};"
 
     print
-- 
cgit v0.12


From 42adaaa0dffa9df387a145181bc97ee3bb9a4c7b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 16 Feb 2011 13:52:12 +0000
Subject: Fix thread starvation when processEvents() is called in a tight loop

One of the qftp test cases calls processEvents() in a tight loop instead
of using an event loop. This was causing the application to hang on symbian
as it blocked a lower priority system thread and the WLAN connection
never completed.
Although calling processEvents in a tight loop is bad practice, it works
on other OS where thread priorities are dynamic.

Reviewed-by: mread
---
 src/corelib/kernel/qeventdispatcher_symbian.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index b3a3d4d..0b7682c 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -818,6 +818,14 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla
                 CActiveScheduler::Current()->WaitForAnyRequest();
             } else {
                 if (thread.RequestCount() == 0) {
+#ifdef QT_SYMBIAN_PRIORITY_DROP
+                    if (idleDetectorThread()->hasRun()) {
+                        m_lastIdleRequestTimer.start();
+                        idleDetectorThread()->kick();
+                    } else if (m_lastIdleRequestTimer.elapsed() > maxBusyTime) {
+                        User::AfterHighRes(m_delay);
+                    }
+#endif
                     break;
                 }
                 // This one should return without delay.
-- 
cgit v0.12


From 8a74c5112aa81c5638b14d8b5285e6ef8474a195 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 15 Feb 2011 18:50:38 +0100
Subject: Fixed QString creation for certain cases in QLocale

If the data that was requested is missing from CLDR, then we do not need
to try to create QString out of empty data, but return a shared_empty
QString instead.

i.e.

QString::fromRawData(data, 0/*length==0*/) - instead of doing that just
return a default constructed QString.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 3f19c27..5debabb 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1522,12 +1522,14 @@ static QString getLocaleListData(const ushort *data, int size, int index)
     const ushort *end = data;
     while (size > 0 && *end != separator)
         ++end, --size;
+    if (end-data == 0)
+        return QString();
     return QString::fromRawData(reinterpret_cast<const QChar*>(data), end-data);
 }
 
 static inline QString getLocaleData(const ushort *data, int size)
 {
-    return QString::fromRawData(reinterpret_cast<const QChar*>(data), size);
+    return size ? QString::fromRawData(reinterpret_cast<const QChar*>(data), size) : QString();
 }
 
 
-- 
cgit v0.12


From 2f880e66c2dedc8b072dca4672035fc5b2e659bc Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 8 Feb 2011 19:53:55 +0100
Subject: Added currency support for QLocale

REMARK: This commit is missing updated static cldr data in
src/corelib/tools/qlocale_data_p.h that has been left out
intentionally to avoid repository bloating.
Before compiling make sure to update that file using the scripts
util/local_database/cldr2qlocalexml.py and
util/local_database/qlocalexml2cpp.py.
Otherwise you will most likely experience segmentation faults.

Task-number: QTBUG-17100
Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp          | 426 +++++++++++++++++++++++++++++----
 src/corelib/tools/qlocale.h            |  31 ++-
 src/corelib/tools/qlocale_p.h          |  25 +-
 tests/auto/qlocale/tst_qlocale.cpp     |  27 +++
 util/local_database/cldr2qlocalexml.py |  92 ++++++-
 util/local_database/qlocalexml2cpp.py  |  49 +++-
 util/local_database/xpathlite.py       |  42 ++++
 7 files changed, 636 insertions(+), 56 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 5debabb..fea96a7 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -658,6 +658,80 @@ static quint8 winSystemFirstDayOfWeek()
     return 1;
 }
 
+QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
+{
+    LCID lcid = GetUserDefaultLCID();
+    wchar_t buf[13];
+    switch (format) {
+    case QLocale::CurrencySymbol:
+        if (GetLocaleInfo(lcid, LOCALE_SCURRENCY, buf, 13))
+            return QString::fromWCharArray(buf);
+        break;
+    case QLocale::CurrencyIsoCode:
+        if (GetLocaleInfo(lcid, LOCALE_SINTLSYMBOL, buf, 9))
+            return QString::fromWCharArray(buf);
+        break;
+    case QLocale::CurrencyDisplayName: {
+        QVarLengthArray<wchar_t, 64> buf(64);
+        if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size())) {
+            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+                break;
+            buf.resize(255); // should be large enough, right?
+            if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
+                break;
+        }
+        return QString::fromWCharArray(buf.data());
+    }
+    default:
+        break;
+    }
+    return QString();
+}
+
+static QString winFormatCurrency(const QVariant &in)
+{
+    QString value;
+    switch (in.type()) {
+    case QVariant::Int:
+        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
+                                                 in.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::UInt:
+        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
+                                                    in.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::Double:
+        value = QLocalePrivate::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
+                                               QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
+                                               in.toDouble(), -1, QLocalePrivate::DFDecimal, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::LongLong:
+        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
+                                                 in.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::ULongLong:
+        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
+                                                    in.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    default:
+        return QString();
+    }
+
+    QVarLengthArray<wchar_t, 64> out(64);
+    LCID lcid = GetUserDefaultLCID();
+    int ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                                  NULL, out.data(), out.size());
+    if (ret == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+        ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                                  NULL, out.data(), 0);
+        out.resize(ret);
+        ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                            NULL, out.data(), out.size());
+    }
+
+    return QString::fromWCharArray(out.data());
+}
+
 /*!
     \since 4.6
     Returns the fallback locale obtained from the system.
@@ -749,6 +823,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(winSystemPMText());
     case FirstDayOfWeek:
         return QVariant(winSystemFirstDayOfWeek());
+    case CurrencySymbol:
+        return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+    case FormatCurrency:
+        return QVariant(winFormatCurrency(in));
     default:
         break;
     }
@@ -1184,6 +1262,57 @@ static quint8 macFirstDayOfWeek()
     return day;
 }
 
+static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
+{
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    switch (format) {
+    case QLocale::CurrencyIsoCode:
+        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode)));
+    case QLocale::CurrencySymbol:
+        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencySymbol)));
+    case QLocale::CurrencyDisplayName: {
+        CFStringRef code = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode));
+        QCFType<CFStringRef> value = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleCurrencyCode, code);
+        return QCFString::toQString(value);
+    }
+    default:
+        break;
+    }
+    return QString();
+}
+
+static QString macFormatCurrency(const QVariant &in)
+{
+    QCFType<CFNumberRef> value;
+    switch (in.type()) {
+    case QVariant::Int:
+    case QVariant::UInt: {
+        int v = in.toInt();
+        value = CFNumberCreate(NULL, kCFNumberIntType, &v);
+        break;
+    }
+    case QVariant::Double: {
+        double v = in.toInt();
+        value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
+        break;
+    }
+    case QVariant::LongLong:
+    case QVariant::ULongLong: {
+        qint64 v = in.toLongLong();
+        value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
+        break;
+    }
+    default:
+        return QString();
+    }
+
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    QCFType<CFNumberFormatterRef> currencyFormatter =
+            CFNumberFormatterCreate(NULL, locale, kCFNumberFormatterCurrencyStyle);
+    QCFType<CFStringRef> result = CFNumberFormatterCreateStringWithNumber(NULL, currencyFormatter, value);
+    return QCFString::toQString(result);
+}
+
 static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
 {
     QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
@@ -1267,6 +1396,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         break;
     case FirstDayOfWeek:
         return QVariant(macFirstDayOfWeek());
+    case CurrencySymbol:
+        return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+    case FormatCurrency:
+        return macFormatCurrency(in);
     default:
         break;
     }
@@ -1406,6 +1539,8 @@ Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
   \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
   \value AMText a string that represents the system AM designator associated with a 12-hour clock.
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
+  \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
+  \value FormatCurrency a localized string representation of a number with a currency symbol.
 */
 
 /*!
@@ -3638,11 +3773,10 @@ QString QLocale::pmText() const
 */
 
 
-static QString qulltoa(qulonglong l, int base, const QLocalePrivate &locale)
+static QString qulltoa(qulonglong l, int base, const QChar _zero)
 {
     ushort buff[65]; // length of MAX_ULLONG in base 2
     ushort *p = buff + 65;
-    const QChar _zero = locale.zero();
 
     if (base != 10 || _zero.unicode() == '0') {
         while (l != 0) {
@@ -3671,9 +3805,9 @@ static QString qulltoa(qulonglong l, int base, const QLocalePrivate &locale)
     return QString(reinterpret_cast<QChar *>(p), 65 - (p - buff));
 }
 
-static QString qlltoa(qlonglong l, int base, const QLocalePrivate &locale)
+static QString qlltoa(qlonglong l, int base, const QChar zero)
 {
-    return qulltoa(l < 0 ? -l : l, base, locale);
+    return qulltoa(l < 0 ? -l : l, base, zero);
 }
 
 enum PrecisionMode {
@@ -3682,72 +3816,73 @@ enum PrecisionMode {
     PMChopTrailingZeros =   0x03
 };
 
-static QString &decimalForm(QString &digits, int decpt, uint precision,
+static QString &decimalForm(QChar zero, QChar decimal, QChar group,
+                            QString &digits, int decpt, uint precision,
                             PrecisionMode pm,
                             bool always_show_decpt,
-                            bool thousands_group,
-                            const QLocalePrivate &locale)
+                            bool thousands_group)
 {
     if (decpt < 0) {
         for (int i = 0; i < -decpt; ++i)
-            digits.prepend(locale.zero());
+            digits.prepend(zero);
         decpt = 0;
     }
     else if (decpt > digits.length()) {
         for (int i = digits.length(); i < decpt; ++i)
-            digits.append(locale.zero());
+            digits.append(zero);
     }
 
     if (pm == PMDecimalDigits) {
         uint decimal_digits = digits.length() - decpt;
         for (uint i = decimal_digits; i < precision; ++i)
-            digits.append(locale.zero());
+            digits.append(zero);
     }
     else if (pm == PMSignificantDigits) {
         for (uint i = digits.length(); i < precision; ++i)
-            digits.append(locale.zero());
+            digits.append(zero);
     }
     else { // pm == PMChopTrailingZeros
     }
 
     if (always_show_decpt || decpt < digits.length())
-        digits.insert(decpt, locale.decimal());
+        digits.insert(decpt, decimal);
 
     if (thousands_group) {
         for (int i = decpt - 3; i > 0; i -= 3)
-            digits.insert(i, locale.group());
+            digits.insert(i, group);
     }
 
     if (decpt == 0)
-        digits.prepend(locale.zero());
+        digits.prepend(zero);
 
     return digits;
 }
 
-static QString &exponentForm(QString &digits, int decpt, uint precision,
-                                PrecisionMode pm,
-                                bool always_show_decpt,
-                                const QLocalePrivate &locale)
+static QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
+                             QChar group, QChar plus, QChar minus,
+                             QString &digits, int decpt, uint precision,
+                             PrecisionMode pm,
+                             bool always_show_decpt)
 {
     int exp = decpt - 1;
 
     if (pm == PMDecimalDigits) {
         for (uint i = digits.length(); i < precision + 1; ++i)
-            digits.append(locale.zero());
+            digits.append(zero);
     }
     else if (pm == PMSignificantDigits) {
         for (uint i = digits.length(); i < precision; ++i)
-            digits.append(locale.zero());
+            digits.append(zero);
     }
     else { // pm == PMChopTrailingZeros
     }
 
     if (always_show_decpt || digits.length() > 1)
-        digits.insert(1, locale.decimal());
+        digits.insert(1, decimal);
 
-    digits.append(locale.exponential());
-    digits.append(locale.longLongToString(exp, 2, 10,
-                    -1, QLocalePrivate::AlwaysShowSign));
+    digits.append(exponential);
+    digits.append(QLocalePrivate::longLongToString(zero, group, plus, minus,
+                   exp, 2, 10, -1, QLocalePrivate::AlwaysShowSign));
 
     return digits;
 }
@@ -3985,6 +4120,19 @@ QString QLocalePrivate::doubleToString(double d,
                                        int width,
                                        unsigned flags) const
 {
+    return QLocalePrivate::doubleToString(zero(), plus(), minus(), exponential(),
+                                          group(), decimal(),
+                                          d, precision, form, width, flags);
+}
+
+QString QLocalePrivate::doubleToString(const QChar _zero, const QChar plus, const QChar minus,
+                                       const QChar exponential, const QChar group, const QChar decimal,
+                                       double d,
+                                       int precision,
+                                       DoubleForm form,
+                                       int width,
+                                       unsigned flags)
+{
     if (precision == -1)
         precision = 6;
     if (width == -1)
@@ -4062,8 +4210,6 @@ QString QLocalePrivate::doubleToString(double d,
             free(buff);
 #endif // QT_QLOCALE_USES_FCVT
 
-        const QChar _zero = zero();
-
         if (_zero.unicode() != '0') {
             ushort z = _zero.unicode() - '0';
             for (int i = 0; i < digits.length(); ++i)
@@ -4073,14 +4219,15 @@ QString QLocalePrivate::doubleToString(double d,
         bool always_show_decpt = (flags & Alternate || flags & ForcePoint);
         switch (form) {
             case DFExponent: {
-                num_str = exponentForm(digits, decpt, precision, PMDecimalDigits,
-                                                    always_show_decpt, *this);
+                num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+                                       digits, decpt, precision, PMDecimalDigits,
+                                       always_show_decpt);
                 break;
             }
             case DFDecimal: {
-                num_str = decimalForm(digits, decpt, precision, PMDecimalDigits,
-                                        always_show_decpt, flags & ThousandsGroup,
-                                        *this);
+                num_str = decimalForm(_zero, decimal, group,
+                                      digits, decpt, precision, PMDecimalDigits,
+                                      always_show_decpt, flags & ThousandsGroup);
                 break;
             }
             case DFSignificantDigits: {
@@ -4088,12 +4235,13 @@ QString QLocalePrivate::doubleToString(double d,
                             PMSignificantDigits : PMChopTrailingZeros;
 
                 if (decpt != digits.length() && (decpt <= -4 || decpt > precision))
-                    num_str = exponentForm(digits, decpt, precision, mode,
-                                                    always_show_decpt, *this);
+                    num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+                                           digits, decpt, precision, mode,
+                                           always_show_decpt);
                 else
-                    num_str = decimalForm(digits, decpt, precision, mode,
-                                            always_show_decpt, flags & ThousandsGroup,
-                                            *this);
+                    num_str = decimalForm(_zero, decimal, group,
+                                          digits, decpt, precision, mode,
+                                          always_show_decpt, flags & ThousandsGroup);
                 break;
             }
         }
@@ -4114,14 +4262,14 @@ QString QLocalePrivate::doubleToString(double d,
             --num_pad_chars;
 
         for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(zero());
+            num_str.prepend(_zero);
     }
 
     // add sign
     if (negative)
-        num_str.prepend(minus());
+        num_str.prepend(minus);
     else if (flags & QLocalePrivate::AlwaysShowSign)
-        num_str.prepend(plus());
+        num_str.prepend(plus);
     else if (flags & QLocalePrivate::BlankBeforePositive)
         num_str.prepend(QLatin1Char(' '));
 
@@ -4135,6 +4283,16 @@ QString QLocalePrivate::longLongToString(qlonglong l, int precision,
                                             int base, int width,
                                             unsigned flags) const
 {
+    return QLocalePrivate::longLongToString(zero(), group(), plus(), minus(),
+                                            l, precision, base, width, flags);
+}
+
+QString QLocalePrivate::longLongToString(const QChar zero, const QChar group,
+                                         const QChar plus, const QChar minus,
+                                         qlonglong l, int precision,
+                                         int base, int width,
+                                         unsigned flags)
+{
     bool precision_not_specified = false;
     if (precision == -1) {
         precision_not_specified = true;
@@ -4151,20 +4309,20 @@ QString QLocalePrivate::longLongToString(qlonglong l, int precision,
 
     QString num_str;
     if (base == 10)
-        num_str = qlltoa(l, base, *this);
+        num_str = qlltoa(l, base, zero);
     else
-        num_str = qulltoa(l, base, *this);
+        num_str = qulltoa(l, base, zero);
 
     uint cnt_thousand_sep = 0;
     if (flags & ThousandsGroup && base == 10) {
         for (int i = num_str.length() - 3; i > 0; i -= 3) {
-            num_str.insert(i, group());
+            num_str.insert(i, group);
             ++cnt_thousand_sep;
         }
     }
 
     for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
-        num_str.prepend(base == 10 ? zero() : QChar::fromLatin1('0'));
+        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
 
     if ((flags & Alternate || flags & ShowBase)
             && base == 8
@@ -4194,7 +4352,7 @@ QString QLocalePrivate::longLongToString(qlonglong l, int precision,
             num_pad_chars -= 2;
 
         for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(base == 10 ? zero() : QChar::fromLatin1('0'));
+            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
     }
 
     if (flags & CapitalEorX)
@@ -4207,9 +4365,9 @@ QString QLocalePrivate::longLongToString(qlonglong l, int precision,
 
     // add sign
     if (negative)
-        num_str.prepend(minus());
+        num_str.prepend(minus);
     else if (flags & AlwaysShowSign)
-        num_str.prepend(plus());
+        num_str.prepend(plus);
     else if (flags & BlankBeforePositive)
         num_str.prepend(QLatin1Char(' '));
 
@@ -4220,24 +4378,34 @@ QString QLocalePrivate::unsLongLongToString(qulonglong l, int precision,
                                             int base, int width,
                                             unsigned flags) const
 {
+    return QLocalePrivate::unsLongLongToString(zero(), group(), plus(),
+                                               l, precision, base, width, flags);
+}
+
+QString QLocalePrivate::unsLongLongToString(const QChar zero, const QChar group,
+                                            const QChar plus,
+                                            qulonglong l, int precision,
+                                            int base, int width,
+                                            unsigned flags)
+{
     bool precision_not_specified = false;
     if (precision == -1) {
         precision_not_specified = true;
         precision = 1;
     }
 
-    QString num_str = qulltoa(l, base, *this);
+    QString num_str = qulltoa(l, base, zero);
 
     uint cnt_thousand_sep = 0;
     if (flags & ThousandsGroup && base == 10) {
         for (int i = num_str.length() - 3; i > 0; i -=3) {
-            num_str.insert(i, group());
+            num_str.insert(i, group);
             ++cnt_thousand_sep;
         }
     }
 
     for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
-        num_str.prepend(base == 10 ? zero() : QChar::fromLatin1('0'));
+        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
 
     if ((flags & Alternate || flags & ShowBase)
             && base == 8
@@ -4261,7 +4429,7 @@ QString QLocalePrivate::unsLongLongToString(qulonglong l, int precision,
             num_pad_chars -= 2;
 
         for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(base == 10 ? zero() : QChar::fromLatin1('0'));
+            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
     }
 
     if (flags & CapitalEorX)
@@ -4274,7 +4442,7 @@ QString QLocalePrivate::unsLongLongToString(qulonglong l, int precision,
 
     // add sign
     if (flags & AlwaysShowSign)
-        num_str.prepend(plus());
+        num_str.prepend(plus);
     else if (flags & BlankBeforePositive)
         num_str.prepend(QLatin1Char(' '));
 
@@ -4665,6 +4833,162 @@ qulonglong QLocalePrivate::bytearrayToUnsLongLong(const char *num, int base, boo
     return l;
 }
 
+/*!
+    \since 4.8
+
+    \enum QLocale::CurrencyFormat
+
+    Specifies the format of the currency symbol.
+
+    \value CurrencyIsoCode a ISO-4217 code of the currency.
+    \value CurrencySymbol a currency symbol.
+    \value CurrencyDisplayName a user readable name of the currency.
+*/
+
+/*!
+    \since 4.8
+    Returns a currency symbol according to the \a format.
+*/
+QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    quint32 idx, size;
+    switch (format) {
+    case CurrencySymbol:
+        idx = d()->m_currency_symbol_idx;
+        size = d()->m_currency_symbol_size;
+        return getLocaleData(currency_symbol_data + idx, size);
+    case CurrencyDisplayName:
+        idx = d()->m_currency_display_name_idx;
+        size = d()->m_currency_display_name_size;
+        return getLocaleListData(currency_display_name_data + idx, size, 0);
+    case CurrencyIsoCode: {
+        int len = 0;
+        const QLocalePrivate *d = this->d();
+        for (; len < 3; ++len)
+            if (!d->m_currency_iso_code[len])
+                break;
+        return len ? QString::fromLatin1(d->m_currency_iso_code, len) : QString();
+    }
+    }
+    return QString();
+}
+
+/*!
+    \fn QString QLocale::toCurrencyString(short) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(ushort) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(int) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(uint) const
+    \since 4.8
+    \overload
+*/
+/*!
+    \fn QString QLocale::toCurrencyString(float) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \since 4.8
+
+    Returns a localized string representation of \a value as a currency.
+*/
+QString QLocale::toCurrencyString(qlonglong value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    if (d->m_currency_negative_format_size && value < 0) {
+        idx = d->m_currency_negative_format_idx;
+        size = d->m_currency_negative_format_size;
+        value = -value;
+    }
+    QString str = d->longLongToString(value);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
+}
+
+/*!
+    \since 4.8
+    \overload
+*/
+QString QLocale::toCurrencyString(qulonglong value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    QString str = d->unsLongLongToString(value);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
+}
+
+QString QLocale::toCurrencyString(double value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    if (d->m_currency_negative_format_size && value < 0) {
+        idx = d->m_currency_negative_format_idx;
+        size = d->m_currency_negative_format_size;
+        value = -value;
+    }
+    QString str = d->doubleToString(value, d->m_currency_digits,
+                                    QLocalePrivate::DFDecimal);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
+}
+
 /*-
  * Copyright (c) 1992, 1993
  *        The Regents of the University of California.  All rights reserved.
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index be58faf..af545f7 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -95,7 +95,9 @@ public:
         PositiveSign, // QString
         AMText, // QString
         PMText, // QString
-        FirstDayOfWeek // Qt::DayOfWeek
+        FirstDayOfWeek, // Qt::DayOfWeek
+        CurrencySymbol, // QString in: format
+        FormatCurrency // QString in: qlonglong, qulonglong or double
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -600,6 +602,12 @@ public:
     };
     Q_DECLARE_FLAGS(NumberOptions, NumberOption)
 
+    enum CurrencySymbolFormat {
+        CurrencyIsoCode,
+        CurrencySymbol,
+        CurrencyDisplayName
+    };
+
     QLocale();
     QLocale(const QString &name);
     QLocale(Language language, Country country = AnyCountry);
@@ -671,6 +679,16 @@ public:
 
     Qt::LayoutDirection textDirection() const;
 
+    QString currencySymbol(CurrencySymbolFormat = CurrencySymbol) const;
+    QString toCurrencyString(qlonglong) const;
+    QString toCurrencyString(qulonglong) const;
+    inline QString toCurrencyString(short) const;
+    inline QString toCurrencyString(ushort) const;
+    inline QString toCurrencyString(int) const;
+    inline QString toCurrencyString(uint) const;
+    QString toCurrencyString(double) const;
+    inline QString toCurrencyString(float) const;
+
     inline bool operator==(const QLocale &other) const;
     inline bool operator!=(const QLocale &other) const;
 
@@ -719,6 +737,17 @@ inline bool QLocale::operator==(const QLocale &other) const
 inline bool QLocale::operator!=(const QLocale &other) const
     { return d() != other.d() || numberOptions() != other.numberOptions(); }
 
+inline QString QLocale::toCurrencyString(short i) const
+    { return toCurrencyString(qlonglong(i)); }
+inline QString QLocale::toCurrencyString(ushort i) const
+    { return toCurrencyString(qulonglong(i)); }
+inline QString QLocale::toCurrencyString(int i) const
+{ return toCurrencyString(qlonglong(i)); }
+inline QString QLocale::toCurrencyString(uint i) const
+{ return toCurrencyString(qulonglong(i)); }
+inline QString QLocale::toCurrencyString(float i) const
+{ return toCurrencyString(double(i)); }
+
 #ifndef QT_NO_DATASTREAM
 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLocale &);
 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLocale &);
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index b2c86d8..283f722 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -108,6 +108,22 @@ public:
         ParseGroupSeparators
     };
 
+    static QString doubleToString(const QChar zero, const QChar plus,
+                                  const QChar minus, const QChar exponent,
+                                  const QChar group, const QChar decimal,
+                                  double d, int precision,
+                                  DoubleForm form,
+                                  int width, unsigned flags);
+    static QString longLongToString(const QChar zero, const QChar group,
+                                    const QChar plus, const QChar minus,
+                                    qint64 l, int precision, int base,
+                                    int width, unsigned flags);
+    static QString unsLongLongToString(const QChar zero, const QChar group,
+                                       const QChar plus,
+                                       quint64 l, int precision,
+                                       int base, int width,
+                                       unsigned flags);
+
     QString doubleToString(double d,
                            int precision = -1,
                            DoubleForm form = DFSignificantDigits,
@@ -167,7 +183,14 @@ public:
     quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
     quint16 m_am_idx, m_am_size;
     quint16 m_pm_idx, m_pm_size;
-    quint8  m_first_day_of_week : 3;
+    char m_currency_iso_code[3];
+    quint16 m_currency_symbol_idx, m_currency_symbol_size;
+    quint16 m_currency_display_name_idx, m_currency_display_name_size;
+    quint8 m_currency_format_idx, m_currency_format_size;
+    quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
+    quint16 m_currency_digits : 2;
+    quint16 m_currency_rounding : 3;
+    quint16 m_first_day_of_week : 3;
 };
 
 inline char QLocalePrivate::digitToCLocale(const QChar &in) const
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 16846de..08c96a0 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -140,6 +140,7 @@ private slots:
 #endif
 
     void ampm();
+    void currency();
 
 private:
     QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
@@ -1095,6 +1096,11 @@ void tst_QLocale::macDefaultLocale()
 	const QString timeString = locale.toString(QTime(1,2,3), QLocale::LongFormat);
     QVERIFY(timeString.contains(QString("1:02:03")));
 
+    QCOMPARE(locale.toCurrencyString(qulonglong(1234)), QString("$1,234"));
+    QCOMPARE(locale.toCurrencyString(qlonglong(-1234)), QString("$-1,234"));
+    QCOMPARE(locale.toCurrencyString(double(1234.56)), QString("$1,234.56"));
+    QCOMPARE(locale.toCurrencyString(double(-1234.56)), QString("$-1,234.56"));
+
     // Depending on the configured time zone, the time string might not
     // contain a GMT specifier. (Sometimes it just names the zone, like "CEST")
     if (timeString.contains(QString("GMT"))) {
@@ -2123,5 +2129,26 @@ void tst_QLocale::symbianSystemLocale()
 }
 #endif
 
+void tst_QLocale::currency()
+{
+    const QLocale c(QLocale::C);
+    QCOMPARE(c.toCurrencyString(qulonglong(1234)), QString("1234"));
+    QCOMPARE(c.toCurrencyString(qlonglong(-1234)), QString("-1234"));
+    QCOMPARE(c.toCurrencyString(double(1234.56)), QString("1234.56"));
+    QCOMPARE(c.toCurrencyString(double(-1234.56)), QString("-1234.56"));
+
+    const QLocale ru_RU("ru_RU");
+    QCOMPARE(ru_RU.toCurrencyString(qulonglong(1234)), QString::fromUtf8("1234\xc2\xa0\xd1\x80\xd1\x83\xd0\xb1."));
+    QCOMPARE(ru_RU.toCurrencyString(qlonglong(-1234)), QString::fromUtf8("-1234\xc2\xa0\xd1\x80\xd1\x83\xd0\xb1."));
+    QCOMPARE(ru_RU.toCurrencyString(double(1234.56)), QString::fromUtf8("1234,56\xc2\xa0\xd1\x80\xd1\x83\xd0\xb1."));
+    QCOMPARE(ru_RU.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56\xc2\xa0\xd1\x80\xd1\x83\xd0\xb1."));
+
+    const QLocale de_DE("de_DE");
+    QCOMPARE(de_DE.toCurrencyString(qulonglong(1234)), QString::fromUtf8("1234""\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(qlonglong(-1234)), QString::fromUtf8("-1234""\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(double(1234.56)), QString::fromUtf8("1234,56""\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56""\xc2\xa0\xe2\x82\xac"));
+}
+
 QTEST_APPLESS_MAIN(tst_QLocale)
 #include "tst_qlocale.moc"
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index 8b5ec16..311cf4e 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -50,6 +50,37 @@ import re
 
 findEntry = xpathlite.findEntry
 findEntryInFile = xpathlite._findEntryInFile
+findTagsInFile = xpathlite.findTagsInFile
+
+def parse_number_format(patterns, data):
+    # this is a very limited parsing of the number format for currency only.
+    def skip_repeating_pattern(x):
+        p = x.replace('0', '#').replace(',', '').replace('.', '')
+        seen = False
+        result = ''
+        for c in p:
+            if c == '#':
+                if seen:
+                    continue
+                seen = True
+            else:
+                seen = False
+            result = result + c
+        return result
+    patterns = patterns.split(';')
+    result = []
+    for pattern in patterns:
+        pattern = skip_repeating_pattern(pattern)
+        pattern = pattern.replace('#', "%1")
+        # according to http://www.unicode.org/reports/tr35/#Number_Format_Patterns
+        # there can be doubled or trippled currency sign, however none of the
+        # locales use that.
+        pattern = pattern.replace(u'\xa4', "%2")
+        pattern = pattern.replace("''", "###").replace("'", '').replace("###", "'")
+        pattern = pattern.replace('-', data['minus'])
+        pattern = pattern.replace('+', data['plus'])
+        result.append(pattern)
+    return result
 
 def ordStr(c):
     if len(c) == 1:
@@ -123,11 +154,36 @@ def generateLocaleInfo(path):
     result['language_id'] = language_id
     result['country_id'] = country_id
 
+    supplementalPath = dir_name + "/../supplemental/supplementalData.xml"
+    currencies = findTagsInFile(supplementalPath, "currencyData/region[iso3166=%s]"%country_code);
+    result['currencyIsoCode'] = ''
+    result['currencyDigits'] = 2
+    result['currencyRounding'] = 1
+    if currencies:
+        for e in currencies:
+            if e[0] == 'currency':
+                tender = True
+                t = filter(lambda x: x[0] == 'tender', e[1])
+                if t and t[0][1] == 'false':
+                    tender = False;
+                if tender and not filter(lambda x: x[0] == 'to', e[1]):
+                    result['currencyIsoCode'] = filter(lambda x: x[0] == 'iso4217', e[1])[0][1]
+                    break
+        if result['currencyIsoCode']:
+            t = findTagsInFile(supplementalPath, "currencyData/fractions/info[iso4217=%s]"%result['currencyIsoCode']);
+            if t and t[0][0] == 'info':
+                result['currencyDigits'] = int(filter(lambda x: x[0] == 'digits', t[0][1])[0][1])
+                result['currencyRounding'] = int(filter(lambda x: x[0] == 'rounding', t[0][1])[0][1])
     numbering_system = None
     try:
         numbering_system = findEntry(path, "numbers/defaultNumberingSystem")
     except:
         pass
+    def findEntryDef(path, xpath, value=''):
+        try:
+            return findEntry(path, xpath)
+        except xpathlite.Error:
+            return value
     def get_number_in_system(path, xpath, numbering_system):
         if numbering_system:
             try:
@@ -150,6 +206,27 @@ def generateLocaleInfo(path):
     result['longTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[full]/timeFormat/pattern"))
     result['shortTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[short]/timeFormat/pattern"))
 
+    currency_format = get_number_in_system(path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system)
+    currency_format = parse_number_format(currency_format, result)
+    result['currencyFormat'] = currency_format[0]
+    result['currencyNegativeFormat'] = ''
+    if len(currency_format) > 1:
+        result['currencyNegativeFormat'] = currency_format[1]
+
+    result['currencySymbol'] = ''
+    result['currencyDisplayName'] = ''
+    if result['currencyIsoCode']:
+        result['currencySymbol'] = findEntryDef(path, "numbers/currencies/currency[%s]/symbol" % result['currencyIsoCode'])
+        display_name_path = "numbers/currencies/currency[%s]/displayName" % result['currencyIsoCode']
+        result['currencyDisplayName'] \
+            = findEntryDef(path, display_name_path) + ";" \
+            + findEntryDef(path, display_name_path + "[count=zero]")  + ";" \
+            + findEntryDef(path, display_name_path + "[count=one]")   + ";" \
+            + findEntryDef(path, display_name_path + "[count=two]")   + ";" \
+            + findEntryDef(path, display_name_path + "[count=few]")   + ";" \
+            + findEntryDef(path, display_name_path + "[count=many]")  + ";" \
+            + findEntryDef(path, display_name_path + "[count=other]") + ";"
+
     standalone_long_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[wide]/month"
     result['standaloneLongMonths'] \
         = findEntry(path, standalone_long_month_path + "[1]") + ";" \
@@ -300,7 +377,6 @@ def generateLocaleInfo(path):
         + findEntry(path, standalone_narrow_day_path + "[fri]") + ";" \
         + findEntry(path, standalone_narrow_day_path + "[sat]") + ";"
 
-
     return result
 
 def addEscapes(s):
@@ -536,6 +612,13 @@ print \
             <standaloneLongDays>Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;</standaloneLongDays>\n\
             <standaloneShortDays>Sun;Mon;Tue;Wed;Thu;Fri;Sat;</standaloneShortDays>\n\
             <standaloneNarrowDays>S;M;T;W;T;F;S;</standaloneNarrowDays>\n\
+            <currencyIsoCode></currencyIsoCode>\n\
+            <currencySymbol></currencySymbol>\n\
+            <currencyDisplayName>;;;;;;;</currencyDisplayName>\n\
+            <currencyDigits>2</currencyDigits>\n\
+            <currencyRounding>1</currencyRounding>\n\
+            <currencyFormat>%1%2</currencyFormat>\n\
+            <currencyNegativeFormat></currencyNegativeFormat>\n\
         </locale>"
 
 for key in locale_keys:
@@ -573,6 +656,13 @@ for key in locale_keys:
     print "            <standaloneLongDays>" + l['standaloneLongDays'].encode('utf-8')        + "</standaloneLongDays>"
     print "            <standaloneShortDays>" + l['standaloneShortDays'].encode('utf-8')       + "</standaloneShortDays>"
     print "            <standaloneNarrowDays>" + l['standaloneNarrowDays'].encode('utf-8')       + "</standaloneNarrowDays>"
+    print "            <currencyIsoCode>" + l['currencyIsoCode'].encode('utf-8') + "</currencyIsoCode>"
+    print "            <currencySymbol>" + l['currencySymbol'].encode('utf-8') + "</currencySymbol>"
+    print "            <currencyDisplayName>" + l['currencyDisplayName'].encode('utf-8') + "</currencyDisplayName>"
+    print "            <currencyDigits>" + str(l['currencyDigits']) + "</currencyDigits>"
+    print "            <currencyRounding>" + str(l['currencyRounding']) + "</currencyRounding>"
+    print "            <currencyFormat>" + l['currencyFormat'].encode('utf-8') + "</currencyFormat>"
+    print "            <currencyNegativeFormat>" + l['currencyNegativeFormat'].encode('utf-8') + "</currencyNegativeFormat>"
     print "        </locale>"
 print "    </localeList>"
 print "</localeDatabase>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 9bc3c7e..494daf2 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -223,6 +223,13 @@ class Locale:
         self.longDays = eltText(firstChildElt(elt, "longDays"))
         self.shortDays = eltText(firstChildElt(elt, "shortDays"))
         self.narrowDays = eltText(firstChildElt(elt, "narrowDays"))
+        self.currencyIsoCode = eltText(firstChildElt(elt, "currencyIsoCode"))
+        self.currencySymbol = eltText(firstChildElt(elt, "currencySymbol"))
+        self.currencyDisplayName = eltText(firstChildElt(elt, "currencyDisplayName"))
+        self.currencyDigits = int(eltText(firstChildElt(elt, "currencyDigits")))
+        self.currencyRounding = int(eltText(firstChildElt(elt, "currencyRounding")))
+        self.currencyFormat = eltText(firstChildElt(elt, "currencyFormat"))
+        self.currencyNegativeFormat = eltText(firstChildElt(elt, "currencyNegativeFormat"))
 
 def loadLocaleMap(doc, language_map, country_map):
     result = {}
@@ -336,6 +343,11 @@ def printEscapedString(s):
     print escapedString(s);
 
 
+def currencyIsoCodeData(s):
+    if s:
+        return ",".join(map(lambda x: str(ord(x)), s))
+    return "0,0,0"
+
 def main():
     doc = xml.dom.minidom.parse("locale.xml")
     language_map = loadLanguageMap(doc)
@@ -389,6 +401,9 @@ def main():
     days_data = StringData()
     am_data = StringData()
     pm_data = StringData()
+    currency_symbol_data = StringData()
+    currency_display_name_data = StringData()
+    currency_format_data = StringData()
 
     # Locale data
     print "static const QLocalePrivate locale_data[] = {"
@@ -402,7 +417,7 @@ def main():
     for key in locale_keys:
         l = locale_map[key]
 
-        print "    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%6d }, // %s/%s" \
+        print "    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s" \
                     % (key[0], key[1],
                         l.decimal,
                         l.group,
@@ -430,10 +445,17 @@ def main():
                         days_data.append(l.narrowDays),
                         am_data.append(l.am),
                         pm_data.append(l.pm),
+                        currencyIsoCodeData(l.currencyIsoCode),
+                        currency_symbol_data.append(l.currencySymbol),
+                        currency_display_name_data.append(l.currencyDisplayName),
+                        currency_format_data.append(l.currencyFormat),
+                        currency_format_data.append(l.currencyNegativeFormat),
+                        l.currencyDigits,
+                        l.currencyRounding,
                         l.firstDayOfWeek,
                         l.language,
                         l.country)
-    print "    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,     0 }  // trailing 0s"
+    print "    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s"
     print "};"
 
     print
@@ -494,6 +516,29 @@ def main():
 
     print
 
+    # Currency symbol data
+    #check_static_char_array_length("currency_symbol", currency_symbol_data.data)
+    print "static const ushort currency_symbol_data[] = {"
+    print wrap_list(currency_symbol_data.data)
+    print "};"
+
+    print
+
+    # Currency display name data
+    #check_static_char_array_length("currency_display_name", currency_display_name_data.data)
+    print "static const ushort currency_display_name_data[] = {"
+    print wrap_list(currency_display_name_data.data)
+    print "};"
+
+    print
+
+    # Currency format data
+    #check_static_char_array_length("currency_format", currency_format_data.data)
+    print "static const ushort currency_format_data[] = {"
+    print wrap_list(currency_format_data.data)
+    print "};"
+
+    print
     # Language name list
     print "static const char language_name_list[] ="
     print "\"Default\\0\""
diff --git a/util/local_database/xpathlite.py b/util/local_database/xpathlite.py
index 95e6711..502d85d 100644
--- a/util/local_database/xpathlite.py
+++ b/util/local_database/xpathlite.py
@@ -87,6 +87,48 @@ def findChild(parent, tag_name, arg_name=None, arg_value=None, draft=None):
         return node
     return False
 
+def findTagsInFile(file, path):
+    doc = False
+    if doc_cache.has_key(file):
+        doc = doc_cache[file]
+    else:
+        doc = xml.dom.minidom.parse(file)
+        doc_cache[file] = doc
+
+    elt = doc.documentElement
+    tag_spec_list = path.split("/")
+    last_entry = None
+    for i in range(len(tag_spec_list)):
+        tag_spec = tag_spec_list[i]
+        tag_name = tag_spec
+        arg_name = 'type'
+        arg_value = ''
+        left_bracket = tag_spec.find('[')
+        if left_bracket != -1:
+            tag_name = tag_spec[:left_bracket]
+            arg_value = tag_spec[left_bracket+1:-1].split("=")
+            if len(arg_value) == 2:
+                arg_name = arg_value[0]
+                arg_value = arg_value[1]
+            else:
+                arg_value = arg_value[0]
+        elt = findChild(elt, tag_name, arg_name, arg_value)
+        if not elt:
+            return None
+    ret = []
+    if elt.childNodes:
+        for node in elt.childNodes:
+            if node.attributes:
+                element = [node.nodeName, None]
+                element[1] = node.attributes.items()
+                ret.append(element)
+    else:
+        if elt.attributes:
+            element = [elt.nodeName, None]
+            element[1] = elt.attributes.items()
+            ret.append(element)
+    return ret
+
 def _findEntryInFile(file, path, draft=None, attribute=None):
     doc = False
     if doc_cache.has_key(file):
-- 
cgit v0.12


From 65a265b9aee415877c6653b38bed1a3ee791fdb4 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 16 Feb 2011 10:45:51 +0100
Subject: Added a manual test for qlocale

Reviewed-by: Zeno Albisser
---
 tests/manual/qlocale/calendar.cpp | 395 ++++++++++++++++++++++++++++++++++++++
 tests/manual/qlocale/calendar.h   | 113 +++++++++++
 tests/manual/qlocale/currency.cpp | 102 ++++++++++
 tests/manual/qlocale/currency.h   |  71 +++++++
 tests/manual/qlocale/main.cpp     |  53 +++++
 tests/manual/qlocale/qlocale.pro  |   8 +
 tests/manual/qlocale/window.cpp   | 116 +++++++++++
 tests/manual/qlocale/window.h     |  72 +++++++
 8 files changed, 930 insertions(+)
 create mode 100644 tests/manual/qlocale/calendar.cpp
 create mode 100644 tests/manual/qlocale/calendar.h
 create mode 100644 tests/manual/qlocale/currency.cpp
 create mode 100644 tests/manual/qlocale/currency.h
 create mode 100644 tests/manual/qlocale/main.cpp
 create mode 100644 tests/manual/qlocale/qlocale.pro
 create mode 100644 tests/manual/qlocale/window.cpp
 create mode 100644 tests/manual/qlocale/window.h

diff --git a/tests/manual/qlocale/calendar.cpp b/tests/manual/qlocale/calendar.cpp
new file mode 100644
index 0000000..8c8eca9
--- /dev/null
+++ b/tests/manual/qlocale/calendar.cpp
@@ -0,0 +1,395 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "calendar.h"
+
+CalendarWidget::CalendarWidget()
+{
+    createPreviewGroupBox();
+    createGeneralOptionsGroupBox();
+    createDatesGroupBox();
+    createTextFormatsGroupBox();
+
+    QGridLayout *layout = new QGridLayout;
+    layout->addWidget(previewGroupBox, 0, 0);
+    layout->addWidget(generalOptionsGroupBox, 0, 1);
+    layout->addWidget(datesGroupBox, 1, 0);
+    layout->addWidget(textFormatsGroupBox, 1, 1);
+    layout->setSizeConstraint(QLayout::SetFixedSize);
+    setLayout(layout);
+
+    previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height());
+    previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width());
+
+    setWindowTitle(tr("Calendar Widget"));
+}
+
+void CalendarWidget::localeChanged(QLocale locale)
+{
+    calendar->setLocale(locale);
+}
+
+void CalendarWidget::firstDayChanged(int index)
+{
+    calendar->setFirstDayOfWeek(Qt::DayOfWeek(
+                                firstDayCombo->itemData(index).toInt()));
+}
+
+void CalendarWidget::selectionModeChanged(int index)
+{
+    calendar->setSelectionMode(QCalendarWidget::SelectionMode(
+                               selectionModeCombo->itemData(index).toInt()));
+}
+
+void CalendarWidget::horizontalHeaderChanged(int index)
+{
+    calendar->setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat(
+        horizontalHeaderCombo->itemData(index).toInt()));
+}
+
+void CalendarWidget::verticalHeaderChanged(int index)
+{
+    calendar->setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat(
+        verticalHeaderCombo->itemData(index).toInt()));
+}
+
+void CalendarWidget::selectedDateChanged()
+{
+    currentDateEdit->setDate(calendar->selectedDate());
+}
+
+void CalendarWidget::minimumDateChanged(const QDate &date)
+{
+    calendar->setMinimumDate(date);
+    maximumDateEdit->setDate(calendar->maximumDate());
+}
+
+void CalendarWidget::maximumDateChanged(const QDate &date)
+{
+    calendar->setMaximumDate(date);
+    minimumDateEdit->setDate(calendar->minimumDate());
+}
+
+void CalendarWidget::weekdayFormatChanged()
+{
+    QTextCharFormat format;
+
+    format.setForeground(qvariant_cast<QColor>(
+        weekdayColorCombo->itemData(weekdayColorCombo->currentIndex())));
+    calendar->setWeekdayTextFormat(Qt::Monday, format);
+    calendar->setWeekdayTextFormat(Qt::Tuesday, format);
+    calendar->setWeekdayTextFormat(Qt::Wednesday, format);
+    calendar->setWeekdayTextFormat(Qt::Thursday, format);
+    calendar->setWeekdayTextFormat(Qt::Friday, format);
+}
+
+void CalendarWidget::weekendFormatChanged()
+{
+    QTextCharFormat format;
+
+    format.setForeground(qvariant_cast<QColor>(
+        weekendColorCombo->itemData(weekendColorCombo->currentIndex())));
+    calendar->setWeekdayTextFormat(Qt::Saturday, format);
+    calendar->setWeekdayTextFormat(Qt::Sunday, format);
+}
+
+void CalendarWidget::reformatHeaders()
+{
+    QString text = headerTextFormatCombo->currentText();
+    QTextCharFormat format;
+
+    if (text == tr("Bold")) {
+        format.setFontWeight(QFont::Bold);
+    } else if (text == tr("Italic")) {
+        format.setFontItalic(true);
+    } else if (text == tr("Green")) {
+        format.setForeground(Qt::green);
+    }
+    calendar->setHeaderTextFormat(format);
+}
+
+void CalendarWidget::reformatCalendarPage()
+{
+    if (firstFridayCheckBox->isChecked()) {
+        QDate firstFriday(calendar->yearShown(), calendar->monthShown(), 1);
+        while (firstFriday.dayOfWeek() != Qt::Friday)
+            firstFriday = firstFriday.addDays(1);
+        QTextCharFormat firstFridayFormat;
+        firstFridayFormat.setForeground(Qt::blue);
+        calendar->setDateTextFormat(firstFriday, firstFridayFormat);
+    }
+
+    //May First in Red takes precedence
+    if (mayFirstCheckBox->isChecked()) {
+        const QDate mayFirst(calendar->yearShown(), 5, 1);
+        QTextCharFormat mayFirstFormat;
+        mayFirstFormat.setForeground(Qt::red);
+        calendar->setDateTextFormat(mayFirst, mayFirstFormat);
+    }
+}
+
+void CalendarWidget::createPreviewGroupBox()
+{
+    previewGroupBox = new QGroupBox(tr("Preview"));
+
+    calendar = new QCalendarWidget;
+    calendar->setMinimumDate(QDate(1900, 1, 1));
+    calendar->setMaximumDate(QDate(3000, 1, 1));
+    calendar->setGridVisible(true);
+
+    connect(calendar, SIGNAL(currentPageChanged(int,int)),
+            this, SLOT(reformatCalendarPage()));
+
+    previewLayout = new QGridLayout;
+    previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
+    previewGroupBox->setLayout(previewLayout);
+}
+
+void CalendarWidget::createGeneralOptionsGroupBox()
+{
+    generalOptionsGroupBox = new QGroupBox(tr("General Options"));
+
+    firstDayCombo = new QComboBox;
+    firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
+    firstDayCombo->addItem(tr("Monday"), Qt::Monday);
+    firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);
+    firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);
+    firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);
+    firstDayCombo->addItem(tr("Friday"), Qt::Friday);
+    firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);
+
+    firstDayLabel = new QLabel(tr("Wee&k starts on:"));
+    firstDayLabel->setBuddy(firstDayCombo);
+
+    selectionModeCombo = new QComboBox;
+    selectionModeCombo->addItem(tr("Single selection"),
+                                QCalendarWidget::SingleSelection);
+    selectionModeCombo->addItem(tr("None"), QCalendarWidget::NoSelection);
+
+    selectionModeLabel = new QLabel(tr("&Selection mode:"));
+    selectionModeLabel->setBuddy(selectionModeCombo);
+
+    gridCheckBox = new QCheckBox(tr("&Grid"));
+    gridCheckBox->setChecked(calendar->isGridVisible());
+
+    navigationCheckBox = new QCheckBox(tr("&Navigation bar"));
+    navigationCheckBox->setChecked(true);
+
+    horizontalHeaderCombo = new QComboBox;
+    horizontalHeaderCombo->addItem(tr("Single letter day names"),
+                                   QCalendarWidget::SingleLetterDayNames);
+    horizontalHeaderCombo->addItem(tr("Short day names"),
+                                   QCalendarWidget::ShortDayNames);
+    horizontalHeaderCombo->addItem(tr("None"),
+                                   QCalendarWidget::NoHorizontalHeader);
+    horizontalHeaderCombo->setCurrentIndex(1);
+
+    horizontalHeaderLabel = new QLabel(tr("&Horizontal header:"));
+    horizontalHeaderLabel->setBuddy(horizontalHeaderCombo);
+
+    verticalHeaderCombo = new QComboBox;
+    verticalHeaderCombo->addItem(tr("ISO week numbers"),
+                                 QCalendarWidget::ISOWeekNumbers);
+    verticalHeaderCombo->addItem(tr("None"), QCalendarWidget::NoVerticalHeader);
+
+    verticalHeaderLabel = new QLabel(tr("&Vertical header:"));
+    verticalHeaderLabel->setBuddy(verticalHeaderCombo);
+
+    connect(firstDayCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(firstDayChanged(int)));
+    connect(selectionModeCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(selectionModeChanged(int)));
+    connect(gridCheckBox, SIGNAL(toggled(bool)),
+            calendar, SLOT(setGridVisible(bool)));
+    connect(navigationCheckBox, SIGNAL(toggled(bool)),
+            calendar, SLOT(setNavigationBarVisible(bool)));
+    connect(horizontalHeaderCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(horizontalHeaderChanged(int)));
+    connect(verticalHeaderCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(verticalHeaderChanged(int)));
+
+    QHBoxLayout *checkBoxLayout = new QHBoxLayout;
+    checkBoxLayout->addWidget(gridCheckBox);
+    checkBoxLayout->addStretch();
+    checkBoxLayout->addWidget(navigationCheckBox);
+
+    QGridLayout *outerLayout = new QGridLayout;
+    outerLayout->addWidget(firstDayLabel, 0, 0);
+    outerLayout->addWidget(firstDayCombo, 0, 1);
+    outerLayout->addWidget(selectionModeLabel, 1, 0);
+    outerLayout->addWidget(selectionModeCombo, 1, 1);
+    outerLayout->addLayout(checkBoxLayout, 2, 0, 1, 2);
+    outerLayout->addWidget(horizontalHeaderLabel, 3, 0);
+    outerLayout->addWidget(horizontalHeaderCombo, 3, 1);
+    outerLayout->addWidget(verticalHeaderLabel, 4, 0);
+    outerLayout->addWidget(verticalHeaderCombo, 4, 1);
+    generalOptionsGroupBox->setLayout(outerLayout);
+
+    firstDayChanged(firstDayCombo->currentIndex());
+    selectionModeChanged(selectionModeCombo->currentIndex());
+    horizontalHeaderChanged(horizontalHeaderCombo->currentIndex());
+    verticalHeaderChanged(verticalHeaderCombo->currentIndex());
+}
+
+void CalendarWidget::createDatesGroupBox()
+{
+    datesGroupBox = new QGroupBox(tr("Dates"));
+
+    minimumDateEdit = new QDateEdit;
+    minimumDateEdit->setDisplayFormat("MMM d yyyy");
+    minimumDateEdit->setDateRange(calendar->minimumDate(),
+                                  calendar->maximumDate());
+    minimumDateEdit->setDate(calendar->minimumDate());
+
+    minimumDateLabel = new QLabel(tr("&Minimum Date:"));
+    minimumDateLabel->setBuddy(minimumDateEdit);
+
+    currentDateEdit = new QDateEdit;
+    currentDateEdit->setDisplayFormat("MMM d yyyy");
+    currentDateEdit->setDate(calendar->selectedDate());
+    currentDateEdit->setDateRange(calendar->minimumDate(),
+                                  calendar->maximumDate());
+
+    currentDateLabel = new QLabel(tr("&Current Date:"));
+    currentDateLabel->setBuddy(currentDateEdit);
+
+    maximumDateEdit = new QDateEdit;
+    maximumDateEdit->setDisplayFormat("MMM d yyyy");
+    maximumDateEdit->setDateRange(calendar->minimumDate(),
+                                  calendar->maximumDate());
+    maximumDateEdit->setDate(calendar->maximumDate());
+
+    maximumDateLabel = new QLabel(tr("Ma&ximum Date:"));
+    maximumDateLabel->setBuddy(maximumDateEdit);
+
+    connect(currentDateEdit, SIGNAL(dateChanged(QDate)),
+            calendar, SLOT(setSelectedDate(QDate)));
+    connect(calendar, SIGNAL(selectionChanged()),
+            this, SLOT(selectedDateChanged()));
+    connect(minimumDateEdit, SIGNAL(dateChanged(QDate)),
+            this, SLOT(minimumDateChanged(QDate)));
+    connect(maximumDateEdit, SIGNAL(dateChanged(QDate)),
+            this, SLOT(maximumDateChanged(QDate)));
+
+    QGridLayout *dateBoxLayout = new QGridLayout;
+    dateBoxLayout->addWidget(currentDateLabel, 1, 0);
+    dateBoxLayout->addWidget(currentDateEdit, 1, 1);
+    dateBoxLayout->addWidget(minimumDateLabel, 0, 0);
+    dateBoxLayout->addWidget(minimumDateEdit, 0, 1);
+    dateBoxLayout->addWidget(maximumDateLabel, 2, 0);
+    dateBoxLayout->addWidget(maximumDateEdit, 2, 1);
+    dateBoxLayout->setRowStretch(3, 1);
+
+    datesGroupBox->setLayout(dateBoxLayout);
+}
+
+void CalendarWidget::createTextFormatsGroupBox()
+{
+    textFormatsGroupBox = new QGroupBox(tr("Text Formats"));
+
+    weekdayColorCombo = createColorComboBox();
+    weekdayColorCombo->setCurrentIndex(
+            weekdayColorCombo->findText(tr("Black")));
+
+    weekdayColorLabel = new QLabel(tr("&Weekday color:"));
+    weekdayColorLabel->setBuddy(weekdayColorCombo);
+
+    weekendColorCombo = createColorComboBox();
+    weekendColorCombo->setCurrentIndex(
+            weekendColorCombo->findText(tr("Red")));
+
+    weekendColorLabel = new QLabel(tr("Week&end color:"));
+    weekendColorLabel->setBuddy(weekendColorCombo);
+
+    headerTextFormatCombo = new QComboBox;
+    headerTextFormatCombo->addItem(tr("Bold"));
+    headerTextFormatCombo->addItem(tr("Italic"));
+    headerTextFormatCombo->addItem(tr("Plain"));
+
+    headerTextFormatLabel = new QLabel(tr("&Header text:"));
+    headerTextFormatLabel->setBuddy(headerTextFormatCombo);
+
+    firstFridayCheckBox = new QCheckBox(tr("&First Friday in blue"));
+
+    mayFirstCheckBox = new QCheckBox(tr("May &1 in red"));
+
+    connect(weekdayColorCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(weekdayFormatChanged()));
+    connect(weekendColorCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(weekendFormatChanged()));
+    connect(headerTextFormatCombo, SIGNAL(currentIndexChanged(QString)),
+            this, SLOT(reformatHeaders()));
+    connect(firstFridayCheckBox, SIGNAL(toggled(bool)),
+            this, SLOT(reformatCalendarPage()));
+    connect(mayFirstCheckBox, SIGNAL(toggled(bool)),
+            this, SLOT(reformatCalendarPage()));
+
+    QHBoxLayout *checkBoxLayout = new QHBoxLayout;
+    checkBoxLayout->addWidget(firstFridayCheckBox);
+    checkBoxLayout->addStretch();
+    checkBoxLayout->addWidget(mayFirstCheckBox);
+
+    QGridLayout *outerLayout = new QGridLayout;
+    outerLayout->addWidget(weekdayColorLabel, 0, 0);
+    outerLayout->addWidget(weekdayColorCombo, 0, 1);
+    outerLayout->addWidget(weekendColorLabel, 1, 0);
+    outerLayout->addWidget(weekendColorCombo, 1, 1);
+    outerLayout->addWidget(headerTextFormatLabel, 2, 0);
+    outerLayout->addWidget(headerTextFormatCombo, 2, 1);
+    outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2);
+    textFormatsGroupBox->setLayout(outerLayout);
+
+    weekdayFormatChanged();
+    weekendFormatChanged();
+    reformatHeaders();
+    reformatCalendarPage();
+}
+
+QComboBox *CalendarWidget::createColorComboBox()
+{
+    QComboBox *comboBox = new QComboBox;
+    comboBox->addItem(tr("Red"), Qt::red);
+    comboBox->addItem(tr("Blue"), Qt::blue);
+    comboBox->addItem(tr("Black"), Qt::black);
+    comboBox->addItem(tr("Magenta"), Qt::magenta);
+    return comboBox;
+}
diff --git a/tests/manual/qlocale/calendar.h b/tests/manual/qlocale/calendar.h
new file mode 100644
index 0000000..3ac39c3
--- /dev/null
+++ b/tests/manual/qlocale/calendar.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CALENDAR_H
+#define CALENDAR_H
+
+#include <QtGui>
+
+class CalendarWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    CalendarWidget();
+
+private slots:
+    void localeChanged(QLocale locale);
+    void firstDayChanged(int index);
+    void selectionModeChanged(int index);
+    void horizontalHeaderChanged(int index);
+    void verticalHeaderChanged(int index);
+    void selectedDateChanged();
+    void minimumDateChanged(const QDate &date);
+    void maximumDateChanged(const QDate &date);
+    void weekdayFormatChanged();
+    void weekendFormatChanged();
+    void reformatHeaders();
+    void reformatCalendarPage();
+
+private:
+    void createPreviewGroupBox();
+    void createGeneralOptionsGroupBox();
+    void createDatesGroupBox();
+    void createTextFormatsGroupBox();
+    QComboBox *createColorComboBox();
+
+    QGroupBox *previewGroupBox;
+    QGridLayout *previewLayout;
+    QCalendarWidget *calendar;
+
+    QGroupBox *generalOptionsGroupBox;
+    QLabel *localeLabel;
+    QLabel *firstDayLabel;
+
+    QLabel *selectionModeLabel;
+    QLabel *horizontalHeaderLabel;
+    QLabel *verticalHeaderLabel;
+    QComboBox *localeCombo;
+    QComboBox *firstDayCombo;
+    QComboBox *selectionModeCombo;
+    QCheckBox *gridCheckBox;
+    QCheckBox *navigationCheckBox;
+    QComboBox *horizontalHeaderCombo;
+    QComboBox *verticalHeaderCombo;
+
+    QGroupBox *datesGroupBox;
+    QLabel *currentDateLabel;
+    QLabel *minimumDateLabel;
+    QLabel *maximumDateLabel;
+    QDateEdit *currentDateEdit;
+    QDateEdit *minimumDateEdit;
+    QDateEdit *maximumDateEdit;
+
+    QGroupBox *textFormatsGroupBox;
+    QLabel *weekdayColorLabel;
+    QLabel *weekendColorLabel;
+    QLabel *headerTextFormatLabel;
+    QComboBox *weekdayColorCombo;
+    QComboBox *weekendColorCombo;
+    QComboBox *headerTextFormatCombo;
+
+    QCheckBox *firstFridayCheckBox;
+    QCheckBox *mayFirstCheckBox;
+};
+
+#endif
diff --git a/tests/manual/qlocale/currency.cpp b/tests/manual/qlocale/currency.cpp
new file mode 100644
index 0000000..ec932ff
--- /dev/null
+++ b/tests/manual/qlocale/currency.cpp
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "currency.h"
+
+CurrencyWidget::CurrencyWidget()
+{
+    QGridLayout *l = new QGridLayout(this);
+
+    currencySymbolLabel = new QLabel("Symbol:");
+    currencySymbol = new QLineEdit;
+    currencyISOLabel = new QLabel("ISO Code:");
+    currencyISO = new QLineEdit;
+    currencyNameLabel = new QLabel("Display name:");
+    currencyName = new QLineEdit;
+    currencyFormattingLabel = new QLabel("Currency formatting:");
+    currencyFormattingValue = new QLineEdit(QString::number(1234.56, 'f', 2));
+    currencyFormatting = new QLineEdit;
+
+
+    l->addWidget(currencySymbolLabel, 0, 0);
+    l->addWidget(currencySymbol, 0, 1, 1, 2);
+    l->addWidget(currencyISOLabel, 1, 0);
+    l->addWidget(currencyISO, 1, 1, 1, 2);
+    l->addWidget(currencyNameLabel, 2, 0);
+    l->addWidget(currencyName, 2, 1, 1, 2);
+    l->addWidget(currencyFormattingLabel, 3, 0);
+    l->addWidget(currencyFormattingValue, 3, 1);
+    l->addWidget(currencyFormatting, 3, 2);
+
+    connect(currencyFormattingValue, SIGNAL(textChanged(QString)),
+            this, SLOT(updateCurrencyFormatting(QString)));
+
+    update(QLocale());
+}
+
+void CurrencyWidget::update(const QLocale locale)
+{
+    currentLocale = locale;
+    currencySymbol->setText(locale.currencySymbol());
+    currencyISO->setText(locale.currencySymbol(QLocale::CurrencyIsoCode));
+    currencyName->setText(locale.currencySymbol(QLocale::CurrencyDisplayName));
+    updateCurrencyFormatting(currencyFormattingValue->text());
+}
+
+void CurrencyWidget::updateCurrencyFormatting(QString value)
+{
+    QString result;
+    bool ok;
+    int i = value.toInt(&ok);
+    if (ok) {
+        result = currentLocale.toCurrencyString(i);
+    } else {
+        double d = value.toDouble(&ok);
+        if (ok)
+            result = currentLocale.toCurrencyString(d);
+    }
+    currencyFormatting->setText(result);
+}
+
+void CurrencyWidget::localeChanged(QLocale locale)
+{
+    update(locale);
+}
+
diff --git a/tests/manual/qlocale/currency.h b/tests/manual/qlocale/currency.h
new file mode 100644
index 0000000..97e1dd9
--- /dev/null
+++ b/tests/manual/qlocale/currency.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CURRENCY_H
+#define CURRENCY_H
+
+#include <QtGui>
+
+class CurrencyWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    CurrencyWidget();
+
+private:
+    QLocale currentLocale;
+
+    QLabel *currencySymbolLabel;
+    QLineEdit *currencySymbol;
+    QLabel *currencyISOLabel;
+    QLineEdit *currencyISO;
+    QLabel *currencyNameLabel;
+    QLineEdit *currencyName;
+    QLabel *currencyFormattingLabel;
+    QLineEdit *currencyFormattingValue;
+    QLineEdit *currencyFormatting;
+
+private slots:
+    void localeChanged(QLocale locale);
+    void update(const QLocale locale);
+    void updateCurrencyFormatting(QString);
+};
+
+#endif
diff --git a/tests/manual/qlocale/main.cpp b/tests/manual/qlocale/main.cpp
new file mode 100644
index 0000000..f96e0a2
--- /dev/null
+++ b/tests/manual/qlocale/main.cpp
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "calendar.h"
+#include "currency.h"
+#include "window.h"
+
+int main(int argv, char *args[])
+{
+    QApplication app(argv, args);
+    Window window;
+    window.show();
+    return app.exec();
+}
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
new file mode 100644
index 0000000..8f83a83
--- /dev/null
+++ b/tests/manual/qlocale/qlocale.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+TARGET = 
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += currency.h calendar.h window.h
+SOURCES += currency.cpp main.cpp calendar.cpp window.cpp
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
new file mode 100644
index 0000000..26e5d84
--- /dev/null
+++ b/tests/manual/qlocale/window.cpp
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "window.h"
+
+Window::Window()
+{
+    localeCombo = new QComboBox;
+
+    localeCombo->addItem("System", QLocale::system());
+
+    int index = 0;
+    for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {
+        QLocale::Language lang = static_cast<QLocale::Language>(_lang);
+        QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);
+        for (int i = 0; i < countries.count(); ++i) {
+            QLocale::Country country = countries.at(i);
+            QString label = QLocale::languageToString(lang);
+            label += QLatin1Char('/');
+            label += QLocale::countryToString(country);
+            localeCombo->addItem(label, QLocale(lang, country));
+            ++index;
+        }
+    }
+    connect(localeCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(localeChanged(int)));
+
+    tabWidget = new QTabWidget;
+    calendar = new CalendarWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), calendar, SLOT(localeChanged(QLocale)));
+    currency = new CurrencyWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), currency, SLOT(localeChanged(QLocale)));
+
+    localeName = new QLabel("Locale: foo_BAR");
+
+    QWidget *w = new QWidget;
+    QHBoxLayout *headerLayout = new QHBoxLayout(w);
+    headerLayout->addWidget(localeCombo);
+    headerLayout->addWidget(localeName);
+
+    QVBoxLayout *l = new QVBoxLayout(this);
+    l->addWidget(w);
+    l->addWidget(tabWidget);
+
+    tabWidget->addTab(calendar, "Calendar");
+    tabWidget->addTab(currency, "Currency");
+    localeCombo->setCurrentIndex(0);
+    systemLocaleChanged();
+}
+
+void Window::systemLocaleChanged()
+{
+    QLocale l = QLocale::system();
+    QString lang = QLocale::languageToString(l.language());
+    QString country = QLocale::countryToString(l.country());
+    localeCombo->setItemText(0, QString("System: %1/%2").arg(lang, country));
+    emit localeChanged(0);
+}
+
+void Window::localeChanged(int idx)
+{
+    QLocale locale = localeCombo->itemData(idx).toLocale();
+    localeName->setText(QString("Locale: %1").arg(locale.name()));
+    emit localeChanged(locale);
+}
+
+bool Window::event(QEvent *event)
+{
+    switch (event->type()) {
+    case QEvent::LocaleChange: {
+        if (localeCombo->currentIndex() == 0)
+            systemLocaleChanged();
+        return true;
+    }
+    default:
+        break;
+    }
+    return QWidget::event(event);
+}
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
new file mode 100644
index 0000000..5bfea2a
--- /dev/null
+++ b/tests/manual/qlocale/window.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include <QtGui>
+
+#include "calendar.h"
+#include "currency.h"
+
+class Window : public QWidget
+{
+    Q_OBJECT
+public:
+    Window();
+
+    QLabel *localeName;
+    QComboBox *localeCombo;
+    QTabWidget *tabWidget;
+    CalendarWidget *calendar;
+    CurrencyWidget *currency;
+
+private:
+    bool event(QEvent *);
+    void systemLocaleChanged();
+
+signals:
+    void localeChanged(QLocale);
+
+private slots:
+    void localeChanged(int);
+};
+
+#endif
-- 
cgit v0.12


From 44ef44bc3826c78a10bcf02d3357bf6332c6c3ed Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 17 Feb 2011 13:27:45 +0000
Subject: Explicit network session for QNetworkAccessManager

Implemented a tunnel to get the QNetworkSession from QNetworkAccessManager
down to the socket engine. This is currently a private API for QNAM.
This patch only implements the FTP backend - the other backends are to
follow.
On Symbian, the native socket engine will extract the native session
(RConnection) from the QNetworkSession implementation, and use that to
open sockets using the explicitly specified session.
When no session is specified on the socket (default for networking usage
outside of QNAM) then the socket is opened with no RConnection specified,
which allows the IP stack to find any route via an open interface.

The QFtp autotest is enhanced to test QFtp with an explicit session as well
as implicit connectivity (where a QNetworkSession is opened by the user,
and then QFtp is used without a specified connection).
This autotest gives better coverage than the FTP test cases in QNetworkReply.

Reviewed-by: Markus Goetz
---
 src/network/access/qftp.cpp                        | 17 +++++
 src/network/access/qnetworkaccessbackend.cpp       |  7 +-
 src/network/access/qnetworkaccessftpbackend.cpp    |  4 +
 src/network/bearer/qnetworksession.cpp             |  9 +++
 src/network/bearer/qnetworksession_p.h             | 11 +++
 src/network/socket/qabstractsocket.cpp             |  8 ++
 src/network/socket/qsymbiansocketengine.cpp        | 31 ++++++--
 src/network/socket/qsymbiansocketengine_p.h        |  5 +-
 src/network/socket/qtcpserver.cpp                  |  8 ++
 src/network/ssl/qsslsocket.cpp                     |  4 +
 .../bearer/symbian/qnetworksession_impl.cpp        |  5 ++
 src/plugins/bearer/symbian/qnetworksession_impl.h  |  3 +-
 tests/auto/qftp/tst_qftp.cpp                       | 88 ++++++++++++++++++++--
 13 files changed, 182 insertions(+), 18 deletions(-)

diff --git a/src/network/access/qftp.cpp b/src/network/access/qftp.cpp
index ccc20e6..45fc11f 100644
--- a/src/network/access/qftp.cpp
+++ b/src/network/access/qftp.cpp
@@ -319,6 +319,10 @@ void QFtpDTP::connectToHost(const QString & host, quint16 port)
         socket = 0;
     }
     socket = new QTcpSocket(this);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket
+    socket->setProperty("_q_networksession", property("_q_networksession"));
+#endif
     socket->setObjectName(QLatin1String("QFtpDTP Passive state socket"));
     connect(socket, SIGNAL(connected()), SLOT(socketConnected()));
     connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead()));
@@ -331,6 +335,10 @@ void QFtpDTP::connectToHost(const QString & host, quint16 port)
 
 int QFtpDTP::setupListener(const QHostAddress &address)
 {
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket
+    listener.setProperty("_q_networksession", property("_q_networksession"));
+#endif
     if (!listener.isListening() && !listener.listen(address, 0))
         return -1;
     return listener.serverPort();
@@ -808,6 +816,11 @@ QFtpPI::QFtpPI(QObject *parent) :
 void QFtpPI::connectToHost(const QString &host, quint16 port)
 {
     emit connectState(QFtp::HostLookup);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket & DTP
+    commandSocket.setProperty("_q_networksession", property("_q_networksession"));
+    dtp.setProperty("_q_networksession", property("_q_networksession"));
+#endif
     commandSocket.connectToHost(host, port);
 }
 
@@ -2240,6 +2253,10 @@ void QFtpPrivate::_q_startNextCommand()
         c->rawCmds.clear();
         _q_piFinished(QLatin1String("Proxy set to ") + proxyHost + QLatin1Char(':') + QString::number(proxyPort));
     } else if (c->command == QFtp::ConnectToHost) {
+#ifndef QT_NO_BEARERMANAGEMENT
+        //copy network session down to the PI
+        pi.setProperty("_q_networksession", q->property("_q_networksession"));
+#endif
         if (!proxyHost.isEmpty()) {
             host = c->rawCmds[0];
             port = c->rawCmds[1].toUInt();
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index fd1fa60..de40256 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -46,7 +46,7 @@
 #include "qnetworkreply_p.h"
 #include "QtCore/qhash.h"
 #include "QtCore/qmutex.h"
-#include "QtNetwork/qnetworksession.h"
+#include "QtNetwork/private/qnetworksession_p.h"
 
 #include "qnetworkaccesscachebackend_p.h"
 #include "qabstractnetworkcache.h"
@@ -96,6 +96,11 @@ QNetworkAccessBackend *QNetworkAccessManagerPrivate::findBackend(QNetworkAccessM
             QNetworkAccessBackend *backend = (*it)->create(op, request);
             if (backend) {
                 backend->manager = this;
+#ifndef QT_NO_BEARERMANAGEMENT
+                //copy network session down to the backend
+                if (networkSession)
+                    backend->setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
                 return backend; // found a factory that handled our request
             }
             ++it;
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index e34e6bb..3ad1961 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -153,6 +153,10 @@ void QNetworkAccessFtpBackend::open()
     if (!objectCache->requestEntry(cacheKey, this,
                              SLOT(ftpConnectionReady(QNetworkAccessCache::CacheableObject*)))) {
         ftp = new QNetworkAccessCachedFtpConnection;
+#ifndef QT_NO_BEARERMANAGEMENT
+        //copy network session down to the QFtp
+        ftp->setProperty("_q_networksession", property("_q_networksession"));
+#endif
 #ifndef QT_NO_NETWORKPROXY
         if (proxy.type() == QNetworkProxy::FtpCachingProxy)
             ftp->setProxy(proxy.hostName(), proxy.port());
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 553410e..0ddd10a 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -705,6 +705,15 @@ void QNetworkSession::disconnectNotify(const char *signal)
         d->setALREnabled(false);
 }
 
+#ifdef Q_OS_SYMBIAN
+RConnection* QNetworkSessionPrivate::nativeSession(QNetworkSession &s)
+{
+    if (!s.d)
+        return 0;
+    return s.d->nativeSession();
+}
+#endif
+
 #include "moc_qnetworksession.cpp"
 
 QT_END_NAMESPACE
diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
index 707ad37..e2fcfe6 100644
--- a/src/network/bearer/qnetworksession_p.h
+++ b/src/network/bearer/qnetworksession_p.h
@@ -55,9 +55,14 @@
 
 #include "qnetworksession.h"
 #include "qnetworkconfiguration_p.h"
+#include "QtCore/qsharedpointer.h"
 
 #ifndef QT_NO_BEARERMANAGEMENT
 
+#ifdef Q_OS_SYMBIAN
+class RConnection;
+#endif
+
 QT_BEGIN_NAMESPACE
 
 class Q_NETWORK_EXPORT QNetworkSessionPrivate : public QObject
@@ -102,6 +107,10 @@ public:
     virtual quint64 bytesReceived() const = 0;
     virtual quint64 activeTime() const = 0;
 
+#ifdef Q_OS_SYMBIAN
+    static RConnection* nativeSession(QNetworkSession&);
+    virtual RConnection* nativeSession() = 0;
+#endif
 protected:
     inline QNetworkConfigurationPrivatePointer privateConfiguration(const QNetworkConfiguration &config) const
     {
@@ -145,6 +154,8 @@ protected:
 
 QT_END_NAMESPACE
 
+Q_DECLARE_METATYPE(QSharedPointer<QNetworkSession>)
+
 #endif // QT_NO_BEARERMANAGEMENT
 
 #endif // QNETWORKSESSIONPRIVATE_H
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 3462538..af5f027 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -546,6 +546,10 @@ bool QAbstractSocketPrivate::initSocketLayer(QAbstractSocket::NetworkLayerProtoc
 
     resetSocketLayer();
     socketEngine = QAbstractSocketEngine::createSocketEngine(q->socketType(), proxyInUse, q);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket engine (if it has been set)
+    socketEngine->setProperty("_q_networksession", q->property("_q_networksession"));
+#endif
     if (!socketEngine) {
         socketError = QAbstractSocket::UnsupportedSocketOperationError;
         q->setErrorString(QAbstractSocket::tr("Operation on socket is not supported"));
@@ -1600,6 +1604,10 @@ bool QAbstractSocket::setSocketDescriptor(int socketDescriptor, SocketState sock
 
     d->resetSocketLayer();
     d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket engine (if it has been set)
+    d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
+#endif
     if (!d->socketEngine) {
         d->socketError = UnsupportedSocketOperationError;
         setErrorString(tr("Operation on socket is not supported"));
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index d6b893a..b9537c1 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -47,6 +47,7 @@
 #include "qelapsedtimer.h"
 #include "qvarlengtharray.h"
 #include "qnetworkinterface.h"
+#include "qnetworksession_p.h"
 #include <es_sock.h>
 #include <in_sock.h>
 #include <net/if.h>
@@ -186,10 +187,26 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     TUint family = KAfInet; // KAfInet6 is only used as an address family, not as a protocol family
     TUint type = (socketType == QAbstractSocket::UdpSocket) ? KSockDatagram : KSockStream;
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
+
+    //Check if there is a user specified session
+    RConnection *connection = 0;
+    QVariant v(q->property("_q_networksession"));
+    if (v.isValid()) {
+        QSharedPointer<QNetworkSession> s = qvariant_cast<QSharedPointer<QNetworkSession> >(v);
+        connection = QNetworkSessionPrivate::nativeSession(*s);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "QSymbianSocketEnginePrivate::createNewSocket - _q_networksession was set" << connection;
+#endif
+    }
     TInt err;
-//    if (connection)
-//        err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
-//    else
+    if (connection) {
+        if (connection->SubSessionHandle())
+            err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
+        else {
+            setError(QAbstractSocket::NetworkError, SessionNotOpenErrorString);
+            return false;
+        }
+    } else
         err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
     if (err != KErrNone) {
@@ -246,7 +263,6 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
 QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
     socketDescriptor(-1),
     socketServer(QSymbianSocketManager::instance().getSocketServer()),
-    connection(QSymbianSocketManager::instance().defaultConnection()),
     readNotifier(0),
     writeNotifier(0),
     exceptNotifier(0),
@@ -1330,9 +1346,12 @@ void QSymbianSocketEnginePrivate::setError(QAbstractSocket::SocketError error, E
     case InvalidProxyTypeString:
         socketErrorString = QSymbianSocketEngine::tr("The proxy type is invalid for this operation");
         break;
-    case InvalidAddressError:
+    case InvalidAddressErrorString:
         socketErrorString = QSymbianSocketEngine::tr("The address is invalid for this operation");
         break;
+    case SessionNotOpenErrorString:
+        socketErrorString = QSymbianSocketEngine::tr("The specified network session is not opened");
+        break;
     case UnknownSocketErrorString:
         socketErrorString = QSymbianSocketEngine::tr("Unknown error");
         break;
@@ -1378,7 +1397,7 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
         setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
         break;
     case KErrBadName:
-        setError(QAbstractSocket::NetworkError, InvalidAddressError);
+        setError(QAbstractSocket::NetworkError, InvalidAddressErrorString);
         break;
     default:
         socketError = QAbstractSocket::NetworkError;
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index a2904ae..bc39450 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -196,8 +196,6 @@ public:
     mutable RSocket nativeSocket;
     // From QtCore:
     RSocketServ& socketServer;
-    // From QtCore, check lifetime issues, also should be pulling this out of a QNetworkSession somehow:
-    RConnection *connection;
     mutable RTimer selectTimer;
 
     QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
@@ -231,7 +229,8 @@ public:
         NotSocketErrorString,
         InvalidProxyTypeString,
         //symbian specific
-        InvalidAddressError,
+        InvalidAddressErrorString,
+        SessionNotOpenErrorString,
 
         UnknownSocketErrorString = -1
     };
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index e382830..6b012db 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -287,6 +287,10 @@ bool QTcpServer::listen(const QHostAddress &address, quint16 port)
 
     delete d->socketEngine;
     d->socketEngine = QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, proxy, this);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket engine (if it has been set)
+    d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
+#endif
     if (!d->socketEngine) {
         d->serverSocketError = QAbstractSocket::UnsupportedSocketOperationError;
         d->serverSocketErrorString = tr("Operation on socket is not supported");
@@ -412,6 +416,10 @@ bool QTcpServer::setSocketDescriptor(int socketDescriptor)
     if (d->socketEngine)
         delete d->socketEngine;
     d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket engine (if it has been set)
+    d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
+#endif
     if (!d->socketEngine->initialize(socketDescriptor, QAbstractSocket::ListeningState)) {
         d->serverSocketError = d->socketEngine->error();
         d->serverSocketErrorString = d->socketEngine->errorString();
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 4252123..39b74d9 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2000,6 +2000,10 @@ void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode)
     q->setPeerName(QString());
 
     plainSocket = new QTcpSocket(q);
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the plain socket (if it has been set)
+    plainSocket->setProperty("_q_networksession", q->property("_q_networksession"));
+#endif
     q->connect(plainSocket, SIGNAL(connected()),
                q, SLOT(_q_connectedSlot()),
                Qt::DirectConnection);
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 2167dbb..e35c01a 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -1535,6 +1535,11 @@ bool QNetworkSessionPrivateImpl::easyWlanTrueIapId(TUint32 &trueIapId) const
 }
 #endif
 
+RConnection* QNetworkSessionPrivateImpl::nativeSession()
+{
+    return &iConnection;
+}
+
 ConnectionProgressNotifier::ConnectionProgressNotifier(QNetworkSessionPrivateImpl& owner, RConnection& connection)
     : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection)
 {
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index a0e7a2a..f2a8a45 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -111,7 +111,8 @@ public:
     quint64 bytesWritten() const;
     quint64 bytesReceived() const;
     quint64 activeTime() const;
-    
+
+    RConnection* nativeSession();
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE    
 public: // From MMobilityProtocolResp
     void PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo,
diff --git a/tests/auto/qftp/tst_qftp.cpp b/tests/auto/qftp/tst_qftp.cpp
index 1b4b503..7e3cd75 100644
--- a/tests/auto/qftp/tst_qftp.cpp
+++ b/tests/auto/qftp/tst_qftp.cpp
@@ -50,6 +50,10 @@
 #include <time.h>
 #include <stdlib.h>
 #include <QNetworkProxy>
+#include <QNetworkConfiguration>
+#include <qnetworkconfigmanager.h>
+#include <QNetworkSession>
+#include <QtNetwork/private/qnetworksession_p.h>
 
 #include "../network-settings.h"
 
@@ -62,7 +66,9 @@
 #define SRCDIR ""
 #endif
 
-
+#ifndef QT_NO_BEARERMANAGEMENT
+Q_DECLARE_METATYPE(QNetworkConfiguration)
+#endif
 
 class tst_QFtp : public QObject
 {
@@ -148,6 +154,10 @@ private:
     void renameCleanup( const QString &host, const QString &user, const QString &password, const QString &fileToDelete );
 
     QFtp *ftp;
+#ifndef QT_NO_BEARERMANAGEMENT
+    QSharedPointer<QNetworkSession> networkSessionExplicit;
+    QSharedPointer<QNetworkSession> networkSessionImplicit;
+#endif
 
     QList<int> ids; // helper to make sure that all expected signals are emitted
     int current_id;
@@ -186,9 +196,9 @@ private:
 const int bytesTotal_init = -10;
 const int bytesDone_init = -10;
 
-tst_QFtp::tst_QFtp()
+tst_QFtp::tst_QFtp() :
+    ftp(0)
 {
-    Q_SET_DEFAULT_IAP
 }
 
 tst_QFtp::~tst_QFtp()
@@ -199,33 +209,62 @@ void tst_QFtp::initTestCase_data()
 {
     QTest::addColumn<bool>("setProxy");
     QTest::addColumn<int>("proxyType");
+    QTest::addColumn<bool>("setSession");
 
-    QTest::newRow("WithoutProxy") << false << 0;
-    QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
+    QTest::newRow("WithoutProxy") << false << 0 << false;
+    QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy) << false;
     //### doesn't work well yet.
     //QTest::newRow("WithHttpProxy") << true << int(QNetworkProxy::HttpProxy);
+
+#ifndef QT_NO_BEARERMANAGEMENT
+    QTest::newRow("WithoutProxyWithSession") << false << 0 << true;
+    QTest::newRow("WithSocks5ProxyAndSession") << true << int(QNetworkProxy::Socks5Proxy) << true;
+#endif
 }
 
 void tst_QFtp::initTestCase()
 {
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager manager;
+    networkSessionImplicit = QSharedPointer<QNetworkSession>(new QNetworkSession(manager.defaultConfiguration()));
+    networkSessionImplicit->open();
+    QVERIFY(networkSessionImplicit->waitForOpened(60000)); //there may be user prompt on 1st connect
+#endif
 }
 
 void tst_QFtp::cleanupTestCase()
 {
+#ifndef QT_NO_BEARERMANAGEMENT
+    networkSessionExplicit.clear();
+    networkSessionImplicit.clear();
+#endif
 }
 
 void tst_QFtp::init()
 {
     QFETCH_GLOBAL(bool, setProxy);
+    QFETCH_GLOBAL(int, proxyType);
+    QFETCH_GLOBAL(bool, setSession);
     if (setProxy) {
-        QFETCH_GLOBAL(int, proxyType);
         if (proxyType == QNetworkProxy::Socks5Proxy) {
             QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080));
         } else if (proxyType == QNetworkProxy::HttpProxy) {
             QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::HttpProxy, QtNetworkSettings::serverName(), 3128));
         }
     }
+#ifndef QT_NO_BEARERMANAGEMENT
+    if (setSession) {
+        networkSessionExplicit = networkSessionImplicit;
+        if (!networkSessionExplicit->isOpen()) {
+            networkSessionExplicit->open();
+            QVERIFY(networkSessionExplicit->waitForOpened(30000));
+        }
+    } else {
+        networkSessionExplicit.clear();
+    }
+#endif
 
+    delete ftp;
     ftp = 0;
 
     ids.clear();
@@ -266,6 +305,12 @@ void tst_QFtp::cleanup()
     if (setProxy) {
         QNetworkProxy::setApplicationProxy(QNetworkProxy::DefaultProxy);
     }
+
+    delete ftp;
+    ftp = 0;
+#ifndef QT_NO_BEARERMANAGEMENT
+    networkSessionExplicit.clear();
+#endif
 }
 
 void tst_QFtp::connectToHost_data()
@@ -289,6 +334,7 @@ void tst_QFtp::connectToHost()
 
     QTestEventLoop::instance().enterLoop( 61 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -337,6 +383,7 @@ void tst_QFtp::connectToUnresponsiveHost()
     QVERIFY( it.value().success == 0 );
 
     delete ftp;
+    ftp = 0;
 }
 
 void tst_QFtp::login_data()
@@ -369,6 +416,7 @@ void tst_QFtp::login()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -415,6 +463,7 @@ void tst_QFtp::close()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -482,6 +531,7 @@ void tst_QFtp::list()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -542,6 +592,7 @@ void tst_QFtp::cd()
     QTestEventLoop::instance().enterLoop( 30 );
 
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() ) {
         QFAIL( "Network operation timed out" );
     }
@@ -617,6 +668,7 @@ void tst_QFtp::get()
 
     QTestEventLoop::instance().enterLoop( 50 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -743,6 +795,7 @@ void tst_QFtp::put()
             break;
     }
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -775,6 +828,7 @@ void tst_QFtp::put()
             break;
     }
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -792,6 +846,7 @@ void tst_QFtp::put()
 
     QTestEventLoop::instance().enterLoop( timestep );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -860,6 +915,7 @@ void tst_QFtp::mkdir()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -884,6 +940,7 @@ void tst_QFtp::mkdir()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -903,6 +960,7 @@ void tst_QFtp::mkdir()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -942,6 +1000,7 @@ void tst_QFtp::mkdir2()
     QVERIFY(commandFinishedSpy.at(3).at(1).toBool());
 
     delete ftp;
+    ftp = 0;
 }
 
 void tst_QFtp::mkdir2Slot(int id, bool)
@@ -1019,6 +1078,7 @@ void tst_QFtp::renameInit( const QString &host, const QString &user, const QStri
 
         QTestEventLoop::instance().enterLoop( 50 );
         delete ftp;
+        ftp = 0;
         if ( QTestEventLoop::instance().timeout() )
             QFAIL( "Network operation timed out" );
 
@@ -1043,6 +1103,7 @@ void tst_QFtp::renameCleanup( const QString &host, const QString &user, const QS
 
         QTestEventLoop::instance().enterLoop( 30 );
         delete ftp;
+        ftp = 0;
         if ( QTestEventLoop::instance().timeout() )
             QFAIL( "Network operation timed out" );
 
@@ -1087,6 +1148,7 @@ void tst_QFtp::rename()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -1273,6 +1335,7 @@ void tst_QFtp::commandSequence()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -1330,6 +1393,7 @@ void tst_QFtp::abort()
             break;
     }
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -1367,6 +1431,7 @@ void tst_QFtp::abort()
 
         QTestEventLoop::instance().enterLoop( 30 );
         delete ftp;
+        ftp = 0;
         if ( QTestEventLoop::instance().timeout() )
             QFAIL( "Network operation timed out" );
 
@@ -1425,6 +1490,7 @@ void tst_QFtp::bytesAvailable()
     ftp->readAll();
     QVERIFY( ftp->bytesAvailable() == 0 );
     delete ftp;
+    ftp = 0;
 }
 
 void tst_QFtp::activeMode()
@@ -1497,6 +1563,7 @@ void tst_QFtp::proxy()
     QTestEventLoop::instance().enterLoop( 50 );
 
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() ) {
         QFAIL( "Network operation timed out" );
     }
@@ -1512,7 +1579,6 @@ void tst_QFtp::proxy()
     }
 }
 
-
 void tst_QFtp::binaryAscii()
 {
     QString file = "asciifile%1.txt";
@@ -1573,6 +1639,7 @@ void tst_QFtp::binaryAscii()
 
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() )
         QFAIL( "Network operation timed out" );
 
@@ -1868,6 +1935,11 @@ void tst_QFtp::dataTransferProgress( qint64 done, qint64 total )
 QFtp *tst_QFtp::newFtp()
 {
     QFtp *nFtp = new QFtp( this );
+#ifndef QT_NO_BEARERMANAGEMENT
+    if (networkSessionExplicit) {
+        nFtp->setProperty("_q_networksession", QVariant::fromValue(networkSessionExplicit));
+    }
+#endif
     connect( nFtp, SIGNAL(commandStarted(int)),
              SLOT(commandStarted(int)) );
     connect( nFtp, SIGNAL(commandFinished(int,bool)),
@@ -1920,6 +1992,7 @@ bool tst_QFtp::fileExists( const QString &host, quint16 port, const QString &use
     inFileDirExistsFunction = TRUE;
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() ) {
         // ### make this test work
         qWarning("tst_QFtp::fileExists: Network operation timed out");
@@ -1970,6 +2043,7 @@ bool tst_QFtp::dirExists( const QString &host, quint16 port, const QString &user
     inFileDirExistsFunction = TRUE;
     QTestEventLoop::instance().enterLoop( 30 );
     delete ftp;
+    ftp = 0;
     if ( QTestEventLoop::instance().timeout() ) {
         // ### make this test work
         // QFAIL( "Network operation timed out" );
-- 
cgit v0.12


From 3962d060efa7e797db01c193a36857bdffa934be Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 16 Feb 2011 15:30:43 +0100
Subject: Updated CLDR data for QLocale.

This is a temporary commit and meant to be removed before merging the branch
into Qt as we don't want to bloat the repository size by updating CLDR every
time we make a small change to QLocale, but do that only once when we are done.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 1055 +++++++++++++++++++++++++-----------
 1 file changed, 730 insertions(+), 325 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index cd2a342..ea15efb 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -304,331 +304,331 @@ static const quint16 locale_index[] = {
 
 static const QLocalePrivate locale_data[] = {
 //      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2  }, // C/AnyCountry
-    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2  }, // Afan/Ethiopia
-    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2  }, // Afan/Kenya
-    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2  }, // Afar/Djibouti
-    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2  }, // Afar/Eritrea
-    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2  }, // Afar/Ethiopia
-    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3  }, // Afrikaans/SouthAfrica
-    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3  }, // Afrikaans/Namibia
-    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2  }, // Albanian/Albania
-    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4  }, // Amharic/Ethiopia
-    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/SaudiArabia
-    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Algeria
-    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Bahrain
-    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Egypt
-    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Iraq
-    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Jordan
-    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Kuwait
-    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Lebanon
-    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/LibyanArabJamahiriya
-    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Morocco
-    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Oman
-    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Qatar
-    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Sudan
-    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/SyrianArabRepublic
-    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Tunisia
-    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/UnitedArabEmirates
-    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1  }, // Arabic/Yemen
-    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3  }, // Armenian/Armenia
-    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7  }, // Assamese/India
-    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2  }, // Azerbaijani/Azerbaijan
-    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2  }, // Azerbaijani/Iran
-    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2  }, // Basque/Spain
-    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7  }, // Bengali/Bangladesh
-    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7  }, // Bengali/India
-    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2  }, // Bhutani/Bhutan
-    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Breton/France
-    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7  }, // Bulgarian/Bulgaria
-    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2  }, // Burmese/Myanmar
-    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13  }, // Byelorussian/Belarus
-    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5  }, // Cambodian/Cambodia
-    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4  }, // Catalan/Spain
-    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2  }, // Chinese/China
-    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2  }, // Chinese/HongKong
-    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2  }, // Chinese/Macau
-    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2  }, // Chinese/Singapore
-    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2  }, // Chinese/Taiwan
-    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2  }, // Croatian/Croatia
-    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4  }, // Czech/CzechRepublic
-    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4  }, // Danish/Denmark
-    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2  }, // Dutch/Netherlands
-    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2  }, // Dutch/Belgium
-    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/UnitedStates
-    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/AmericanSamoa
-    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Australia
-    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Belgium
-    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Belize
-    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Botswana
-    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Canada
-    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Guam
-    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/HongKong
-    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/India
-    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4  }, // English/Ireland
-    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Jamaica
-    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Malta
-    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/MarshallIslands
-    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Mauritius
-    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Namibia
-    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/NewZealand
-    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/NorthernMarianaIslands
-    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Pakistan
-    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Philippines
-    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Singapore
-    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/SouthAfrica
-    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/TrinidadAndTobago
-    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/UnitedKingdom
-    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/UnitedStatesMinorOutlyingIslands
-    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/USVirginIslands
-    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2  }, // English/Zimbabwe
-    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16  }, // Estonian/Estonia
-    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2  }, // Faroese/FaroeIslands
-    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3  }, // Finnish/Finland
-    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/France
-    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Belgium
-    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Cameroon
-    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Canada
-    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/CentralAfricanRepublic
-    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/IvoryCoast
-    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Guadeloupe
-    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Guinea
-    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Luxembourg
-    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Madagascar
-    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Mali
-    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Martinique
-    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Monaco
-    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Niger
-    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Reunion
-    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Senegal
-    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Switzerland
-    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Saint Barthelemy
-    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2  }, // French/Saint Martin
-    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2  }, // Galician/Spain
-    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2  }, // Georgian/Georgia
-    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Germany
-    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Austria
-    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Belgium
-    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Liechtenstein
-    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Luxembourg
-    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6  }, // German/Switzerland
-    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4  }, // Greek/Greece
-    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4  }, // Greek/Cyprus
-    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2  }, // Greenlandic/Greenland
-    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14  }, // Gujarati/India
-    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2  }, // Hausa/Ghana
-    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2  }, // Hausa/Niger
-    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2  }, // Hausa/Nigeria
-    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2  }, // Hausa/Sudan
-    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5  }, // Hebrew/Israel
-    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7  }, // Hindi/India
-    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3  }, // Hungarian/Hungary
-    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4  }, // Icelandic/Iceland
-    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2  }, // Indonesian/Indonesia
-    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4  }, // Irish/Ireland
-    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2  }, // Italian/Italy
-    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2  }, // Italian/Switzerland
-    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2  }, // Japanese/Japan
-    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2  }, // Kannada/India
-    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2  }, // Kazakh/Kazakhstan
-    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2  }, // Kinyarwanda/Rwanda
-    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Kirghiz/Kyrgyzstan
-    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2  }, // Korean/RepublicOfKorea
-    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2  }, // Kurdish/Iran
-    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2  }, // Kurdish/Iraq
-    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2  }, // Kurdish/SyrianArabRepublic
-    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2  }, // Kurdish/Turkey
-    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2  }, // Laothian/Lao
-    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11  }, // Latvian/Latvia
-    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2  }, // Lingala/DemocraticRepublicOfCongo
-    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2  }, // Lingala/PeoplesRepublicOfCongo
-    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6  }, // Lithuanian/Lithuania
-    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8  }, // Macedonian/Macedonia
-    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2  }, // Malagasy/Madagascar
-    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2  }, // Malay/Malaysia
-    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2  }, // Malay/BruneiDarussalam
-    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10  }, // Malayalam/India
-    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2  }, // Maltese/Malta
-    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2  }, // Maori/NewZealand
-    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2  }, // Marathi/India
-    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2  }, // Mongolian/Mongolia
-    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2  }, // Mongolian/China
-    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14  }, // Nepali/Nepal
-    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7  }, // Nepali/India
-    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2  }, // Norwegian/Norway
-    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2  }, // Occitan/France
-    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2  }, // Oriya/India
-    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4  }, // Pashto/Afghanistan
-    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10  }, // Persian/Iran
-    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10  }, // Persian/Afghanistan
-    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2  }, // Polish/Poland
-    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18  }, // Portuguese/Portugal
-    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2  }, // Portuguese/Brazil
-    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2  }, // Portuguese/GuineaBissau
-    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2  }, // Portuguese/Mozambique
-    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4  }, // Punjabi/India
-    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4  }, // Punjabi/Pakistan
-    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2  }, // RhaetoRomance/Switzerland
-    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2  }, // Romanian/Moldova
-    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2  }, // Romanian/Romania
-    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2  }, // Russian/RussianFederation
-    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2  }, // Russian/Moldova
-    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2  }, // Russian/Ukraine
-    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2  }, // Sangho/CentralAfricanRepublic
-    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Sanskrit/India
-    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7  }, // Serbian/SerbiaAndMontenegro
-    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7  }, // Serbian/BosniaAndHerzegowina
-    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7  }, // Serbian/Yugoslavia
-    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7  }, // Serbian/Montenegro
-    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7  }, // Serbian/Serbia
-    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7  }, // SerboCroatian/SerbiaAndMontenegro
-    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7  }, // SerboCroatian/BosniaAndHerzegowina
-    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7  }, // SerboCroatian/Yugoslavia
-    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2  }, // Sesotho/Lesotho
-    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2  }, // Sesotho/SouthAfrica
-    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2  }, // Setswana/SouthAfrica
-    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2  }, // Shona/Zimbabwe
-    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4  }, // Singhalese/SriLanka
-    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2  }, // Siswati/SouthAfrica
-    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2  }, // Siswati/Swaziland
-    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9  }, // Slovak/Slovakia
-    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4  }, // Slovenian/Slovenia
-    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3  }, // Somali/Somalia
-    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3  }, // Somali/Djibouti
-    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3  }, // Somali/Ethiopia
-    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3  }, // Somali/Kenya
-    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Spain
-    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Argentina
-    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Bolivia
-    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Chile
-    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Colombia
-    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/CostaRica
-    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/DominicanRepublic
-    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Ecuador
-    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/ElSalvador
-    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/EquatorialGuinea
-    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Guatemala
-    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Honduras
-    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Mexico
-    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Nicaragua
-    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Panama
-    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Paraguay
-    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Peru
-    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/PuertoRico
-    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/UnitedStates
-    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Uruguay
-    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/Venezuela
-    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4  }, // Spanish/LatinAmericaAndTheCaribbean
-    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7  }, // Swahili/Kenya
-    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7  }, // Swahili/Tanzania
-    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2  }, // Swedish/Sweden
-    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2  }, // Swedish/Finland
-    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2  }, // Tajik/Tajikistan
-    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2  }, // Tamil/India
-    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2  }, // Tamil/SriLanka
-    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Tatar/RussianFederation
-    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2  }, // Telugu/India
-    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10  }, // Thai/Thailand
-    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8  }, // Tibetan/China
-    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8  }, // Tibetan/India
-    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7  }, // Tigrinya/Eritrea
-    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7  }, // Tigrinya/Ethiopia
-    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2  }, // Tonga/Tonga
-    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2  }, // Tsonga/SouthAfrica
-    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2  }, // Turkish/Turkey
-    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Uigur/China
-    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2  }, // Ukrainian/Ukraine
-    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2  }, // Urdu/India
-    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2  }, // Urdu/Pakistan
-    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2  }, // Uzbek/Uzbekistan
-    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2  }, // Uzbek/Afghanistan
-    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2  }, // Vietnamese/VietNam
-    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2  }, // Welsh/UnitedKingdom
-    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Wolof/Senegal
-    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2  }, // Xhosa/SouthAfrica
-    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5  }, // Yoruba/Nigeria
-    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2  }, // Zulu/SouthAfrica
-    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11  }, // Nynorsk/Norway
-    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2  }, // Bosnian/BosniaAndHerzegowina
-    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Divehi/Maldives
-    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4  }, // Manx/UnitedKingdom
-    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4  }, // Cornish/UnitedKingdom
-    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2  }, // Akan/Ghana
-    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5  }, // Konkani/India
-    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2  }, // Ga/Ghana
-    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4  }, // Igbo/Nigeria
-    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7  }, // Kamba/Kenya
-    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Syriac/SyrianArabRepublic
-    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2  }, // Blin/Eritrea
-    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2  }, // Geez/Eritrea
-    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2  }, // Geez/Ethiopia
-    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2  }, // Koro/IvoryCoast
-    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2  }, // Sidamo/Ethiopia
-    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2  }, // Atsam/Nigeria
-    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2  }, // Tigre/Eritrea
-    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2  }, // Jju/Nigeria
-    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2  }, // Friulian/Italy
-    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2  }, // Venda/SouthAfrica
-    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2  }, // Ewe/Ghana
-    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2  }, // Ewe/Togo
-    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2  }, // Walamo/Ethiopia
-    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2  }, // Hawaiian/UnitedStates
-    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2  }, // Tyap/Nigeria
-    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2  }, // Chewa/Malawi
-    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2  }, // Filipino/Philippines
-    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4  }, // Swiss German/Switzerland
-    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2  }, // Sichuan Yi/China
-    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Kpelle/Guinea
-    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Kpelle/Liberia
-    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2  }, // Low German/Germany
-    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2  }, // South Ndebele/SouthAfrica
-    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2  }, // Northern Sotho/SouthAfrica
-    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2  }, // Northern Sami/Finland
-    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2  }, // Northern Sami/Norway
-    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2  }, // Taroko/Taiwan
-    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10  }, // Gusii/Kenya
-    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10  }, // Taita/Kenya
-    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7  }, // Fulah/Senegal
-    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8  }, // Kikuyu/Kenya
-    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5  }, // Samburu/Kenya
-    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2  }, // Sena/Mozambique
-    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2  }, // North Ndebele/Zimbabwe
-    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7  }, // Rombo/Tanzania
-    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8  }, // Tachelhit/Morocco
-    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9  }, // Kabyle/Algeria
-    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2  }, // Nyankole/Uganda
-    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7  }, // Bena/Tanzania
-    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9  }, // Vunjo/Tanzania
-    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2  }, // Bambara/Mali
-    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2  }, // Embu/Kenya
-    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6  }, // Cherokee/UnitedStates
-    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2  }, // Morisyen/Mauritius
-    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5  }, // Makonde/Tanzania
-    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3  }, // Langi/Tanzania
-    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2  }, // Ganda/Uganda
-    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7  }, // Bemba/Zambia
-    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2  }, // Kabuverdianu/CapeVerde
-    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2  }, // Meru/Kenya
-    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4  }, // Kalenjin/Kenya
-    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5  }, // Nama/Namibia
-    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9  }, // Machame/Tanzania
-    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2  }, // Colognian/Germany
-    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6  }, // Masai/Kenya
-    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6  }, // Masai/Tanzania
-    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6  }, // Soga/Uganda
-    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4  }, // Luyia/Kenya
-    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8  }, // Asu/Tanzania
-    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6  }, // Teso/Kenya
-    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6  }, // Teso/Uganda
-    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2  }, // Saho/Eritrea
-    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6  }, // Koyra Chiini/Mali
-    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9  }, // Rwa/Tanzania
-    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2  }, // Luo/Kenya
-    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2  }, // Chiga/Uganda
-    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10  }, // Central Morocco Tamazight/Morocco
-    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6  }, // Koyraboro Senni/Mali
-    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8  }, // Shambala/Tanzania
-    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0 }  // trailing 0s
+    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // C/AnyCountry
+    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Ethiopia
+    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Kenya
+    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6 }, // Afar/Djibouti
+    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Eritrea
+    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Ethiopia
+    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1 }, // Afrikaans/SouthAfrica
+    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Afrikaans/Namibia
+    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1 }, // Albanian/Albania
+    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6 }, // Amharic/Ethiopia
+    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/SaudiArabia
+    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Algeria
+    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Bahrain
+    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Egypt
+    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6 }, // Arabic/Iraq
+    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Jordan
+    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Kuwait
+    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1 }, // Arabic/Lebanon
+    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/LibyanArabJamahiriya
+    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Morocco
+    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Oman
+    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/Qatar
+    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Sudan
+    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7 }, // Arabic/SyrianArabRepublic
+    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6 }, // Arabic/Tunisia
+    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1 }, // Arabic/UnitedArabEmirates
+    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6 }, // Arabic/Yemen
+    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1 }, // Armenian/Armenia
+    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Assamese/India
+    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7 }, // Azerbaijani/Azerbaijan
+    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6 }, // Azerbaijani/Iran
+    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Basque/Spain
+    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1 }, // Bengali/Bangladesh
+    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7 }, // Bengali/India
+    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1 }, // Bhutani/Bhutan
+    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Breton/France
+    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1 }, // Bulgarian/Bulgaria
+    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1 }, // Burmese/Myanmar
+    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Byelorussian/Belarus
+    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1 }, // Cambodian/Cambodia
+    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Catalan/Spain
+    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/China
+    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7 }, // Chinese/HongKong
+    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Macau
+    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Singapore
+    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Taiwan
+    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1 }, // Croatian/Croatia
+    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Czech/CzechRepublic
+    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Danish/Denmark
+    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1 }, // Dutch/Netherlands
+    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Dutch/Belgium
+    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStates
+    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/AmericanSamoa
+    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Australia
+    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // English/Belgium
+    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Belize
+    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Botswana
+    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Canada
+    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Guam
+    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/HongKong
+    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7 }, // English/India
+    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Ireland
+    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Jamaica
+    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Malta
+    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/MarshallIslands
+    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1 }, // English/Mauritius
+    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Namibia
+    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7 }, // English/NewZealand
+    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/NorthernMarianaIslands
+    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7 }, // English/Pakistan
+    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Philippines
+    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Singapore
+    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1 }, // English/SouthAfrica
+    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7 }, // English/TrinidadAndTobago
+    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1 }, // English/UnitedKingdom
+    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStatesMinorOutlyingIslands
+    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/USVirginIslands
+    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Zimbabwe
+    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1 }, // Estonian/Estonia
+    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7 }, // Faroese/FaroeIslands
+    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Finnish/Finland
+    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/France
+    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Belgium
+    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Cameroon
+    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7 }, // French/Canada
+    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/CentralAfricanRepublic
+    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/IvoryCoast
+    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Guadeloupe
+    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Guinea
+    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Luxembourg
+    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Madagascar
+    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Mali
+    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Martinique
+    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Monaco
+    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Niger
+    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Reunion
+    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Senegal
+    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1 }, // French/Switzerland
+    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Barthelemy
+    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Martin
+    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Galician/Spain
+    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Georgian/Georgia
+    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Germany
+    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1 }, // German/Austria
+    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Belgium
+    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1 }, // German/Liechtenstein
+    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Luxembourg
+    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1 }, // German/Switzerland
+    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Greek/Greece
+    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1 }, // Greek/Cyprus
+    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7 }, // Greenlandic/Greenland
+    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Gujarati/India
+    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Ghana
+    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1 }, // Hausa/Niger
+    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Nigeria
+    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6 }, // Hausa/Sudan
+    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7 }, // Hebrew/Israel
+    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Hindi/India
+    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1 }, // Hungarian/Hungary
+    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7 }, // Icelandic/Iceland
+    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Indonesian/Indonesia
+    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Irish/Ireland
+    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Italian/Italy
+    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1 }, // Italian/Switzerland
+    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7 }, // Japanese/Japan
+    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kannada/India
+    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Kazakh/Kazakhstan
+    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kinyarwanda/Rwanda
+    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kirghiz/Kyrgyzstan
+    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7 }, // Korean/RepublicOfKorea
+    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iran
+    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iraq
+    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Kurdish/SyrianArabRepublic
+    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kurdish/Turkey
+    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7 }, // Laothian/Lao
+    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Latvian/Latvia
+    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Lingala/DemocraticRepublicOfCongo
+    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Lingala/PeoplesRepublicOfCongo
+    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Lithuanian/Lithuania
+    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Macedonian/Macedonia
+    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1 }, // Malagasy/Madagascar
+    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1 }, // Malay/Malaysia
+    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Malay/BruneiDarussalam
+    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7 }, // Malayalam/India
+    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Maltese/Malta
+    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Maori/NewZealand
+    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Marathi/India
+    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Mongolian/Mongolia
+    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Mongolian/China
+    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Nepali/Nepal
+    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7 }, // Nepali/India
+    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1 }, // Norwegian/Norway
+    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Occitan/France
+    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7 }, // Oriya/India
+    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Pashto/Afghanistan
+    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Iran
+    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Afghanistan
+    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1 }, // Polish/Poland
+    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Portuguese/Portugal
+    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Brazil
+    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1 }, // Portuguese/GuineaBissau
+    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Mozambique
+    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7 }, // Punjabi/India
+    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7 }, // Punjabi/Pakistan
+    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1 }, // RhaetoRomance/Switzerland
+    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Moldova
+    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Romania
+    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/RussianFederation
+    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Moldova
+    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Ukraine
+    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1 }, // Sangho/CentralAfricanRepublic
+    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7 }, // Sanskrit/India
+    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/SerbiaAndMontenegro
+    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/BosniaAndHerzegowina
+    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/Yugoslavia
+    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1 }, // Serbian/Montenegro
+    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1 }, // Serbian/Serbia
+    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/SerbiaAndMontenegro
+    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/BosniaAndHerzegowina
+    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/Yugoslavia
+    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/Lesotho
+    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/SouthAfrica
+    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Setswana/SouthAfrica
+    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7 }, // Shona/Zimbabwe
+    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1 }, // Singhalese/SriLanka
+    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/SouthAfrica
+    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/Swaziland
+    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovak/Slovakia
+    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovenian/Slovenia
+    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Somalia
+    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Djibouti
+    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Ethiopia
+    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Kenya
+    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Spain
+    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/Argentina
+    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Bolivia
+    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1 }, // Spanish/Chile
+    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/Colombia
+    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/CostaRica
+    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/DominicanRepublic
+    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Ecuador
+    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/ElSalvador
+    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/EquatorialGuinea
+    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Guatemala
+    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Honduras
+    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Mexico
+    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Nicaragua
+    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Panama
+    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1 }, // Spanish/Paraguay
+    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Peru
+    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/PuertoRico
+    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/UnitedStates
+    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1 }, // Spanish/Uruguay
+    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Venezuela
+    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/LatinAmericaAndTheCaribbean
+    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Swahili/Kenya
+    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1 }, // Swahili/Tanzania
+    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Sweden
+    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Finland
+    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1 }, // Tajik/Tajikistan
+    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tamil/India
+    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tamil/SriLanka
+    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Tatar/RussianFederation
+    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Telugu/India
+    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7 }, // Thai/Thailand
+    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/China
+    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/India
+    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Eritrea
+    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Ethiopia
+    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tonga/Tonga
+    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Tsonga/SouthAfrica
+    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1 }, // Turkish/Turkey
+    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Uigur/China
+    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1 }, // Ukrainian/Ukraine
+    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Urdu/India
+    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7 }, // Urdu/Pakistan
+    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7 }, // Uzbek/Uzbekistan
+    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Uzbek/Afghanistan
+    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1 }, // Vietnamese/VietNam
+    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1 }, // Welsh/UnitedKingdom
+    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Wolof/Senegal
+    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Xhosa/SouthAfrica
+    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1 }, // Yoruba/Nigeria
+    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Zulu/SouthAfrica
+    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Nynorsk/Norway
+    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1 }, // Bosnian/BosniaAndHerzegowina
+    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5 }, // Divehi/Maldives
+    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Manx/UnitedKingdom
+    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Cornish/UnitedKingdom
+    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Akan/Ghana
+    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Konkani/India
+    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Ga/Ghana
+    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1 }, // Igbo/Nigeria
+    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kamba/Kenya
+    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7 }, // Syriac/SyrianArabRepublic
+    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Blin/Eritrea
+    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Eritrea
+    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Ethiopia
+    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Koro/IvoryCoast
+    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Sidamo/Ethiopia
+    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Atsam/Nigeria
+    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigre/Eritrea
+    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1 }, // Jju/Nigeria
+    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Friulian/Italy
+    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Venda/SouthAfrica
+    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1 }, // Ewe/Ghana
+    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1 }, // Ewe/Togo
+    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Walamo/Ethiopia
+    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7 }, // Hawaiian/UnitedStates
+    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Tyap/Nigeria
+    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Chewa/Malawi
+    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Filipino/Philippines
+    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1 }, // Swiss German/Switzerland
+    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Sichuan Yi/China
+    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kpelle/Guinea
+    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kpelle/Liberia
+    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Low German/Germany
+    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // South Ndebele/SouthAfrica
+    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Northern Sotho/SouthAfrica
+    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Finland
+    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Norway
+    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Taroko/Taiwan
+    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Gusii/Kenya
+    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Taita/Kenya
+    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Fulah/Senegal
+    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kikuyu/Kenya
+    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Samburu/Kenya
+    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Sena/Mozambique
+    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7 }, // North Ndebele/Zimbabwe
+    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1 }, // Rombo/Tanzania
+    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Tachelhit/Morocco
+    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Kabyle/Algeria
+    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Nyankole/Uganda
+    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1 }, // Bena/Tanzania
+    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Vunjo/Tanzania
+    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1 }, // Bambara/Mali
+    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Embu/Kenya
+    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7 }, // Cherokee/UnitedStates
+    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1 }, // Morisyen/Mauritius
+    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1 }, // Makonde/Tanzania
+    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1 }, // Langi/Tanzania
+    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1 }, // Ganda/Uganda
+    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1 }, // Bemba/Zambia
+    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1 }, // Kabuverdianu/CapeVerde
+    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Meru/Kenya
+    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6 }, // Kalenjin/Kenya
+    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1 }, // Nama/Namibia
+    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Machame/Tanzania
+    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Colognian/Germany
+    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Masai/Kenya
+    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Masai/Tanzania
+    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Soga/Uganda
+    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6 }, // Luyia/Kenya
+    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1 }, // Asu/Tanzania
+    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6 }, // Teso/Kenya
+    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Teso/Uganda
+    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Saho/Eritrea
+    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyra Chiini/Mali
+    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Rwa/Tanzania
+    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6 }, // Luo/Kenya
+    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Chiga/Uganda
+    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6 }, // Central Morocco Tamazight/Morocco
+    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyraboro Senni/Mali
+    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Shambala/Tanzania
+    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s
 };
 
 static const ushort date_format_data[] = {
@@ -4315,6 +4315,411 @@ static const ushort pm_data[] = {
 0x61, 0x7a, 0x61, 0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f
 };
 
+static const ushort currency_symbol_data[] = {
+0x42, 0x72, 0x4b, 0x73, 0x68, 0x46, 0x64, 0x6a, 0x4e, 0x66, 0x6b, 0x52, 0x4e, 0x24, 0x4c, 0x65, 0x6b, 0x1265, 0x122d, 0x631,
+0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x62c, 0x2e, 0x645, 0x2e, 0x200f, 0x62f,
+0x2e, 0x639, 0x2e, 0x200f, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644, 0x2e, 0x644, 0x2e, 0x200f, 0x62f,
+0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639, 0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x644,
+0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0x564,
+0x580, 0x2e, 0x99f, 0x995, 0x9be, 0x6d, 0x61, 0x6e, 0x2e, 0x20ac, 0x9f3, 0x99f, 0x9be, 0x995, 0x9be, 0x4e, 0x75, 0x2e, 0x43b, 0x432,
+0x2e, 0x4b, 0x17db, 0xffe5, 0x24, 0x4d, 0x4f, 0x50, 0x24, 0x53, 0x24, 0x4e, 0x54, 0x24, 0x6b, 0x6e, 0x4b, 0x10d, 0x6b, 0x72,
+0x50, 0x52, 0x73, 0x4d, 0x55, 0x52, 0x73, 0x20a8, 0x20b1, 0xa3, 0x58, 0x41, 0x46, 0x43, 0x46, 0x41, 0x47, 0x4e, 0x46, 0x43,
+0x48, 0x46, 0xab0, 0xac1, 0x47, 0x48, 0x20b5, 0x20a6, 0x20aa, 0x930, 0x941, 0x2e, 0x46, 0x74, 0x52, 0x70, 0x930, 0x941, 0x442, 0x4a3,
+0x433, 0x2e, 0x52, 0x46, 0x441, 0x43e, 0x43c, 0x20a9, 0x53, 0x59, 0xa3, 0x54, 0x4c, 0x20ad, 0x4c, 0x73, 0x46, 0x46, 0x43, 0x46,
+0x41, 0x4c, 0x74, 0x52, 0x4d, 0xd30, 0xd42, 0x4e, 0x5a, 0x24, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0xfdfc,
+0x7a, 0x142, 0x52, 0x24, 0x4d, 0x54, 0x6e, 0xa30, 0xa41, 0x2e, 0x631, 0x52, 0x4f, 0x4e, 0x440, 0x443, 0x431, 0x2e, 0x20b4, 0x41a,
+0x41c, 0x2e, 0x434, 0x438, 0x43d, 0x2e, 0x4b, 0x4d, 0x55, 0x53, 0x24, 0x53, 0x4c, 0x20, 0x52, 0x65, 0x45, 0x53, 0x73, 0x68,
+0x42, 0x73, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x4c, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x20b2, 0x53, 0x2f, 0x2e, 0x42, 0x73, 0x2e,
+0x46, 0x2e, 0x54, 0x53, 0x68, 0xbb0, 0xbc2, 0x53, 0x4c, 0x52, 0x73, 0xc30, 0xc42, 0x2e, 0xe3f, 0x54, 0x24, 0x631, 0x648, 0x67e,
+0x6d2, 0x441, 0x45e, 0x43c, 0x41, 0x66, 0x20ab, 0x783, 0x2e, 0x46, 0x47, 0x4e, 0x6b, 0x72, 0x44, 0x41, 0x55, 0x53, 0x68, 0x5a,
+0x4b, 0x43, 0x56, 0x24
+};
+
+static const ushort currency_display_name_data[] = {
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69,
+0x72, 0x72, 0x69, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69,
+0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
+0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x64a, 0x627,
+0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a,
+0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648,
+0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c,
+0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f,
+0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632,
+0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631,
+0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a,
+0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647,
+0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647,
+0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647,
+0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647,
+0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62c, 0x646,
+0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
+0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x629, 0x20, 0x644,
+0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646,
+0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x629, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644,
+0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
+0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f,
+0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a,
+0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631,
+0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645,
+0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
+0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a,
+0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646,
+0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637,
+0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637,
+0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637,
+0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637,
+0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a,
+0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a,
+0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a,
+0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x62a, 0x648, 0x646, 0x633,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x62a, 0x648,
+0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
+0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a,
+0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625,
+0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b,
+0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645,
+0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20,
+0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63,
+0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x130, 0x72, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x61, 0x6c, 0x131,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x130, 0x72, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x61, 0x6c, 0x131, 0x3b, 0x9ac, 0x9be, 0x982,
+0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be,
+0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf51, 0xf44, 0xf74,
+0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x431,
+0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433,
+0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b,
+0x1015, 0x103a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440,
+0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72,
+0x6f, 0x73, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x65b0, 0x81fa, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x6b,
+0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x65, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
+0x4b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x20, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44,
+0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72,
+0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72,
+0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
+0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72,
+0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72,
+0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
+0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
+0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73,
+0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x74,
+0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77,
+0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x73, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
+0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70,
+0x65, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b,
+0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4d, 0x61, 0x75,
+0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74,
+0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69,
+0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x73, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x73, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
+0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b,
+0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x50, 0x65,
+0x73, 0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x3b,
+0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x3b,
+0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x69,
+0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69,
+0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74,
+0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74,
+0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f,
+0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x54, 0x72, 0x69,
+0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f,
+0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69,
+0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x73, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x65,
+0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
+0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
+0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x45, 0x65, 0x73,
+0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f,
+0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x69, 0x3b, 0x64, 0x6f,
+0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3,
+0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b,
+0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72,
+0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
+0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20,
+0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20,
+0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20,
+0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9,
+0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
+0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x3b, 0x61, 0x72, 0x69,
+0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79,
+0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73,
+0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69,
+0x73, 0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b,
+0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7,
+0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b,
+0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69,
+0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68,
+0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x395, 0x3c5, 0x3c1, 0x3ce, 0x3b,
+0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x69,
+0x6e, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x75,
+0x257, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54,
+0x61, 0x20, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6d, 0x20, 0x6b, 0x69, 0x6e, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5f4, 0x5d7, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd,
+0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x92f, 0x93e, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xcd, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b,
+0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73,
+0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x75, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68,
+0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72,
+0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x53, 0x76, 0x69, 0x7a, 0x7a,
+0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0xe9, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x74, 0x61, 0x73, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73,
+0x20, 0x6c, 0x69, 0x74, 0x61, 0x73, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74,
+0x61, 0x69, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x69, 0x3b, 0x41c,
+0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67,
+0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28,
+0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28,
+0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20,
+0xd30, 0xd42, 0xd2a, 0x3b, 0x45, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940,
+0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942,
+0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f,
+0x901, 0x92f, 0x93e, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b, 0x6e,
+0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65,
+0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0xb1f, 0xb19, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627,
+0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631,
+0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627,
+0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f,
+0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b,
+0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79,
+0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61,
+0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c,
+0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c,
+0x65, 0x69, 0x72, 0x6f, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x43, 0x45,
+0x41, 0x4f, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0x42, 0x43,
+0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64,
+0x65, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x20, 0x4d,
+0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64,
+0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69,
+0x63, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b,
+0xa30, 0xa41, 0xa2a, 0xa3f, 0xa2f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63,
+0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69,
+0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x6c,
+0x65, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438,
+0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441,
+0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438,
+0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440,
+0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443,
+0x431, 0x43b, 0x44f, 0x3b, 0x41c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432,
+0x43d, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41,
+0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440,
+0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d,
+0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d,
+0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e,
+0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20,
+0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x3b, 0x431,
+0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438,
+0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x430, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440,
+0x430, 0x43a, 0x430, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
+0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438,
+0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x45, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b,
+0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x421, 0x440, 0x43f, 0x441,
+0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d,
+0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440,
+0x43f, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20,
+0x434, 0x438, 0x43d, 0x430, 0x440, 0x438, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63,
+0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c,
+0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68,
+0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69,
+0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b,
+0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65,
+0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e,
+0x73, 0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f,
+0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x3b,
+0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b,
+0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61,
+0x72, 0x61, 0x6b, 0x61, 0x3b, 0x44, 0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0xdca, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72,
+0x61, 0x3b, 0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
+0x20, 0x73, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x72, 0x61,
+0x6e, 0x20, 0x4a, 0x61, 0x62, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x69, 0x72,
+0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
+0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x61,
+0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b,
+0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69,
+0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x70,
+0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
+0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d,
+0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61,
+0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61,
+0x6e, 0x6f, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65,
+0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63,
+0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73, 0x74,
+0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69,
+0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
+0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
+0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69,
+0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75,
+0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65,
+0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
+0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65,
+0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b, 0x3b, 0x71,
+0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b,
+0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61,
+0x6c, 0x74, 0x65, 0x63, 0x6f, 0x73, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75,
+0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72,
+0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64,
+0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f,
+0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
+0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f,
+0x62, 0x61, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b,
+0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67,
+0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20, 0x6f, 0x72,
+0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x62,
+0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20,
+0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20,
+0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61,
+0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72,
+0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20,
+0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c,
+0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c, 0x20,
+0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x73, 0x20, 0x73, 0x6f,
+0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72,
+0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79,
+0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73,
+0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66, 0x75, 0x65, 0x72, 0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65,
+0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66, 0x75, 0x65, 0x72,
+0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c,
+0xed, 0x76, 0x61, 0x72, 0x65, 0x73, 0x20, 0x66, 0x75, 0x65, 0x72, 0x74, 0x65, 0x73, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a,
+0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76,
+0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
+0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e,
+0x6f, 0x72, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72,
+0x6f, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf,
+0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0xf58,
+0xf7c, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440,
+0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456,
+0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x627, 0x646, 0x688, 0x6cc,
+0x646, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627,
+0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a,
+0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627,
+0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x111, 0x1ed3, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x50, 0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69,
+0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed,
+0x6c, 0x1eb9, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
+0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f,
+0x6e, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61,
+0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6d, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x331, 0x6e, 0x61,
+0x69, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x65, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x4e, 0x65, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e,
+0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70,
+0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x65, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77,
+0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63,
+0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
+0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x6e, 0x6f,
+0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
+0x69, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x77, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69,
+0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65,
+0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65,
+0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x20,
+0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x68,
+0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55,
+0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
+0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
+0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42,
+0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x13a4, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x3b, 0x13a4, 0x13c3,
+0x13cd, 0x13d7, 0x3b, 0x3b, 0x3b, 0x3b, 0x13e7, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72,
+0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72,
+0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x74,
+0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
+0x6d, 0x69, 0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61,
+0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69,
+0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c,
+0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c,
+0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43,
+0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b
+};
+
+static const ushort currency_format_data[] = {
+0x25, 0x31, 0x25, 0x32, 0x25, 0x32, 0x25, 0x31, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x28, 0x25, 0x32, 0x25, 0x31, 0x29, 0x25,
+0x32, 0xa0, 0x25, 0x31, 0x2d, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x31, 0x25, 0x32, 0x29, 0x25, 0x32, 0x2212, 0x25,
+0x31, 0x28, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x202a, 0x2212, 0x25, 0x31, 0x202c, 0xa0, 0x25,
+0x32, 0x25, 0x32, 0xa0, 0x2d, 0x25, 0x31, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x25,
+0x32, 0x2d, 0xa0, 0x25, 0x31
+};
+
 static const char language_name_list[] =
 "Default\0"
 "C\0"
-- 
cgit v0.12


From 9043d96ccbbe463b26c6d6f708a7859dffcca4fa Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 18 Feb 2011 11:12:27 +0100
Subject: Changed the qlocale autotest

Moc was failing on the string constructed using multiple quoted strings.
The following fails to parse: "foo""bar".

Reviewed-by: trustme
---
 tests/auto/qlocale/tst_qlocale.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 08c96a0..441de6d 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -2144,10 +2144,10 @@ void tst_QLocale::currency()
     QCOMPARE(ru_RU.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56\xc2\xa0\xd1\x80\xd1\x83\xd0\xb1."));
 
     const QLocale de_DE("de_DE");
-    QCOMPARE(de_DE.toCurrencyString(qulonglong(1234)), QString::fromUtf8("1234""\xc2\xa0\xe2\x82\xac"));
-    QCOMPARE(de_DE.toCurrencyString(qlonglong(-1234)), QString::fromUtf8("-1234""\xc2\xa0\xe2\x82\xac"));
-    QCOMPARE(de_DE.toCurrencyString(double(1234.56)), QString::fromUtf8("1234,56""\xc2\xa0\xe2\x82\xac"));
-    QCOMPARE(de_DE.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56""\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(qulonglong(1234)), QString::fromUtf8("1234\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(qlonglong(-1234)), QString::fromUtf8("-1234\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(double(1234.56)), QString::fromUtf8("1234,56\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56\xc2\xa0\xe2\x82\xac"));
 }
 
 QTEST_APPLESS_MAIN(tst_QLocale)
-- 
cgit v0.12


From e0f3dc3ecedb220e5bfa6a54c7c06ef4d371bcc4 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 18 Feb 2011 13:44:52 +0100
Subject: Improved locale data generator

the qlocalexml2cpp.py script takes a path to the Qt source tree and patches all
files with newly generated data automatically.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.h           |   9 +-
 src/corelib/tools/qlocale_data_p.h    |   6 +-
 util/local_database/qlocalexml2cpp.py | 296 ++++++++++++++++++++++------------
 3 files changed, 204 insertions(+), 107 deletions(-)

diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index af545f7..225ae9c 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -122,6 +122,8 @@ class Q_CORE_EXPORT QLocale
     friend class QTextStreamPrivate;
 
 public:
+// GENERATED PART STARTS HERE
+// see qlocale_data_p.h for more info on generated data
     enum Language {
         C = 1,
         Abkhazian = 2,
@@ -208,7 +210,6 @@ public:
         NauruLanguage = 83,
         Nepali = 84,
         Norwegian = 85,
-        NorwegianBokmal = Norwegian,
         Occitan = 86,
         Oriya = 87,
         Pashto = 88,
@@ -264,8 +265,7 @@ public:
         Yoruba = 138,
         Zhuang = 139,
         Zulu = 140,
-        NorwegianNynorsk = 141,
-        Nynorsk = NorwegianNynorsk, // ### obsolete
+        Nynorsk = 141,
         Bosnian = 142,
         Divehi = 143,
         Manx = 144,
@@ -339,6 +339,8 @@ public:
         CentralMoroccoTamazight = 212,
         KoyraboroSenni = 213,
         Shambala = 214,
+        NorwegianBokmal = Norwegian,
+        NorwegianNynorsk = Nynorsk,
         LastLanguage = Shambala
     };
 
@@ -592,6 +594,7 @@ public:
         LatinAmericaAndTheCaribbean = 246,
         LastCountry = LatinAmericaAndTheCaribbean
     };
+// GENERATED PART ENDS HERE
 
     enum MeasurementSystem { MetricSystem, ImperialSystem };
 
diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index ea15efb..d2a31a5 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -72,8 +72,10 @@ static const CountryLanguage ImperialMeasurementSystems[] = {
 static const int ImperialMeasurementSystemsCount =
     sizeof(ImperialMeasurementSystems)/sizeof(ImperialMeasurementSystems[0]);
 
+// GENERATED PART STARTS HERE
+
 /*
-    This part of the file was generated on 2010-05-19 from the
+    This part of the file was generated on 2011-02-18 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -6124,6 +6126,8 @@ static const unsigned char country_code_list[] =
 "419" // LatinAmericaAndTheCaribbean
 ;
 
+// GENERATED PART ENDS HERE
+
 QT_END_NAMESPACE
 
 #endif
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 494daf2..db549a6 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -40,7 +40,10 @@
 ##
 #############################################################################
 
+import os
 import sys
+import tempfile
+import datetime
 import xml.dom.minidom
 
 def check_static_char_array_length(name, array):
@@ -348,39 +351,59 @@ def currencyIsoCodeData(s):
         return ",".join(map(lambda x: str(ord(x)), s))
     return "0,0,0"
 
+def usage():
+    print "Usage: qlocalexml2cpp.py <path-to-locale.xml> <path-to-qt-src-tree>"
+    sys.exit(1)
+
+GENERATED_BLOCK_START = "// GENERATED PART STARTS HERE\n"
+GENERATED_BLOCK_END = "// GENERATED PART ENDS HERE\n"
+
 def main():
-    doc = xml.dom.minidom.parse("locale.xml")
+    if len(sys.argv) != 3:
+        usage()
+
+    localexml = sys.argv[1]
+    qtsrcdir = sys.argv[2]
+
+    if not os.path.exists(qtsrcdir) or not os.path.exists(qtsrcdir):
+        usage()
+    if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale_data_p.h"):
+        usage()
+    if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.h"):
+        usage()
+
+    (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p")
+    data_temp_file = os.fdopen(data_temp_file, "w")
+    qlocaledata_file = open(qtsrcdir + "/src/corelib/tools/qlocale_data_p.h", "r")
+    s = qlocaledata_file.readline()
+    while s and s != GENERATED_BLOCK_START:
+        data_temp_file.write(s)
+        s = qlocaledata_file.readline()
+    data_temp_file.write(GENERATED_BLOCK_START)
+
+    doc = xml.dom.minidom.parse(localexml)
     language_map = loadLanguageMap(doc)
     country_map = loadCountryMap(doc)
     default_map = loadDefaultMap(doc)
     locale_map = loadLocaleMap(doc, language_map, country_map)
     dupes = findDupes(language_map, country_map)
 
-    # Language enum
-    print "enum Language {"
-    language = ""
-    for key in language_map.keys():
-        language = fixedLanguageName(language_map[key][0], dupes)
-        print "    " + language + " = " + str(key) + ","
-    print "    LastLanguage = " + language
-    print "};"
-
-    print
-
-    # Country enum
-    print "enum Country {"
-    country = ""
-    for key in country_map.keys():
-        country = fixedCountryName(country_map[key][0], dupes)
-        print "    " + country + " = " + str(key) + ","
-    print "    LastCountry = " + country
-    print "};"
-
-    print
+    cldr_version = "1.8.1"
+    data_temp_file.write("\n\
+/*\n\
+    This part of the file was generated on %s from the\n\
+    Common Locale Data Repository v%s\n\
+\n\
+    http://www.unicode.org/cldr/\n\
+\n\
+    Do not change it, instead edit CLDR data and regenerate this file using\n\
+    cldr2qlocalexml.py and qlocalexml2cpp.py.\n\
+*/\n\n\n\
+" % (str(datetime.date.today()), cldr_version) )
 
     # Locale index
-    print "static const quint16 locale_index[] = {"
-    print "     0, // unused"
+    data_temp_file.write("static const quint16 locale_index[] = {\n")
+    data_temp_file.write("     0, // unused\n")
     index = 0
     for key in language_map.keys():
         i = 0
@@ -388,11 +411,11 @@ def main():
         if count > 0:
             i = index
             index += count
-        print "%6d, // %s" % (i, language_map[key][0])
-    print "     0 // trailing 0"
-    print "};"
+        data_temp_file.write("%6d, // %s\n" % (i, language_map[key][0]))
+    data_temp_file.write("     0 // trailing 0\n")
+    data_temp_file.write("};\n")
 
-    print
+    data_temp_file.write("\n")
 
     date_format_data = StringData()
     time_format_data = StringData()
@@ -406,8 +429,8 @@ def main():
     currency_format_data = StringData()
 
     # Locale data
-    print "static const QLocalePrivate locale_data[] = {"
-    print "//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len"
+    data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
+    data_temp_file.write("//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
 
     locale_keys = locale_map.keys()
     compareLocaleKeys.default_map = default_map
@@ -417,7 +440,7 @@ def main():
     for key in locale_keys:
         l = locale_map[key]
 
-        print "    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s" \
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s\n" \
                     % (key[0], key[1],
                         l.decimal,
                         l.group,
@@ -454,157 +477,224 @@ def main():
                         l.currencyRounding,
                         l.firstDayOfWeek,
                         l.language,
-                        l.country)
-    print "    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s"
-    print "};"
+                        l.country))
+    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Date format data
     #check_static_char_array_length("date_format", date_format_data.data)
-    print "static const ushort date_format_data[] = {"
-    print wrap_list(date_format_data.data)
-    print "};"
+    data_temp_file.write("static const ushort date_format_data[] = {\n")
+    data_temp_file.write(wrap_list(date_format_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Time format data
     #check_static_char_array_length("time_format", time_format_data.data)
-    print "static const ushort time_format_data[] = {"
-    print wrap_list(time_format_data.data)
-    print "};"
+    data_temp_file.write("static const ushort time_format_data[] = {\n")
+    data_temp_file.write(wrap_list(time_format_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Months data
     #check_static_char_array_length("months", months_data.data)
-    print "static const ushort months_data[] = {"
-    print wrap_list(months_data.data)
-    print "};"
+    data_temp_file.write("static const ushort months_data[] = {\n")
+    data_temp_file.write(wrap_list(months_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Standalone months data
     #check_static_char_array_length("standalone_months", standalone_months_data.data)
-    print "static const ushort standalone_months_data[] = {"
-    print wrap_list(standalone_months_data.data)
-    print "};"
+    data_temp_file.write("static const ushort standalone_months_data[] = {\n")
+    data_temp_file.write(wrap_list(standalone_months_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Days data
     #check_static_char_array_length("days", days_data.data)
-    print "static const ushort days_data[] = {"
-    print wrap_list(days_data.data)
-    print "};"
+    data_temp_file.write("static const ushort days_data[] = {\n")
+    data_temp_file.write(wrap_list(days_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # AM data
     #check_static_char_array_length("am", am_data.data)
-    print "static const ushort am_data[] = {"
-    print wrap_list(am_data.data)
-    print "};"
+    data_temp_file.write("static const ushort am_data[] = {\n")
+    data_temp_file.write(wrap_list(am_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # PM data
     #check_static_char_array_length("pm", am_data.data)
-    print "static const ushort pm_data[] = {"
-    print wrap_list(pm_data.data)
-    print "};"
+    data_temp_file.write("static const ushort pm_data[] = {\n")
+    data_temp_file.write(wrap_list(pm_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Currency symbol data
     #check_static_char_array_length("currency_symbol", currency_symbol_data.data)
-    print "static const ushort currency_symbol_data[] = {"
-    print wrap_list(currency_symbol_data.data)
-    print "};"
+    data_temp_file.write("static const ushort currency_symbol_data[] = {\n")
+    data_temp_file.write(wrap_list(currency_symbol_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Currency display name data
     #check_static_char_array_length("currency_display_name", currency_display_name_data.data)
-    print "static const ushort currency_display_name_data[] = {"
-    print wrap_list(currency_display_name_data.data)
-    print "};"
+    data_temp_file.write("static const ushort currency_display_name_data[] = {\n")
+    data_temp_file.write(wrap_list(currency_display_name_data.data))
+    data_temp_file.write("\n};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Currency format data
     #check_static_char_array_length("currency_format", currency_format_data.data)
-    print "static const ushort currency_format_data[] = {"
-    print wrap_list(currency_format_data.data)
-    print "};"
+    data_temp_file.write("static const ushort currency_format_data[] = {\n")
+    data_temp_file.write(wrap_list(currency_format_data.data))
+    data_temp_file.write("\n};\n")
+
+    data_temp_file.write("\n")
 
-    print
     # Language name list
-    print "static const char language_name_list[] ="
-    print "\"Default\\0\""
+    data_temp_file.write("static const char language_name_list[] =\n")
+    data_temp_file.write("\"Default\\0\"\n")
     for key in language_map.keys():
-        print "\"" + language_map[key][0] + "\\0\""
-    print ";"
+        data_temp_file.write("\"" + language_map[key][0] + "\\0\"\n")
+    data_temp_file.write(";\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Language name index
-    print "static const quint16 language_name_index[] = {"
-    print "     0, // Unused"
+    data_temp_file.write("static const quint16 language_name_index[] = {\n")
+    data_temp_file.write("     0, // Unused\n")
     index = 8
     for key in language_map.keys():
         language = language_map[key][0]
-        print "%6d, // %s" % (index, language)
+        data_temp_file.write("%6d, // %s\n" % (index, language))
         index += len(language) + 1
-    print "};"
+    data_temp_file.write("};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Country name list
-    print "static const char country_name_list[] ="
-    print "\"Default\\0\""
+    data_temp_file.write("static const char country_name_list[] =\n")
+    data_temp_file.write("\"Default\\0\"\n")
     for key in country_map.keys():
         if key == 0:
             continue
-        print "\"" + country_map[key][0] + "\\0\""
-    print ";"
+        data_temp_file.write("\"" + country_map[key][0] + "\\0\"\n")
+    data_temp_file.write(";\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Country name index
-    print "static const quint16 country_name_index[] = {"
-    print "     0, // AnyCountry"
+    data_temp_file.write("static const quint16 country_name_index[] = {\n")
+    data_temp_file.write("     0, // AnyCountry\n")
     index = 8
     for key in country_map.keys():
         if key == 0:
             continue
         country = country_map[key][0]
-        print "%6d, // %s" % (index, country)
+        data_temp_file.write("%6d, // %s\n" % (index, country))
         index += len(country) + 1
-    print "};"
+    data_temp_file.write("};\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Language code list
-    print "static const unsigned char language_code_list[] ="
-    print "\"  \\0\" // Unused"
+    data_temp_file.write("static const unsigned char language_code_list[] =\n")
+    data_temp_file.write("\"  \\0\" // Unused\n")
     for key in language_map.keys():
         code = language_map[key][1]
         if len(code) == 2:
             code += r"\0"
-        print "\"%2s\" // %s" % (code, language_map[key][0])
-    print ";"
+        data_temp_file.write("\"%2s\" // %s\n" % (code, language_map[key][0]))
+    data_temp_file.write(";\n")
 
-    print
+    data_temp_file.write("\n")
 
     # Country code list
-    print "static const unsigned char country_code_list[] ="
+    data_temp_file.write("static const unsigned char country_code_list[] =\n")
     for key in country_map.keys():
         code = country_map[key][1]
         if len(code) == 2:
             code += "\\0"
-        print "\"%2s\" // %s" % (code, country_map[key][0])
-    print ";"
+        data_temp_file.write("\"%2s\" // %s\n" % (code, country_map[key][0]))
+    data_temp_file.write(";\n")
+
+    data_temp_file.write("\n")
+    data_temp_file.write(GENERATED_BLOCK_END)
+    s = qlocaledata_file.readline()
+    # skip until end of the block
+    while s and s != GENERATED_BLOCK_END:
+        s = qlocaledata_file.readline()
+
+    s = qlocaledata_file.readline()
+    while s:
+        data_temp_file.write(s)
+        s = qlocaledata_file.readline()
+    data_temp_file.close()
+    qlocaledata_file.close()
+
+    os.rename(data_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale_data_p.h")
+
+    # qlocale.h
+
+    (qlocale_temp_file, qlocale_temp_file_path) = tempfile.mkstemp("qlocale.h")
+    qlocale_temp_file = os.fdopen(qlocale_temp_file, "w")
+    qlocale_file = open(qtsrcdir + "/src/corelib/tools/qlocale.h", "r")
+    s = qlocale_file.readline()
+    while s and s != GENERATED_BLOCK_START:
+        qlocale_temp_file.write(s)
+        s = qlocale_file.readline()
+    qlocale_temp_file.write(GENERATED_BLOCK_START)
+    qlocale_temp_file.write("// see qlocale_data_p.h for more info on generated data\n")
+
+    # Language enum
+    qlocale_temp_file.write("    enum Language {\n")
+    language = ""
+    for key in language_map.keys():
+        language = fixedLanguageName(language_map[key][0], dupes)
+        qlocale_temp_file.write("        " + language + " = " + str(key) + ",\n")
+    # special cases for norwegian. we really need to make it right at some point.
+    qlocale_temp_file.write("        NorwegianBokmal = Norwegian,\n")
+    qlocale_temp_file.write("        NorwegianNynorsk = Nynorsk,\n")
+    qlocale_temp_file.write("        LastLanguage = " + language + "\n")
+    qlocale_temp_file.write("    };\n")
+
+    qlocale_temp_file.write("\n")
+
+    # Country enum
+    qlocale_temp_file.write("    enum Country {\n")
+    country = ""
+    for key in country_map.keys():
+        country = fixedCountryName(country_map[key][0], dupes)
+        qlocale_temp_file.write("        " + country + " = " + str(key) + ",\n")
+    qlocale_temp_file.write("        LastCountry = " + country + "\n")
+    qlocale_temp_file.write("    };\n")
+
+    qlocale_temp_file.write(GENERATED_BLOCK_END)
+    s = qlocale_file.readline()
+    # skip until end of the block
+    while s and s != GENERATED_BLOCK_END:
+        s = qlocale_file.readline()
+
+    s = qlocale_file.readline()
+    while s:
+        qlocale_temp_file.write(s)
+        s = qlocale_file.readline()
+    qlocale_temp_file.close()
+    qlocale_file.close()
+
+    os.rename(qlocale_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.h")
 
 
 if __name__ == "__main__":
-- 
cgit v0.12


From bd7dd9744bb966ea0ff9c6a2ac3c7a4bfa485225 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 18 Feb 2011 15:25:11 +0100
Subject: In the generated locale data add the version info automatically.

Reviewed-by: Zeno Albisser
---
 util/local_database/cldr2qlocalexml.py | 7 +++++++
 util/local_database/qlocalexml2cpp.py  | 3 ++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index 311cf4e..b873565 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -455,7 +455,14 @@ integrateWeekData(cldr_dir+"/../supplemental/supplementalData.xml")
 locale_keys = locale_database.keys()
 locale_keys.sort()
 
+cldr_version = 'unknown'
+ldml = open(cldr_dir+"/../dtd/ldml.dtd", "r")
+for line in ldml:
+    if 'version cldrVersion CDATA #FIXED' in line:
+        cldr_version = line.split('"')[1]
+
 print "<localeDatabase>"
+print "    <version>" + cldr_version + "</version>"
 print "    <languageList>"
 for id in enumdata.language_list:
     l = enumdata.language_list[id]
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index db549a6..edae39c 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -388,7 +388,8 @@ def main():
     locale_map = loadLocaleMap(doc, language_map, country_map)
     dupes = findDupes(language_map, country_map)
 
-    cldr_version = "1.8.1"
+    cldr_version = eltText(firstChildElt(doc.documentElement, "version"))
+
     data_temp_file.write("\n\
 /*\n\
     This part of the file was generated on %s from the\n\
-- 
cgit v0.12


From 368a3259aa678e013078f8bb16a8de173d74759a Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 21 Feb 2011 11:33:43 +0100
Subject: Another improvement to the CLDR parser/QLocale data generator

Include the CLDR version used in the QLocale documentation.

Reviewed-by: trustme
---
 util/local_database/qlocalexml2cpp.py | 75 ++++++++++++++++++++++-------------
 1 file changed, 47 insertions(+), 28 deletions(-)

diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index edae39c..2f998f3 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -371,6 +371,8 @@ def main():
         usage()
     if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.h"):
         usage()
+    if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.cpp"):
+        usage()
 
     (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p")
     data_temp_file = os.fdopen(data_temp_file, "w")
@@ -649,54 +651,71 @@ def main():
 
     # qlocale.h
 
-    (qlocale_temp_file, qlocale_temp_file_path) = tempfile.mkstemp("qlocale.h")
-    qlocale_temp_file = os.fdopen(qlocale_temp_file, "w")
-    qlocale_file = open(qtsrcdir + "/src/corelib/tools/qlocale.h", "r")
-    s = qlocale_file.readline()
+    (qlocaleh_temp_file, qlocaleh_temp_file_path) = tempfile.mkstemp("qlocale.h")
+    qlocaleh_temp_file = os.fdopen(qlocaleh_temp_file, "w")
+    qlocaleh_file = open(qtsrcdir + "/src/corelib/tools/qlocale.h", "r")
+    s = qlocaleh_file.readline()
     while s and s != GENERATED_BLOCK_START:
-        qlocale_temp_file.write(s)
-        s = qlocale_file.readline()
-    qlocale_temp_file.write(GENERATED_BLOCK_START)
-    qlocale_temp_file.write("// see qlocale_data_p.h for more info on generated data\n")
+        qlocaleh_temp_file.write(s)
+        s = qlocaleh_file.readline()
+    qlocaleh_temp_file.write(GENERATED_BLOCK_START)
+    qlocaleh_temp_file.write("// see qlocale_data_p.h for more info on generated data\n")
 
     # Language enum
-    qlocale_temp_file.write("    enum Language {\n")
+    qlocaleh_temp_file.write("    enum Language {\n")
     language = ""
     for key in language_map.keys():
         language = fixedLanguageName(language_map[key][0], dupes)
-        qlocale_temp_file.write("        " + language + " = " + str(key) + ",\n")
+        qlocaleh_temp_file.write("        " + language + " = " + str(key) + ",\n")
     # special cases for norwegian. we really need to make it right at some point.
-    qlocale_temp_file.write("        NorwegianBokmal = Norwegian,\n")
-    qlocale_temp_file.write("        NorwegianNynorsk = Nynorsk,\n")
-    qlocale_temp_file.write("        LastLanguage = " + language + "\n")
-    qlocale_temp_file.write("    };\n")
+    qlocaleh_temp_file.write("        NorwegianBokmal = Norwegian,\n")
+    qlocaleh_temp_file.write("        NorwegianNynorsk = Nynorsk,\n")
+    qlocaleh_temp_file.write("        LastLanguage = " + language + "\n")
+    qlocaleh_temp_file.write("    };\n")
 
-    qlocale_temp_file.write("\n")
+    qlocaleh_temp_file.write("\n")
 
     # Country enum
-    qlocale_temp_file.write("    enum Country {\n")
+    qlocaleh_temp_file.write("    enum Country {\n")
     country = ""
     for key in country_map.keys():
         country = fixedCountryName(country_map[key][0], dupes)
-        qlocale_temp_file.write("        " + country + " = " + str(key) + ",\n")
-    qlocale_temp_file.write("        LastCountry = " + country + "\n")
-    qlocale_temp_file.write("    };\n")
+        qlocaleh_temp_file.write("        " + country + " = " + str(key) + ",\n")
+    qlocaleh_temp_file.write("        LastCountry = " + country + "\n")
+    qlocaleh_temp_file.write("    };\n")
 
-    qlocale_temp_file.write(GENERATED_BLOCK_END)
-    s = qlocale_file.readline()
+    qlocaleh_temp_file.write(GENERATED_BLOCK_END)
+    s = qlocaleh_file.readline()
     # skip until end of the block
     while s and s != GENERATED_BLOCK_END:
-        s = qlocale_file.readline()
+        s = qlocaleh_file.readline()
 
-    s = qlocale_file.readline()
+    s = qlocaleh_file.readline()
     while s:
-        qlocale_temp_file.write(s)
-        s = qlocale_file.readline()
-    qlocale_temp_file.close()
-    qlocale_file.close()
+        qlocaleh_temp_file.write(s)
+        s = qlocaleh_file.readline()
+    qlocaleh_temp_file.close()
+    qlocaleh_file.close()
+
+    os.rename(qlocaleh_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.h")
+
+    # qlocale.cpp
 
-    os.rename(qlocale_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.h")
+    (qlocalecpp_temp_file, qlocalecpp_temp_file_path) = tempfile.mkstemp("qlocale.cpp")
+    qlocalecpp_temp_file = os.fdopen(qlocalecpp_temp_file, "w")
+    qlocalecpp_file = open(qtsrcdir + "/src/corelib/tools/qlocale.cpp", "r")
+    s = qlocalecpp_file.readline()
+    DOCSTRING="    QLocale's data is based on Common Locale Data Repository "
+    while s:
+        if DOCSTRING in s:
+            qlocalecpp_temp_file.write(DOCSTRING + "v" + cldr_version + ".\n")
+        else:
+            qlocalecpp_temp_file.write(s)
+        s = qlocalecpp_file.readline()
+    qlocalecpp_temp_file.close()
+    qlocalecpp_file.close()
 
+    os.rename(qlocalecpp_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.cpp")
 
 if __name__ == "__main__":
     main()
-- 
cgit v0.12


From 975a51fbe914cf0afd7bde1bf50d1f1f28d12dd7 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 17 Feb 2011 16:02:55 +0000
Subject: Remove open C setdefaultif support from symbian QNetworkSession

Qt no longer uses open C sockets

Reviewed-by: Markus Goetz
---
 .../bearer/symbian/qnetworksession_impl.cpp        | 68 +---------------------
 src/plugins/bearer/symbian/qnetworksession_impl.h  |  3 -
 2 files changed, 3 insertions(+), 68 deletions(-)

diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index e35c01a..950997f 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -45,8 +45,6 @@
 #include <es_enum.h>
 #include <es_sock.h>
 #include <in_sock.h>
-#include <stdapis/sys/socket.h>
-#include <stdapis/net/if.h>
 #include <private/qcore_symbian_p.h>
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
@@ -63,29 +61,16 @@ QT_BEGIN_NAMESPACE
 
 QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
 :   CActive(CActive::EPriorityUserInput), engine(engine),
-    iDynamicUnSetdefaultif(0), ipConnectionNotifier(0),
+    iSocketServ(qt_symbianGetSocketServer()), ipConnectionNotifier(0),
     iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false),
     iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0),
-    iConnectInBackground(false), isOpening(false), iSocketServ(qt_symbianGetSocketServer())
+    iConnectInBackground(false), isOpening(false)
 {
     CActiveScheduler::Add(this);
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
     iMobility = NULL;
 #endif
-    // Try to load "Open C" dll dynamically and
-    // try to attach to unsetdefaultif function dynamically.
-    // This is to avoid build breaks with old OpenC versions.
-    if (iOpenCLibrary.Load(_L("libc")) == KErrNone) {
-        iDynamicUnSetdefaultif = (TOpenCUnSetdefaultifFunction)iOpenCLibrary.Lookup(597);
-    }
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
-    qDebug() << "QNS this : " << QString::number((uint)this) << " - ";
-    if (iDynamicUnSetdefaultif)
-        qDebug() << "dynamic unsetdefaultif() is present in PIPS library. ";
-    else
-        qDebug() << "dynamic unsetdefaultif() not present in PIPS library. ";
-#endif
 
     TRAP_IGNORE(iConnectionMonitor.ConnectL());
 }
@@ -111,16 +96,12 @@ QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
     // Cancel possible RConnection::Start()
     Cancel();
 
-    // Close global 'Open C' RConnection
-    // Clears also possible unsetdefaultif() flags.
-    setdefaultif(0);
     QSymbianSocketManager::instance().setDefaultConnection(0);
 
     iConnectionMonitor.Close();
-    iOpenCLibrary.Close();
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
     qDebug() << "QNS this : " << QString::number((uint)this)
-             << " - destroyed (and setdefaultif(0))";
+             << " - destroyed";
 #endif
 }
 
@@ -524,16 +505,6 @@ void QNetworkSessionPrivateImpl::close(bool allowSignals)
     
     Cancel(); // closes iConnection
 
-    // Close global 'Open C' RConnection. If OpenC supports,
-    // close the defaultif for good to avoid difficult timing
-    // and bouncing issues of network going immediately back up
-    //  because of e.g. select() thread etc.
-    if (iDynamicUnSetdefaultif) {
-        iDynamicUnSetdefaultif();
-    } else {
-        setdefaultif(0);
-    }
-
     QSymbianSocketManager::instance().setDefaultConnection(0);
     // If UserChoice, go down immediately. If some other configuration,
     // go down immediately if there is no reports expected from the platform;
@@ -629,13 +600,6 @@ void QNetworkSessionPrivateImpl::migrate()
 {
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
     if (iMobility) {
-        // Close global 'Open C' RConnection. If openC supports, use the 'heavy'
-        // version to block all subsequent requests.
-        if (iDynamicUnSetdefaultif) {
-            iDynamicUnSetdefaultif();
-        } else {
-            setdefaultif(0);
-        }
         QSymbianSocketManager::instance().setDefaultConnection(0);
         // Start migrating to new IAP
         iMobility->MigrateToPreferredCarrier();
@@ -666,13 +630,6 @@ void QNetworkSessionPrivateImpl::accept()
 
         QNetworkConfiguration newActiveConfig = activeConfiguration(iNewRoamingIap);
 
-        // Use name of the new IAP to open global 'Open C' RConnection
-        QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
-        ifreq ifr;
-        memset(&ifr, 0, sizeof(struct ifreq));
-        strcpy(ifr.ifr_name, nameAsByteArray.constData());
-        setdefaultif(&ifr);
-
         QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
 
         newState(QNetworkSession::Connected, iNewRoamingIap);
@@ -691,13 +648,6 @@ void QNetworkSessionPrivateImpl::reject()
         } else {
             QNetworkConfiguration newActiveConfig = activeConfiguration(iOldRoamingIap);
 
-            // Use name of the old IAP to open global 'Open C' RConnection
-            QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
-            ifreq ifr;
-            memset(&ifr, 0, sizeof(struct ifreq));
-            strcpy(ifr.ifr_name, nameAsByteArray.constData());
-            setdefaultif(&ifr);
-
             QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
 
             newState(QNetworkSession::Connected, iOldRoamingIap);
@@ -1080,12 +1030,6 @@ void QNetworkSessionPrivateImpl::RunL()
                 // Connectivity Test, ICT, failed).
                 error = KErrGeneral;
             } else {
-                // Use name of the IAP to open global 'Open C' RConnection
-                ifreq ifr;
-                memset(&ifr, 0, sizeof(struct ifreq));
-                QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
-                strcpy(ifr.ifr_name, nameAsByteArray.constData());
-                error = setdefaultif(&ifr);
                 QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
             }
             if (error != KErrNone) {
@@ -1208,12 +1152,6 @@ bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint
 #endif
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
-        // Use name of the IAP to set default IAP
-        QByteArray nameAsByteArray = activeConfig.name().toUtf8();
-        ifreq ifr;
-        strcpy(ifr.ifr_name, nameAsByteArray.constData());
-
-        setdefaultif(&ifr);
         QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
 #endif
     }
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index f2a8a45..5aa142f 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -160,9 +160,6 @@ private: // data
 
     QDateTime startTime;
 
-    RLibrary iOpenCLibrary;
-    TOpenCUnSetdefaultifFunction iDynamicUnSetdefaultif;
-
     mutable RSocketServ &iSocketServ; //not owned, shared from QtCore
     mutable RConnection iConnection;
     mutable RConnectionMonitor iConnectionMonitor;
-- 
cgit v0.12


From f5e7b6c64caa67bf11fa9754114d686da73b22d6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 18 Feb 2011 16:47:39 +0000
Subject: Fix RConnection handle leak in symbian bearer plugin

The implementation was opening RConnection handles on top of previous
instances, and not closing RConnection handles. Both of these cause a
resource leak in the socket server which cannot clean up the connection
until the Qt process has exited.
After a lot of this (which could be triggered by the QNetworkReply auto
test), the socket server may run out of memory resulting in all socket
operations failing.

Reviewed-by: Markus Goetz
---
 .../bearer/symbian/qnetworksession_impl.cpp        | 95 +++++++++-------------
 src/plugins/bearer/symbian/qnetworksession_impl.h  |  1 +
 2 files changed, 40 insertions(+), 56 deletions(-)

diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 950997f..760c0e7 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -75,32 +75,43 @@ QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
     TRAP_IGNORE(iConnectionMonitor.ConnectL());
 }
 
-QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
+void QNetworkSessionPrivateImpl::closeHandles()
 {
-    isOpen = false;
-    isOpening = false;
-
     // Cancel Connection Progress Notifications first.
-    // Note: ConnectionNotifier must be destroyed before Canceling RConnection::Start()
+    // Note: ConnectionNotifier must be destroyed before RConnection::Close()
     //       => deleting ipConnectionNotifier results RConnection::CancelProgressNotification()
     delete ipConnectionNotifier;
     ipConnectionNotifier = NULL;
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
-    if (iMobility) {
-        delete iMobility;
-        iMobility = NULL;
-    }
+    // mobility monitor must be deleted before RConnection is closed
+    delete iMobility;
+    iMobility = NULL;
 #endif
 
-    // Cancel possible RConnection::Start()
+    // Cancel possible RConnection::Start() - may call RConnection::Close if Start was in progress
     Cancel();
+    //close any open connection (note Close twice is safe in case Cancel did it above)
+    iConnection.Close();
 
     QSymbianSocketManager::instance().setDefaultConnection(0);
 
     iConnectionMonitor.Close();
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
     qDebug() << "QNS this : " << QString::number((uint)this)
+             << " - handles closed";
+#endif
+
+}
+
+QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
+{
+    isOpen = false;
+    isOpening = false;
+
+    closeHandles();
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+    qDebug() << "QNS this : " << QString::number((uint)this)
              << " - destroyed";
 #endif
 }
@@ -148,7 +159,7 @@ void QNetworkSessionPrivateImpl::configurationAdded(QNetworkConfigurationPrivate
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
         qDebug() << "QNS this : " << QString::number((uint)this) << " - "
                  << "configurationAdded IAP: "
-                 << toSymbianConfig(privateConfiguration(config))->numericIdentifier();
+                 << toSymbianConfig(config)->numericIdentifier();
 #endif
 
         syncStateWithInterface();
@@ -345,6 +356,7 @@ void QNetworkSessionPrivateImpl::open()
     iStoppedByUser = false;
     iClosedByUser = false;
 
+    Q_ASSERT(!iConnection.SubSessionHandle());
     TInt error = iConnection.Open(iSocketServ);
     if (error != KErrNone) {
         // Could not open RConnection
@@ -385,8 +397,8 @@ void QNetworkSessionPrivateImpl::open()
 
             pref.SetIapId(symbianConfig->numericIdentifier());
 #endif
-            iConnection.Start(pref, iStatus);
             if (!IsActive()) {
+                iConnection.Start(pref, iStatus);
                 SetActive();
             }
             // Avoid flip flop of states if the configuration is already
@@ -413,8 +425,8 @@ void QNetworkSessionPrivateImpl::open()
 #else
         TConnSnapPref snapPref(symbianConfig->numericIdentifier());
 #endif
-        iConnection.Start(snapPref, iStatus);
         if (!IsActive()) {
+            iConnection.Start(snapPref, iStatus);
             SetActive();
         }
         // Avoid flip flop of states if the configuration is already
@@ -424,8 +436,8 @@ void QNetworkSessionPrivateImpl::open()
         }
     } else if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
         iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers();
-        iConnection.Start(iStatus);
         if (!IsActive()) {
+            iConnection.Start(iStatus);
             SetActive();
         }
         newState(QNetworkSession::Connecting);
@@ -436,9 +448,7 @@ void QNetworkSessionPrivateImpl::open()
         isOpening = false;
         iError = QNetworkSession::UnknownSessionError;
         emit QNetworkSessionPrivate::error(iError);
-        if (ipConnectionNotifier) {
-            ipConnectionNotifier->StopNotifications();
-        }
+        closeHandles();
         syncStateWithInterface();    
     }
 }
@@ -490,22 +500,11 @@ void QNetworkSessionPrivateImpl::close(bool allowSignals)
 
     serviceConfig = QNetworkConfiguration();
     
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
-    if (iMobility) {
-        delete iMobility;
-        iMobility = NULL;
-    }
-#endif
+    closeHandles();
 
-    if (ipConnectionNotifier && !iHandleStateNotificationsFromManager) {
-        ipConnectionNotifier->StopNotifications();
-        // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
-        iHandleStateNotificationsFromManager = true;
-    }
-    
-    Cancel(); // closes iConnection
+    // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
+    iHandleStateNotificationsFromManager = true;
 
-    QSymbianSocketManager::instance().setDefaultConnection(0);
     // If UserChoice, go down immediately. If some other configuration,
     // go down immediately if there is no reports expected from the platform;
     // in practice Connection Monitor is aware of connections only after
@@ -701,12 +700,14 @@ void QNetworkSessionPrivateImpl::NewCarrierActive(TAccessPointInfo /*aNewAPInfo*
     }
 }
 
-void QNetworkSessionPrivateImpl::Error(TInt /*aError*/)
+void QNetworkSessionPrivateImpl::Error(TInt aError)
 {
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
     qDebug() << "QNS this : " << QString::number((uint)this) << " - "
-            << "roaming Error() occurred, isOpen is: " << isOpen;
+            << "roaming Error() occurred" << aError << ", isOpen is: " << isOpen;
 #endif
+    if (aError == KErrCancel)
+        return; //avoid recursive deletion
     if (isOpen) {
         isOpen = false;
         isOpening = false;
@@ -714,10 +715,7 @@ void QNetworkSessionPrivateImpl::Error(TInt /*aError*/)
         serviceConfig = QNetworkConfiguration();
         iError = QNetworkSession::RoamingError;
         emit QNetworkSessionPrivate::error(iError);
-        Cancel();
-        if (ipConnectionNotifier) {
-            ipConnectionNotifier->StopNotifications();
-        }
+        closeHandles();
         QT_TRY {
             syncStateWithInterface();
             // In some cases IAP is still in Connected state when
@@ -1037,19 +1035,13 @@ void QNetworkSessionPrivateImpl::RunL()
                 isOpening = false;
                 iError = QNetworkSession::UnknownSessionError;
                 QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
-                if (ipConnectionNotifier) {
-                    ipConnectionNotifier->StopNotifications();
-                }
+                closeHandles();
                 if (!newActiveConfig.isValid()) {
                     // No valid configuration, bail out.
                     // Status updates from QNCM won't be received correctly
                     // because there is no configuration to associate them with so transit here.
-                    QSymbianSocketManager::instance().setDefaultConnection(0);
-                    iConnection.Close();
                     newState(QNetworkSession::Closing);
                     newState(QNetworkSession::Disconnected);
-                } else {
-                    Cancel();
                 }
                 QT_TRYCATCH_LEAVING(syncStateWithInterface());
                 return;
@@ -1092,10 +1084,7 @@ void QNetworkSessionPrivateImpl::RunL()
             serviceConfig = QNetworkConfiguration();
             iError = QNetworkSession::InvalidConfigurationError;
             QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
-            if (ipConnectionNotifier) {
-                ipConnectionNotifier->StopNotifications();
-            }
-            Cancel();
+            closeHandles();
             QT_TRYCATCH_LEAVING(syncStateWithInterface());
             break;
         case KErrCancel: // Connection attempt cancelled
@@ -1114,10 +1103,7 @@ void QNetworkSessionPrivateImpl::RunL()
                 iError = QNetworkSession::UnknownSessionError;
             }
             QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
-            if (ipConnectionNotifier) {
-                ipConnectionNotifier->StopNotifications();
-            }
-            Cancel();
+            closeHandles();
             QT_TRYCATCH_LEAVING(syncStateWithInterface());
             break;
     }
@@ -1204,10 +1190,7 @@ bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint
         serviceConfig = QNetworkConfiguration();
         iError = QNetworkSession::SessionAbortedError;
         emit QNetworkSessionPrivate::error(iError);
-        if (ipConnectionNotifier) {
-            ipConnectionNotifier->StopNotifications();
-        }
-        Cancel();
+        closeHandles();
         // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
         iHandleStateNotificationsFromManager = true;
         emitSessionClosed = true; // Emit SessionClosed after state change has been reported
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index 5aa142f..13980e9 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -150,6 +150,7 @@ private:
     bool easyWlanTrueIapId(TUint32 &trueIapId) const;
 #endif
 
+    void closeHandles();
 
 private: // data
     SymbianEngine *engine;
-- 
cgit v0.12


From 5a6365f14006ab50854e41a5927645c7e9966756 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 18 Feb 2011 17:22:32 +0000
Subject: Refactor dangerous multiple inheritance

QObject and CBase both expect to be the root class of the object hierarchy
so it can cause problems if they are used in multiple inheritance.

Refactored the CActive used for starting RConnection into a helper class.

Reviewed-by: Markus Goetz
---
 .../bearer/symbian/qnetworksession_impl.cpp        | 82 ++++++++++++++++------
 src/plugins/bearer/symbian/qnetworksession_impl.h  | 29 ++++++--
 2 files changed, 86 insertions(+), 25 deletions(-)

diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 760c0e7..5325293 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -60,13 +60,12 @@
 QT_BEGIN_NAMESPACE
 
 QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
-:   CActive(CActive::EPriorityUserInput), engine(engine),
-    iSocketServ(qt_symbianGetSocketServer()), ipConnectionNotifier(0),
+:   engine(engine), iSocketServ(qt_symbianGetSocketServer()),
+    ipConnectionNotifier(0), ipConnectionStarter(0),
     iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false),
     iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0),
     iConnectInBackground(false), isOpening(false)
 {
-    CActiveScheduler::Add(this);
 
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
     iMobility = NULL;
@@ -90,7 +89,8 @@ void QNetworkSessionPrivateImpl::closeHandles()
 #endif
 
     // Cancel possible RConnection::Start() - may call RConnection::Close if Start was in progress
-    Cancel();
+    delete ipConnectionStarter;
+    ipConnectionStarter = 0;
     //close any open connection (note Close twice is safe in case Cancel did it above)
     iConnection.Close();
 
@@ -397,9 +397,9 @@ void QNetworkSessionPrivateImpl::open()
 
             pref.SetIapId(symbianConfig->numericIdentifier());
 #endif
-            if (!IsActive()) {
-                iConnection.Start(pref, iStatus);
-                SetActive();
+            if (!ipConnectionStarter) {
+                ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+                ipConnectionStarter->Start(pref);
             }
             // Avoid flip flop of states if the configuration is already
             // active. IsOpen/opened() will indicate when ready.
@@ -425,9 +425,9 @@ void QNetworkSessionPrivateImpl::open()
 #else
         TConnSnapPref snapPref(symbianConfig->numericIdentifier());
 #endif
-        if (!IsActive()) {
-            iConnection.Start(snapPref, iStatus);
-            SetActive();
+        if (!ipConnectionStarter) {
+            ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+            ipConnectionStarter->Start(snapPref);
         }
         // Avoid flip flop of states if the configuration is already
         // active. IsOpen/opened() will indicate when ready.
@@ -436,9 +436,9 @@ void QNetworkSessionPrivateImpl::open()
         }
     } else if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
         iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers();
-        if (!IsActive()) {
-            iConnection.Start(iStatus);
-            SetActive();
+        if (!ipConnectionStarter) {
+            ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+            ipConnectionStarter->Start();
         }
         newState(QNetworkSession::Connecting);
     }
@@ -1007,13 +1007,14 @@ QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 ia
     return publicConfig;
 }
 
-void QNetworkSessionPrivateImpl::RunL()
+void QNetworkSessionPrivateImpl::ConnectionStartComplete(TInt statusCode)
 {
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
     qDebug() << "QNS this : " << QString::number((uint)this) << " - "
-            << "RConnection::RunL with status code: " << iStatus.Int();
+            << "RConnection::Start completed with status code: " << statusCode;
 #endif
-    TInt statusCode = iStatus.Int();
+    delete ipConnectionStarter;
+    ipConnectionStarter = 0;
 
     switch (statusCode) {
         case KErrNone: // Connection created successfully
@@ -1109,11 +1110,6 @@ void QNetworkSessionPrivateImpl::RunL()
     }
 }
 
-void QNetworkSessionPrivateImpl::DoCancel()
-{
-    iConnection.Close();
-}
-
 // Enters newState if feasible according to current state.
 // AccessPointId may be given as parameter. If it is zero, state-change is assumed to
 // concern this session's configuration. If non-zero, the configuration is looked up
@@ -1500,6 +1496,50 @@ void ConnectionProgressNotifier::RunL()
     }
 }
 
+ConnectionStarter::ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection)
+    : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection)
+{
+    CActiveScheduler::Add(this);
+}
+
+ConnectionStarter::~ConnectionStarter()
+{
+    Cancel();
+}
+
+void ConnectionStarter::Start()
+{
+    if (!IsActive()) {
+        iConnection.Start(iStatus);
+        SetActive();
+    }
+}
+
+void ConnectionStarter::Start(TConnPref &pref)
+{
+    if (!IsActive()) {
+        iConnection.Start(pref, iStatus);
+        SetActive();
+    }
+}
+
+void ConnectionStarter::RunL()
+{
+    iOwner.ConnectionStartComplete(iStatus.Int());
+    //note owner deletes on callback
+}
+
+TInt ConnectionStarter::RunError(TInt err)
+{
+    qWarning() << "ConnectionStarter::RunError" << err;
+    return KErrNone;
+}
+
+void ConnectionStarter::DoCancel()
+{
+    iConnection.Close();
+}
+
 QT_END_NAMESPACE
 
 #endif //QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index 13980e9..2dda456 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -68,11 +68,12 @@
 QT_BEGIN_NAMESPACE
 
 class ConnectionProgressNotifier;
+class ConnectionStarter;
 class SymbianEngine;
 
 typedef void (*TOpenCUnSetdefaultifFunction)();
 
-class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate, public CActive
+class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
                                  , public MMobilityProtocolResp
 #endif
@@ -126,7 +127,7 @@ public: // From MMobilityProtocolResp
 #endif    
 
 protected: // From CActive
-    void RunL();
+    void ConnectionStartComplete(TInt statusCode);
     void DoCancel();
     
 private Q_SLOTS:
@@ -165,12 +166,13 @@ private: // data
     mutable RConnection iConnection;
     mutable RConnectionMonitor iConnectionMonitor;
     ConnectionProgressNotifier* ipConnectionNotifier;
-    
+    ConnectionStarter* ipConnectionStarter;
+
     bool iHandleStateNotificationsFromManager;
     bool iFirstSync;
     bool iStoppedByUser;
     bool iClosedByUser;
-    
+
 #ifdef SNAP_FUNCTIONALITY_AVAILABLE    
     CActiveCommsMobilityApiExt* iMobility;
 #endif    
@@ -188,6 +190,7 @@ private: // data
     bool isOpening;
 
     friend class ConnectionProgressNotifier;
+    friend class ConnectionStarter;
 };
 
 class ConnectionProgressNotifier : public CActive
@@ -210,6 +213,24 @@ private: // Data
     
 };
 
+class ConnectionStarter : public CActive
+{
+public:
+    ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection);
+    ~ConnectionStarter();
+
+    void Start();
+    void Start(TConnPref &pref);
+protected:
+    void RunL();
+    TInt RunError(TInt err);
+    void DoCancel();
+
+private: // Data
+    QNetworkSessionPrivateImpl &iOwner;
+    RConnection& iConnection;
+};
+
 QT_END_NAMESPACE
 
 #endif //QNETWORKSESSION_IMPL_H
-- 
cgit v0.12


From b2c41f756e1c0abd3f07a2e7256c3ba1be72832a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Feb 2011 10:39:28 +0000
Subject: Implement network session for HTTP backend

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpnetworkconnection.cpp      | 23 ++++++++++++++++++++++
 src/network/access/qhttpnetworkconnection_p.h      | 10 ++++++++++
 .../access/qhttpnetworkconnectionchannel.cpp       |  9 +++++++++
 .../access/qhttpnetworkconnectionchannel_p.h       |  3 +++
 4 files changed, 45 insertions(+)

diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index e94b099..08a8016 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -117,9 +117,14 @@ QHttpNetworkConnectionPrivate::~QHttpNetworkConnectionPrivate()
 
 void QHttpNetworkConnectionPrivate::init()
 {
+    Q_Q(QHttpNetworkConnection);
     for (int i = 0; i < channelCount; i++) {
         channels[i].setConnection(this->q_func());
         channels[i].ssl = encrypt;
+#ifndef QT_NO_BEARERMANAGEMENT
+        //push session down to channels
+        channels[i].networkSession = networkSession;
+#endif
         channels[i].init();
     }
 }
@@ -819,6 +824,23 @@ void QHttpNetworkConnectionPrivate::readMoreLater(QHttpNetworkReply *reply)
     }
 }
 
+#ifndef QT_NO_BEARERMANAGEMENT
+QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt, QObject *parent, QSharedPointer<QNetworkSession> networkSession)
+    : QObject(*(new QHttpNetworkConnectionPrivate(hostName, port, encrypt)), parent)
+{
+    Q_D(QHttpNetworkConnection);
+    d->networkSession = networkSession;
+    d->init();
+}
+
+QHttpNetworkConnection::QHttpNetworkConnection(quint16 connectionCount, const QString &hostName, quint16 port, bool encrypt, QObject *parent, QSharedPointer<QNetworkSession> networkSession)
+     : QObject(*(new QHttpNetworkConnectionPrivate(connectionCount, hostName, port, encrypt)), parent)
+{
+    Q_D(QHttpNetworkConnection);
+    d->networkSession = networkSession;
+    d->init();
+}
+#else
 QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt, QObject *parent)
     : QObject(*(new QHttpNetworkConnectionPrivate(hostName, port, encrypt)), parent)
 {
@@ -832,6 +854,7 @@ QHttpNetworkConnection::QHttpNetworkConnection(quint16 connectionCount, const QS
     Q_D(QHttpNetworkConnection);
     d->init();
 }
+#endif
 
 QHttpNetworkConnection::~QHttpNetworkConnection()
 {
diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h
index d4748c1..ad53dec 100644
--- a/src/network/access/qhttpnetworkconnection_p.h
+++ b/src/network/access/qhttpnetworkconnection_p.h
@@ -55,6 +55,7 @@
 #include <QtNetwork/qnetworkrequest.h>
 #include <QtNetwork/qnetworkreply.h>
 #include <QtNetwork/qabstractsocket.h>
+#include <QtNetwork/qnetworksession.h>
 
 #include <private/qobject_p.h>
 #include <qauthenticator.h>
@@ -88,8 +89,13 @@ class Q_AUTOTEST_EXPORT QHttpNetworkConnection : public QObject
     Q_OBJECT
 public:
 
+#ifndef QT_NO_BEARERMANAGEMENT
+    QHttpNetworkConnection(const QString &hostName, quint16 port = 80, bool encrypt = false, QObject *parent = 0, QSharedPointer<QNetworkSession> networkSession = QSharedPointer<QNetworkSession>());
+    QHttpNetworkConnection(quint16 channelCount, const QString &hostName, quint16 port = 80, bool encrypt = false, QObject *parent = 0, QSharedPointer<QNetworkSession> networkSession = QSharedPointer<QNetworkSession>());
+#else
     QHttpNetworkConnection(const QString &hostName, quint16 port = 80, bool encrypt = false, QObject *parent = 0);
     QHttpNetworkConnection(quint16 channelCount, const QString &hostName, quint16 port = 80, bool encrypt = false, QObject *parent = 0);
+#endif
     ~QHttpNetworkConnection();
 
     //The hostname to which this is connected to.
@@ -208,6 +214,10 @@ public:
     QList<HttpMessagePair> highPriorityQueue;
     QList<HttpMessagePair> lowPriorityQueue;
 
+#ifndef QT_NO_BEARERMANAGEMENT
+    QSharedPointer<QNetworkSession> networkSession;
+#endif
+
     friend class QHttpNetworkConnectionChannel;
 };
 
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index 079f608..3aaa11d 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -54,6 +54,10 @@
 #    include <QtNetwork/qsslconfiguration.h>
 #endif
 
+#ifndef QT_NO_BEARERMANAGEMENT
+#include "private/qnetworksession_p.h"
+#endif
+
 QT_BEGIN_NAMESPACE
 
 // TODO: Put channel specific stuff here so it does not polute qhttpnetworkconnection.cpp
@@ -91,6 +95,11 @@ void QHttpNetworkConnectionChannel::init()
 #else
     socket = new QTcpSocket;
 #endif
+#ifndef QT_NO_BEARERMANAGEMENT
+    //push session down to socket
+    if (networkSession)
+        socket->setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     // Set by QNAM anyway, but let's be safe here
     socket->setProxy(QNetworkProxy::NoProxy);
 
diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h
index 8cbc689..d86f95f 100644
--- a/src/network/access/qhttpnetworkconnectionchannel_p.h
+++ b/src/network/access/qhttpnetworkconnectionchannel_p.h
@@ -116,6 +116,9 @@ public:
     bool ignoreAllSslErrors;
     QList<QSslError> ignoreSslErrorsList;
 #endif
+#ifndef QT_NO_BEARERMANAGEMENT
+    QSharedPointer<QNetworkSession> networkSession;
+#endif
 
     // HTTP pipelining -> http://en.wikipedia.org/wiki/Http_pipelining
     enum PipeliningSupport {
-- 
cgit v0.12


From 42ce38bc4db41ece082fba963f483a4ebfd78a01 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Thu, 17 Feb 2011 18:44:50 +0100
Subject: Changed manual QLocale test to update FirstDayOfWeek automatically

Reviewed-by: Denis Dzyubenko
---
 tests/manual/qlocale/calendar.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/manual/qlocale/calendar.cpp b/tests/manual/qlocale/calendar.cpp
index 8c8eca9..b59fae6 100644
--- a/tests/manual/qlocale/calendar.cpp
+++ b/tests/manual/qlocale/calendar.cpp
@@ -66,6 +66,7 @@ CalendarWidget::CalendarWidget()
 void CalendarWidget::localeChanged(QLocale locale)
 {
     calendar->setLocale(locale);
+    firstDayCombo->setCurrentIndex(locale.firstDayOfWeek()-1);
 }
 
 void CalendarWidget::firstDayChanged(int index)
@@ -189,13 +190,13 @@ void CalendarWidget::createGeneralOptionsGroupBox()
     generalOptionsGroupBox = new QGroupBox(tr("General Options"));
 
     firstDayCombo = new QComboBox;
-    firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
     firstDayCombo->addItem(tr("Monday"), Qt::Monday);
     firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);
     firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);
     firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);
     firstDayCombo->addItem(tr("Friday"), Qt::Friday);
     firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);
+    firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
 
     firstDayLabel = new QLabel(tr("Wee&k starts on:"));
     firstDayLabel->setBuddy(firstDayCombo);
-- 
cgit v0.12


From aa9bc750eb72a180f15be144d2cc6621289f59f5 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Wed, 16 Feb 2011 14:18:22 +0100
Subject: Implemented QLocale::quoteString(...)

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17096
---
 src/corelib/tools/qlocale.cpp          | 86 ++++++++++++++++++++++++++++++++++
 src/corelib/tools/qlocale.h            |  8 +++-
 src/corelib/tools/qlocale_p.h          |  2 +
 tests/auto/qlocale/tst_qlocale.cpp     | 16 +++++++
 util/local_database/cldr2qlocalexml.py | 12 +++++
 util/local_database/qlocalexml2cpp.py  | 18 +++++--
 6 files changed, 138 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 985889c..10ad0cc 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -59,6 +59,7 @@ QT_END_NAMESPACE
 #include "qdatetime.h"
 #include "qstringlist.h"
 #include "qvariant.h"
+#include "qstringbuilder.h"
 #if defined(Q_WS_WIN)
 #   include "qt_windows.h"
 #   include <time.h>
@@ -1313,6 +1314,33 @@ static QString macFormatCurrency(const QVariant &in)
     return QCFString::toQString(result);
 }
 
+static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant &in)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+    if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6)
+        return QVariant();
+
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    switch (type) {
+    case  QSystemLocale::QuotationBegin:
+        if (in.toInt() == QLocale::StandardQuotation)
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
+        else
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
+        break;
+    case QSystemLocale::QuotationEnd:
+        if (in.toInt() == QLocale::StandardQuotation)
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
+        else
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
+        break;
+     default:
+        break;
+    }
+#endif
+    return QVariant();
+}
+
 static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
 {
     QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
@@ -1400,6 +1428,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
     case FormatCurrency:
         return macFormatCurrency(in);
+    case QuotationBegin:
+    case QuotationEnd: {
+        return macQuotationSymbol(type,in);
+    }
     default:
         break;
     }
@@ -1541,6 +1573,8 @@ Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
   \value FormatCurrency a localized string representation of a number with a currency symbol.
+  \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
+  \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
 */
 
 /*!
@@ -2328,6 +2362,21 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
     locale specified; otherwise returns false.
 */
 
+/*!
+    \enum QLocale::QuotationStyle
+
+    This enum defines a set of possible styles for locale specific quotation.
+
+    \value StandardQuotation If this option is set, the standard quotation marks
+            will be used to quote strings.
+    \value AlternateQuotation If this option is set, the alternate quotation marks
+            will be used to quote strings.
+
+    \since 4.8
+
+    \sa quoteString()
+*/
+
 static const int locale_data_size = sizeof(locale_data)/sizeof(QLocalePrivate) - 1;
 
 static const QLocalePrivate *dataPointerHelper(quint16 index)
@@ -2491,6 +2540,43 @@ QLocale::NumberOptions QLocale::numberOptions() const
 }
 
 /*!
+    \since 4.8
+
+    Returns \a str quoted according to the current locale.
+
+    If \a AlternateQuotation is used for \a QuoatationStyle
+    but the locale does not provide an alternate quotation,
+    we will fallback to the parent locale.
+*/
+QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
+{
+
+    return quoteString(&str, qs);
+}
+
+/*!
+    \since 4.8
+
+    \overload
+*/
+QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant quotationBegin = systemLocale()->query(QSystemLocale::QuotationBegin, QVariant(qs));
+        QVariant quotationEnd = systemLocale()->query(QSystemLocale::QuotationEnd, QVariant(qs));
+        if (!quotationBegin.isNull() && !quotationEnd.isNull())
+            return quotationBegin.toString() % str % quotationEnd.toString();
+    }
+#endif
+
+    if (qs == StandardQuotation)
+        return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
+    else
+        return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
+}
+
+/*!
     \nonreentrant
 
     Sets the global default locale to \a locale. These
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 225ae9c..924cb7b 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -97,7 +97,9 @@ public:
         PMText, // QString
         FirstDayOfWeek, // Qt::DayOfWeek
         CurrencySymbol, // QString in: format
-        FormatCurrency // QString in: qlonglong, qulonglong or double
+        FormatCurrency, // QString in: qlonglong, qulonglong or double
+        QuotationBegin, // QString in: StandardQuotation or AlternateQuotation
+        QuotationEnd // QString in: StandardQuotation or AlternateQuotation
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -707,6 +709,10 @@ public:
     void setNumberOptions(NumberOptions options);
     NumberOptions numberOptions() const;
 
+    enum QuotationStyle { StandardQuotation, AlternateQuotation };
+    QString quoteString(const QString &str, QuotationStyle qs = StandardQuotation) const;
+    QString quoteString(const QStringRef &str, QuotationStyle qs = StandardQuotation) const;
+
 //private:                        // this should be private, but can't be
     struct Data {
         quint16 index;
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 283f722..1d286ab 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -164,6 +164,8 @@ public:
 
     quint16 m_decimal, m_group, m_list, m_percent,
         m_zero, m_minus, m_plus, m_exponential;
+    quint16 m_quotation_start, m_quotation_end;
+    quint16 m_alternate_quotation_start, m_alternate_quotation_end;
 
     quint16 m_short_date_format_idx, m_short_date_format_size;
     quint16 m_long_date_format_idx, m_long_date_format_size;
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 3217e5e..250aac9 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -141,6 +141,7 @@ private slots:
 
     void ampm();
     void currency();
+    void quoteString();
 
 private:
     QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
@@ -1122,6 +1123,8 @@ void tst_QLocale::macDefaultLocale()
     QCOMPARE(locale.dayName(7), QString("Sunday"));
     QCOMPARE(locale.monthName(1), QString("January"));
     QCOMPARE(locale.monthName(12), QString("December"));
+    QCOMPARE(locale.quoteString("string"), QString::fromUtf8("\xe2\x80\x9c" "string" "\xe2\x80\x9d"));
+    QCOMPARE(locale.quoteString("string", QLocale::AlternateQuotation), QString::fromUtf8("\xe2\x80\x98" "string" "\xe2\x80\x99"));
 
 }
 
@@ -2153,5 +2156,18 @@ void tst_QLocale::currency()
     QCOMPARE(de_DE.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56\xc2\xa0\xe2\x82\xac"));
 }
 
+void tst_QLocale::quoteString()
+{
+    const QString someText("text");
+    const QLocale c(QLocale::C);
+    QCOMPARE(c.quoteString(someText), QString::fromUtf8("\x22" "text" "\x22"));
+    QCOMPARE(c.quoteString(someText, QLocale::AlternateQuotation), QString::fromUtf8("\x27" "text" "\x27"));
+
+    const QLocale de_CH("de_CH");
+    QCOMPARE(de_CH.quoteString(someText), QString::fromUtf8("\xc2\xab" "text" "\xc2\xbb"));
+    QCOMPARE(de_CH.quoteString(someText, QLocale::AlternateQuotation), QString::fromUtf8("\xe2\x80\xb9" "text" "\xe2\x80\xba"));
+
+}
+
 QTEST_APPLESS_MAIN(tst_QLocale)
 #include "tst_qlocale.moc"
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index b873565..0bc1664 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -199,6 +199,10 @@ def generateLocaleInfo(path):
     result['minus'] = get_number_in_system(path, "numbers/symbols/minusSign", numbering_system)
     result['plus'] = get_number_in_system(path, "numbers/symbols/plusSign", numbering_system)
     result['exp'] = get_number_in_system(path, "numbers/symbols/exponential", numbering_system).lower()
+    result['quotationStart'] = findEntry(path, "delimiters/quotationStart")
+    result['quotationEnd'] = findEntry(path, "delimiters/quotationEnd")
+    result['alternateQuotationStart'] = findEntry(path, "delimiters/alternateQuotationStart")
+    result['alternateQuotationEnd'] = findEntry(path, "delimiters/alternateQuotationEnd")
     result['am'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[am]", draft)
     result['pm'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[pm]", draft)
     result['longDateFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[full]/dateFormat/pattern"))
@@ -600,6 +604,10 @@ print \
             <minus>45</minus>\n\
             <plus>43</plus>\n\
             <exp>101</exp>\n\
+            <quotationStart>\"</quotationStart>\n\
+            <quotationEnd>\"</quotationEnd>\n\
+            <alternateQuotationStart>\'</alternateQuotationStart>\n\
+            <alternateQuotationEnd>\'</alternateQuotationEnd>\n\
             <am>AM</am>\n\
             <pm>PM</pm>\n\
             <firstDayOfWeek>mon</firstDayOfWeek>\n\
@@ -644,6 +652,10 @@ for key in locale_keys:
     print "            <minus>"    + ordStr(l['minus'])   + "</minus>"
     print "            <plus>"     + ordStr(l['plus'])   + "</plus>"
     print "            <exp>"      + fixOrdStrExp(l['exp'])     + "</exp>"
+    print "            <quotationStart>" + l['quotationStart'].encode('utf-8') + "</quotationStart>"
+    print "            <quotationEnd>" + l['quotationEnd'].encode('utf-8')   + "</quotationEnd>"
+    print "            <alternateQuotationStart>" + l['alternateQuotationStart'].encode('utf-8') + "</alternateQuotationStart>"
+    print "            <alternateQuotationEnd>" + l['alternateQuotationEnd'].encode('utf-8')   + "</alternateQuotationEnd>"
     print "            <am>"       + l['am'].encode('utf-8') + "</am>"
     print "            <pm>"       + l['pm'].encode('utf-8') + "</pm>"
     print "            <firstDayOfWeek>"  + l['firstDayOfWeek'].encode('utf-8') + "</firstDayOfWeek>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 2f998f3..6b8fdb9 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -195,6 +195,10 @@ def convertToQtDayOfWeek(firstDay):
     qtDayOfWeek = {"mon":1, "tue":2, "wed":3, "thu":4, "fri":5, "sat":6, "sun":7}
     return qtDayOfWeek[firstDay]
 
+def assertSingleChar(string):
+    assert len(string) == 1, "This string is not allowed to be longer than 1 character"
+    return string
+
 class Locale:
     def __init__(self, elt):
         self.language = eltText(firstChildElt(elt, "language"))
@@ -207,6 +211,10 @@ class Locale:
         self.minus = int(eltText(firstChildElt(elt, "minus")))
         self.plus = int(eltText(firstChildElt(elt, "plus")))
         self.exp = int(eltText(firstChildElt(elt, "exp")))
+        self.quotationStart = ord(assertSingleChar(eltText(firstChildElt(elt, "quotationStart"))))
+        self.quotationEnd = ord(assertSingleChar(eltText(firstChildElt(elt, "quotationEnd"))))
+        self.alternateQuotationStart = ord(assertSingleChar(eltText(firstChildElt(elt, "alternateQuotationStart"))))
+        self.alternateQuotationEnd = ord(assertSingleChar(eltText(firstChildElt(elt, "alternateQuotationEnd"))))
         self.am = eltText(firstChildElt(elt, "am"))
         self.pm = eltText(firstChildElt(elt, "pm"))
         self.firstDayOfWeek = convertToQtDayOfWeek(eltText(firstChildElt(elt, "firstDayOfWeek")))
@@ -433,7 +441,7 @@ def main():
 
     # Locale data
     data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
-    data_temp_file.write("//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
+    data_temp_file.write("//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
 
     locale_keys = locale_map.keys()
     compareLocaleKeys.default_map = default_map
@@ -443,7 +451,7 @@ def main():
     for key in locale_keys:
         l = locale_map[key]
 
-        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s\n" \
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s\n" \
                     % (key[0], key[1],
                         l.decimal,
                         l.group,
@@ -453,6 +461,10 @@ def main():
                         l.minus,
                         l.plus,
                         l.exp,
+                        l.quotationStart,
+                        l.quotationEnd,
+                        l.alternateQuotationStart,
+                        l.alternateQuotationEnd,
                         date_format_data.append(l.shortDateFormat),
                         date_format_data.append(l.longDateFormat),
                         time_format_data.append(l.shortTimeFormat),
@@ -481,7 +493,7 @@ def main():
                         l.firstDayOfWeek,
                         l.language,
                         l.country))
-    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s\n")
     data_temp_file.write("};\n")
 
     data_temp_file.write("\n")
-- 
cgit v0.12


From 0f661126193d5694a53a594a425987f7890a86c9 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Thu, 17 Feb 2011 19:22:11 +0100
Subject: Added Misc Tab to QLocale manual test to test quotation

Reviewed-by: Denis Dzyubenko
---
 tests/manual/qlocale/miscellaneous.cpp | 83 ++++++++++++++++++++++++++++++++++
 tests/manual/qlocale/miscellaneous.h   | 68 ++++++++++++++++++++++++++++
 tests/manual/qlocale/qlocale.pro       |  4 +-
 tests/manual/qlocale/window.cpp        |  3 ++
 tests/manual/qlocale/window.h          |  2 +
 5 files changed, 158 insertions(+), 2 deletions(-)
 create mode 100644 tests/manual/qlocale/miscellaneous.cpp
 create mode 100644 tests/manual/qlocale/miscellaneous.h

diff --git a/tests/manual/qlocale/miscellaneous.cpp b/tests/manual/qlocale/miscellaneous.cpp
new file mode 100644
index 0000000..a1a3139
--- /dev/null
+++ b/tests/manual/qlocale/miscellaneous.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "miscellaneous.h"
+
+MiscWidget::MiscWidget()
+{
+    QGridLayout *l = new QGridLayout(this);
+
+    textToQuoteLabel = new QLabel("Text to quote:");
+    standardQuotedTextLabel = new QLabel("Standard quotes:");
+    alternateQuotedTextLabel = new QLabel("Alternate quotes:");
+    textToQuote = new QLineEdit("some text");
+    standardQuotedText = new QLineEdit;
+    alternateQuotedText = new QLineEdit;
+
+    l->addWidget(textToQuoteLabel, 0, 0);
+    l->addWidget(textToQuote, 0, 1);
+    l->addWidget(standardQuotedTextLabel, 0, 2);
+    l->addWidget(standardQuotedText, 0, 3);
+    l->addWidget(alternateQuotedTextLabel, 1, 2);
+    l->addWidget(alternateQuotedText, 1, 3);
+
+    connect(textToQuote, SIGNAL(textChanged(QString)), this, SLOT(updateQuotedText(QString)));
+
+    update(QLocale());
+}
+
+void MiscWidget::update(const QLocale locale)
+{
+    currentLocale = locale;
+    updateQuotedText(textToQuote->text());
+}
+
+void MiscWidget::updateQuotedText(QString str)
+{
+    standardQuotedText->setText(currentLocale.quoteString(str));
+    alternateQuotedText->setText(currentLocale.quoteString(str, QLocale::AlternateQuotation));
+}
+
+void MiscWidget::localeChanged(QLocale locale)
+{
+    update(locale);
+}
+
+
diff --git a/tests/manual/qlocale/miscellaneous.h b/tests/manual/qlocale/miscellaneous.h
new file mode 100644
index 0000000..e4a1a36
--- /dev/null
+++ b/tests/manual/qlocale/miscellaneous.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MISCELLANEOUS_H
+#define MISCELLANEOUS_H
+
+#include <QtGui>
+
+class MiscWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    MiscWidget();
+
+private:
+    QLocale currentLocale;
+
+    QLabel *textToQuoteLabel;
+    QLabel *standardQuotedTextLabel;
+    QLabel *alternateQuotedTextLabel;
+    QLineEdit *textToQuote;
+    QLineEdit *standardQuotedText;
+    QLineEdit *alternateQuotedText;
+
+private slots:
+    void localeChanged(QLocale locale);
+    void update(const QLocale locale);
+    void updateQuotedText(QString str);
+};
+
+#endif // MISCELLANEOUS_H
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 8f83a83..66d527b 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -4,5 +4,5 @@ DEPENDPATH += .
 INCLUDEPATH += .
 
 # Input
-HEADERS += currency.h calendar.h window.h
-SOURCES += currency.cpp main.cpp calendar.cpp window.cpp
+HEADERS += currency.h calendar.h window.h  miscellaneous.h
+SOURCES += currency.cpp main.cpp calendar.cpp window.cpp miscellaneous.cpp
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index 26e5d84..caafcee 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -67,6 +67,8 @@ Window::Window()
     connect(this, SIGNAL(localeChanged(QLocale)), calendar, SLOT(localeChanged(QLocale)));
     currency = new CurrencyWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), currency, SLOT(localeChanged(QLocale)));
+    miscellaneous = new MiscWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), miscellaneous, SLOT(localeChanged(QLocale)));
 
     localeName = new QLabel("Locale: foo_BAR");
 
@@ -81,6 +83,7 @@ Window::Window()
 
     tabWidget->addTab(calendar, "Calendar");
     tabWidget->addTab(currency, "Currency");
+    tabWidget->addTab(miscellaneous, "Misc");
     localeCombo->setCurrentIndex(0);
     systemLocaleChanged();
 }
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
index 5bfea2a..c9a5480 100644
--- a/tests/manual/qlocale/window.h
+++ b/tests/manual/qlocale/window.h
@@ -45,6 +45,7 @@
 
 #include "calendar.h"
 #include "currency.h"
+#include "miscellaneous.h"
 
 class Window : public QWidget
 {
@@ -57,6 +58,7 @@ public:
     QTabWidget *tabWidget;
     CalendarWidget *calendar;
     CurrencyWidget *currency;
+    MiscWidget *miscellaneous;
 
 private:
     bool event(QEvent *);
-- 
cgit v0.12


From 17b9d9d78c2000fca8244a1736df78527f875948 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Tue, 22 Feb 2011 11:41:25 +0100
Subject: Added documentation for enum value FirstDayOfWeek

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 10ad0cc..6f21633 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1571,6 +1571,7 @@ Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
   \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
   \value AMText a string that represents the system AM designator associated with a 12-hour clock.
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
+  \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
   \value FormatCurrency a localized string representation of a number with a currency symbol.
   \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
-- 
cgit v0.12


From 400195768909f52dee30abff59dd9a5e03ea63dc Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Tue, 22 Feb 2011 13:00:02 +0100
Subject: Updated CLDR data for QLocale.

This is a temporary commit and meant to be removed before merging the branch
into Qt as we don't want to bloat the repository size by updating CLDR every
time we make a small change to QLocale, but do that only once when we are done.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 654 ++++++++++++++++++-------------------
 1 file changed, 327 insertions(+), 327 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index d2a31a5..4ff6138 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -75,7 +75,7 @@ static const int ImperialMeasurementSystemsCount =
 // GENERATED PART STARTS HERE
 
 /*
-    This part of the file was generated on 2011-02-18 from the
+    This part of the file was generated on 2011-02-22 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -305,332 +305,332 @@ static const quint16 locale_index[] = {
 };
 
 static const QLocalePrivate locale_data[] = {
-//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // C/AnyCountry
-    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Ethiopia
-    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Kenya
-    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6 }, // Afar/Djibouti
-    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Eritrea
-    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Ethiopia
-    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1 }, // Afrikaans/SouthAfrica
-    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Afrikaans/Namibia
-    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1 }, // Albanian/Albania
-    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6 }, // Amharic/Ethiopia
-    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/SaudiArabia
-    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Algeria
-    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Bahrain
-    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Egypt
-    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6 }, // Arabic/Iraq
-    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Jordan
-    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Kuwait
-    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1 }, // Arabic/Lebanon
-    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/LibyanArabJamahiriya
-    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Morocco
-    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Oman
-    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/Qatar
-    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Sudan
-    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7 }, // Arabic/SyrianArabRepublic
-    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6 }, // Arabic/Tunisia
-    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1 }, // Arabic/UnitedArabEmirates
-    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6 }, // Arabic/Yemen
-    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1 }, // Armenian/Armenia
-    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Assamese/India
-    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7 }, // Azerbaijani/Azerbaijan
-    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6 }, // Azerbaijani/Iran
-    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Basque/Spain
-    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1 }, // Bengali/Bangladesh
-    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7 }, // Bengali/India
-    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1 }, // Bhutani/Bhutan
-    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Breton/France
-    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1 }, // Bulgarian/Bulgaria
-    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1 }, // Burmese/Myanmar
-    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Byelorussian/Belarus
-    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1 }, // Cambodian/Cambodia
-    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Catalan/Spain
-    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/China
-    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7 }, // Chinese/HongKong
-    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Macau
-    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Singapore
-    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Taiwan
-    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1 }, // Croatian/Croatia
-    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Czech/CzechRepublic
-    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Danish/Denmark
-    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1 }, // Dutch/Netherlands
-    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Dutch/Belgium
-    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStates
-    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/AmericanSamoa
-    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Australia
-    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // English/Belgium
-    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Belize
-    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Botswana
-    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Canada
-    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Guam
-    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/HongKong
-    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7 }, // English/India
-    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Ireland
-    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Jamaica
-    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Malta
-    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/MarshallIslands
-    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1 }, // English/Mauritius
-    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Namibia
-    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7 }, // English/NewZealand
-    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/NorthernMarianaIslands
-    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7 }, // English/Pakistan
-    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Philippines
-    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Singapore
-    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1 }, // English/SouthAfrica
-    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7 }, // English/TrinidadAndTobago
-    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1 }, // English/UnitedKingdom
-    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStatesMinorOutlyingIslands
-    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/USVirginIslands
-    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Zimbabwe
-    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1 }, // Estonian/Estonia
-    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7 }, // Faroese/FaroeIslands
-    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Finnish/Finland
-    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/France
-    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Belgium
-    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Cameroon
-    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7 }, // French/Canada
-    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/CentralAfricanRepublic
-    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/IvoryCoast
-    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Guadeloupe
-    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Guinea
-    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Luxembourg
-    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Madagascar
-    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Mali
-    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Martinique
-    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Monaco
-    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Niger
-    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Reunion
-    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Senegal
-    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1 }, // French/Switzerland
-    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Barthelemy
-    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Martin
-    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Galician/Spain
-    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Georgian/Georgia
-    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Germany
-    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1 }, // German/Austria
-    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Belgium
-    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1 }, // German/Liechtenstein
-    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Luxembourg
-    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1 }, // German/Switzerland
-    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Greek/Greece
-    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1 }, // Greek/Cyprus
-    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7 }, // Greenlandic/Greenland
-    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Gujarati/India
-    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Ghana
-    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1 }, // Hausa/Niger
-    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Nigeria
-    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6 }, // Hausa/Sudan
-    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7 }, // Hebrew/Israel
-    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Hindi/India
-    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1 }, // Hungarian/Hungary
-    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7 }, // Icelandic/Iceland
-    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Indonesian/Indonesia
-    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Irish/Ireland
-    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Italian/Italy
-    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1 }, // Italian/Switzerland
-    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7 }, // Japanese/Japan
-    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kannada/India
-    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Kazakh/Kazakhstan
-    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kinyarwanda/Rwanda
-    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kirghiz/Kyrgyzstan
-    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7 }, // Korean/RepublicOfKorea
-    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iran
-    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iraq
-    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Kurdish/SyrianArabRepublic
-    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kurdish/Turkey
-    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7 }, // Laothian/Lao
-    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Latvian/Latvia
-    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Lingala/DemocraticRepublicOfCongo
-    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Lingala/PeoplesRepublicOfCongo
-    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Lithuanian/Lithuania
-    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Macedonian/Macedonia
-    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1 }, // Malagasy/Madagascar
-    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1 }, // Malay/Malaysia
-    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Malay/BruneiDarussalam
-    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7 }, // Malayalam/India
-    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Maltese/Malta
-    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Maori/NewZealand
-    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Marathi/India
-    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Mongolian/Mongolia
-    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Mongolian/China
-    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Nepali/Nepal
-    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7 }, // Nepali/India
-    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1 }, // Norwegian/Norway
-    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Occitan/France
-    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7 }, // Oriya/India
-    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Pashto/Afghanistan
-    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Iran
-    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Afghanistan
-    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1 }, // Polish/Poland
-    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Portuguese/Portugal
-    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Brazil
-    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1 }, // Portuguese/GuineaBissau
-    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Mozambique
-    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7 }, // Punjabi/India
-    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7 }, // Punjabi/Pakistan
-    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1 }, // RhaetoRomance/Switzerland
-    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Moldova
-    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Romania
-    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/RussianFederation
-    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Moldova
-    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Ukraine
-    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1 }, // Sangho/CentralAfricanRepublic
-    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7 }, // Sanskrit/India
-    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/SerbiaAndMontenegro
-    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/BosniaAndHerzegowina
-    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/Yugoslavia
-    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1 }, // Serbian/Montenegro
-    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1 }, // Serbian/Serbia
-    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/SerbiaAndMontenegro
-    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/BosniaAndHerzegowina
-    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/Yugoslavia
-    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/Lesotho
-    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/SouthAfrica
-    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Setswana/SouthAfrica
-    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7 }, // Shona/Zimbabwe
-    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1 }, // Singhalese/SriLanka
-    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/SouthAfrica
-    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/Swaziland
-    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovak/Slovakia
-    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovenian/Slovenia
-    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Somalia
-    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Djibouti
-    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Ethiopia
-    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Kenya
-    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Spain
-    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/Argentina
-    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Bolivia
-    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1 }, // Spanish/Chile
-    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/Colombia
-    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/CostaRica
-    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/DominicanRepublic
-    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Ecuador
-    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/ElSalvador
-    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/EquatorialGuinea
-    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Guatemala
-    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Honduras
-    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Mexico
-    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Nicaragua
-    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Panama
-    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1 }, // Spanish/Paraguay
-    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Peru
-    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/PuertoRico
-    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/UnitedStates
-    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1 }, // Spanish/Uruguay
-    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Venezuela
-    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/LatinAmericaAndTheCaribbean
-    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Swahili/Kenya
-    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1 }, // Swahili/Tanzania
-    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Sweden
-    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Finland
-    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1 }, // Tajik/Tajikistan
-    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tamil/India
-    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tamil/SriLanka
-    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Tatar/RussianFederation
-    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Telugu/India
-    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7 }, // Thai/Thailand
-    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/China
-    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/India
-    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Eritrea
-    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Ethiopia
-    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tonga/Tonga
-    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Tsonga/SouthAfrica
-    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1 }, // Turkish/Turkey
-    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Uigur/China
-    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1 }, // Ukrainian/Ukraine
-    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Urdu/India
-    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7 }, // Urdu/Pakistan
-    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7 }, // Uzbek/Uzbekistan
-    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Uzbek/Afghanistan
-    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1 }, // Vietnamese/VietNam
-    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1 }, // Welsh/UnitedKingdom
-    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Wolof/Senegal
-    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Xhosa/SouthAfrica
-    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1 }, // Yoruba/Nigeria
-    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Zulu/SouthAfrica
-    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Nynorsk/Norway
-    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1 }, // Bosnian/BosniaAndHerzegowina
-    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5 }, // Divehi/Maldives
-    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Manx/UnitedKingdom
-    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Cornish/UnitedKingdom
-    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Akan/Ghana
-    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Konkani/India
-    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Ga/Ghana
-    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1 }, // Igbo/Nigeria
-    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kamba/Kenya
-    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7 }, // Syriac/SyrianArabRepublic
-    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Blin/Eritrea
-    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Eritrea
-    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Ethiopia
-    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Koro/IvoryCoast
-    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Sidamo/Ethiopia
-    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Atsam/Nigeria
-    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigre/Eritrea
-    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1 }, // Jju/Nigeria
-    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Friulian/Italy
-    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Venda/SouthAfrica
-    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1 }, // Ewe/Ghana
-    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1 }, // Ewe/Togo
-    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Walamo/Ethiopia
-    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7 }, // Hawaiian/UnitedStates
-    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Tyap/Nigeria
-    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Chewa/Malawi
-    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Filipino/Philippines
-    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1 }, // Swiss German/Switzerland
-    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Sichuan Yi/China
-    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kpelle/Guinea
-    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kpelle/Liberia
-    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Low German/Germany
-    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // South Ndebele/SouthAfrica
-    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Northern Sotho/SouthAfrica
-    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Finland
-    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Norway
-    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Taroko/Taiwan
-    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Gusii/Kenya
-    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Taita/Kenya
-    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Fulah/Senegal
-    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kikuyu/Kenya
-    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Samburu/Kenya
-    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Sena/Mozambique
-    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7 }, // North Ndebele/Zimbabwe
-    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1 }, // Rombo/Tanzania
-    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Tachelhit/Morocco
-    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Kabyle/Algeria
-    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Nyankole/Uganda
-    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1 }, // Bena/Tanzania
-    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Vunjo/Tanzania
-    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1 }, // Bambara/Mali
-    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Embu/Kenya
-    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7 }, // Cherokee/UnitedStates
-    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1 }, // Morisyen/Mauritius
-    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1 }, // Makonde/Tanzania
-    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1 }, // Langi/Tanzania
-    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1 }, // Ganda/Uganda
-    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1 }, // Bemba/Zambia
-    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1 }, // Kabuverdianu/CapeVerde
-    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Meru/Kenya
-    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6 }, // Kalenjin/Kenya
-    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1 }, // Nama/Namibia
-    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Machame/Tanzania
-    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Colognian/Germany
-    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Masai/Kenya
-    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Masai/Tanzania
-    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Soga/Uganda
-    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6 }, // Luyia/Kenya
-    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1 }, // Asu/Tanzania
-    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6 }, // Teso/Kenya
-    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Teso/Uganda
-    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Saho/Eritrea
-    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyra Chiini/Mali
-    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Rwa/Tanzania
-    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6 }, // Luo/Kenya
-    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Chiga/Uganda
-    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6 }, // Central Morocco Tamazight/Morocco
-    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyraboro Senni/Mali
-    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Shambala/Tanzania
-    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s
+//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
+    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // C/AnyCountry
+    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Ethiopia
+    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Kenya
+    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6 }, // Afar/Djibouti
+    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Eritrea
+    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Ethiopia
+    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1 }, // Afrikaans/SouthAfrica
+    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Afrikaans/Namibia
+    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1 }, // Albanian/Albania
+    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6 }, // Amharic/Ethiopia
+    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/SaudiArabia
+    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Algeria
+    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Bahrain
+    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Egypt
+    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6 }, // Arabic/Iraq
+    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Jordan
+    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Kuwait
+    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1 }, // Arabic/Lebanon
+    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/LibyanArabJamahiriya
+    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Morocco
+    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Oman
+    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/Qatar
+    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Sudan
+    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7 }, // Arabic/SyrianArabRepublic
+    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6 }, // Arabic/Tunisia
+    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1 }, // Arabic/UnitedArabEmirates
+    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6 }, // Arabic/Yemen
+    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1 }, // Armenian/Armenia
+    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Assamese/India
+    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7 }, // Azerbaijani/Azerbaijan
+    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6 }, // Azerbaijani/Iran
+    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Basque/Spain
+    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1 }, // Bengali/Bangladesh
+    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7 }, // Bengali/India
+    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1 }, // Bhutani/Bhutan
+    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Breton/France
+    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1 }, // Bulgarian/Bulgaria
+    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1 }, // Burmese/Myanmar
+    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Byelorussian/Belarus
+    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1 }, // Cambodian/Cambodia
+    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Catalan/Spain
+    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/China
+    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7 }, // Chinese/HongKong
+    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Macau
+    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Singapore
+    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Taiwan
+    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1 }, // Croatian/Croatia
+    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Czech/CzechRepublic
+    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Danish/Denmark
+    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1 }, // Dutch/Netherlands
+    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Dutch/Belgium
+    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStates
+    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/AmericanSamoa
+    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Australia
+    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // English/Belgium
+    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Belize
+    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Botswana
+    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Canada
+    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Guam
+    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/HongKong
+    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7 }, // English/India
+    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Ireland
+    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Jamaica
+    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Malta
+    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/MarshallIslands
+    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1 }, // English/Mauritius
+    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Namibia
+    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7 }, // English/NewZealand
+    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/NorthernMarianaIslands
+    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7 }, // English/Pakistan
+    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Philippines
+    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Singapore
+    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1 }, // English/SouthAfrica
+    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7 }, // English/TrinidadAndTobago
+    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1 }, // English/UnitedKingdom
+    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStatesMinorOutlyingIslands
+    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/USVirginIslands
+    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Zimbabwe
+    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1 }, // Estonian/Estonia
+    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7 }, // Faroese/FaroeIslands
+    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Finnish/Finland
+    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/France
+    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Belgium
+    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Cameroon
+    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7 }, // French/Canada
+    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/CentralAfricanRepublic
+    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/IvoryCoast
+    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Guadeloupe
+    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Guinea
+    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Luxembourg
+    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Madagascar
+    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Mali
+    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Martinique
+    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Monaco
+    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Niger
+    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Reunion
+    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Senegal
+    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1 }, // French/Switzerland
+    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Barthelemy
+    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Martin
+    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Galician/Spain
+    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Georgian/Georgia
+    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Germany
+    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1 }, // German/Austria
+    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Belgium
+    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1 }, // German/Liechtenstein
+    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Luxembourg
+    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1 }, // German/Switzerland
+    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Greek/Greece
+    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1 }, // Greek/Cyprus
+    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7 }, // Greenlandic/Greenland
+    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Gujarati/India
+    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Ghana
+    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1 }, // Hausa/Niger
+    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Nigeria
+    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6 }, // Hausa/Sudan
+    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7 }, // Hebrew/Israel
+    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Hindi/India
+    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1 }, // Hungarian/Hungary
+    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7 }, // Icelandic/Iceland
+    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Indonesian/Indonesia
+    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Irish/Ireland
+    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Italian/Italy
+    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1 }, // Italian/Switzerland
+    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7 }, // Japanese/Japan
+    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kannada/India
+    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Kazakh/Kazakhstan
+    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kinyarwanda/Rwanda
+    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kirghiz/Kyrgyzstan
+    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7 }, // Korean/RepublicOfKorea
+    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iran
+    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iraq
+    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Kurdish/SyrianArabRepublic
+    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kurdish/Turkey
+    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7 }, // Laothian/Lao
+    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Latvian/Latvia
+    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Lingala/DemocraticRepublicOfCongo
+    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Lingala/PeoplesRepublicOfCongo
+    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Lithuanian/Lithuania
+    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Macedonian/Macedonia
+    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1 }, // Malagasy/Madagascar
+    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1 }, // Malay/Malaysia
+    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Malay/BruneiDarussalam
+    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7 }, // Malayalam/India
+    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Maltese/Malta
+    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Maori/NewZealand
+    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Marathi/India
+    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Mongolian/Mongolia
+    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Mongolian/China
+    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Nepali/Nepal
+    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7 }, // Nepali/India
+    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1 }, // Norwegian/Norway
+    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Occitan/France
+    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7 }, // Oriya/India
+    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Pashto/Afghanistan
+    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Iran
+    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Afghanistan
+    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1 }, // Polish/Poland
+    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Portuguese/Portugal
+    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Brazil
+    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1 }, // Portuguese/GuineaBissau
+    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Mozambique
+    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7 }, // Punjabi/India
+    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7 }, // Punjabi/Pakistan
+    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1 }, // RhaetoRomance/Switzerland
+    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Moldova
+    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Romania
+    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/RussianFederation
+    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Moldova
+    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Ukraine
+    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1 }, // Sangho/CentralAfricanRepublic
+    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7 }, // Sanskrit/India
+    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/SerbiaAndMontenegro
+    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/BosniaAndHerzegowina
+    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/Yugoslavia
+    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1 }, // Serbian/Montenegro
+    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1 }, // Serbian/Serbia
+    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/SerbiaAndMontenegro
+    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/BosniaAndHerzegowina
+    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/Yugoslavia
+    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/Lesotho
+    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/SouthAfrica
+    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Setswana/SouthAfrica
+    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7 }, // Shona/Zimbabwe
+    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1 }, // Singhalese/SriLanka
+    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/SouthAfrica
+    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/Swaziland
+    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovak/Slovakia
+    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovenian/Slovenia
+    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Somalia
+    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Djibouti
+    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Ethiopia
+    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Kenya
+    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Spain
+    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/Argentina
+    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Bolivia
+    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1 }, // Spanish/Chile
+    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/Colombia
+    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/CostaRica
+    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/DominicanRepublic
+    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Ecuador
+    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/ElSalvador
+    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/EquatorialGuinea
+    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Guatemala
+    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Honduras
+    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Mexico
+    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Nicaragua
+    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Panama
+    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1 }, // Spanish/Paraguay
+    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Peru
+    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/PuertoRico
+    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/UnitedStates
+    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1 }, // Spanish/Uruguay
+    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Venezuela
+    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/LatinAmericaAndTheCaribbean
+    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Swahili/Kenya
+    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1 }, // Swahili/Tanzania
+    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Sweden
+    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Finland
+    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1 }, // Tajik/Tajikistan
+    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tamil/India
+    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tamil/SriLanka
+    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Tatar/RussianFederation
+    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Telugu/India
+    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7 }, // Thai/Thailand
+    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/China
+    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/India
+    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Eritrea
+    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Ethiopia
+    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tonga/Tonga
+    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Tsonga/SouthAfrica
+    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1 }, // Turkish/Turkey
+    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Uigur/China
+    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1 }, // Ukrainian/Ukraine
+    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Urdu/India
+    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7 }, // Urdu/Pakistan
+    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7 }, // Uzbek/Uzbekistan
+    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Uzbek/Afghanistan
+    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1 }, // Vietnamese/VietNam
+    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1 }, // Welsh/UnitedKingdom
+    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Wolof/Senegal
+    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Xhosa/SouthAfrica
+    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1 }, // Yoruba/Nigeria
+    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Zulu/SouthAfrica
+    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Nynorsk/Norway
+    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1 }, // Bosnian/BosniaAndHerzegowina
+    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5 }, // Divehi/Maldives
+    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Manx/UnitedKingdom
+    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Cornish/UnitedKingdom
+    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Akan/Ghana
+    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Konkani/India
+    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Ga/Ghana
+    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1 }, // Igbo/Nigeria
+    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kamba/Kenya
+    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7 }, // Syriac/SyrianArabRepublic
+    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Blin/Eritrea
+    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Eritrea
+    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Ethiopia
+    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Koro/IvoryCoast
+    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Sidamo/Ethiopia
+    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Atsam/Nigeria
+    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigre/Eritrea
+    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1 }, // Jju/Nigeria
+    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Friulian/Italy
+    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Venda/SouthAfrica
+    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1 }, // Ewe/Ghana
+    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1 }, // Ewe/Togo
+    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Walamo/Ethiopia
+    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7 }, // Hawaiian/UnitedStates
+    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Tyap/Nigeria
+    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Chewa/Malawi
+    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Filipino/Philippines
+    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1 }, // Swiss German/Switzerland
+    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Sichuan Yi/China
+    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kpelle/Guinea
+    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kpelle/Liberia
+    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Low German/Germany
+    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // South Ndebele/SouthAfrica
+    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Northern Sotho/SouthAfrica
+    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Finland
+    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Norway
+    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Taroko/Taiwan
+    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Gusii/Kenya
+    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Taita/Kenya
+    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Fulah/Senegal
+    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kikuyu/Kenya
+    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Samburu/Kenya
+    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Sena/Mozambique
+    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7 }, // North Ndebele/Zimbabwe
+    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1 }, // Rombo/Tanzania
+    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Tachelhit/Morocco
+    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Kabyle/Algeria
+    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Nyankole/Uganda
+    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1 }, // Bena/Tanzania
+    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Vunjo/Tanzania
+    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1 }, // Bambara/Mali
+    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Embu/Kenya
+    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7 }, // Cherokee/UnitedStates
+    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1 }, // Morisyen/Mauritius
+    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1 }, // Makonde/Tanzania
+    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1 }, // Langi/Tanzania
+    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1 }, // Ganda/Uganda
+    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1 }, // Bemba/Zambia
+    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1 }, // Kabuverdianu/CapeVerde
+    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Meru/Kenya
+    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6 }, // Kalenjin/Kenya
+    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1 }, // Nama/Namibia
+    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Machame/Tanzania
+    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Colognian/Germany
+    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Masai/Kenya
+    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Masai/Tanzania
+    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Soga/Uganda
+    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6 }, // Luyia/Kenya
+    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1 }, // Asu/Tanzania
+    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6 }, // Teso/Kenya
+    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Teso/Uganda
+    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Saho/Eritrea
+    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyra Chiini/Mali
+    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Rwa/Tanzania
+    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6 }, // Luo/Kenya
+    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Chiga/Uganda
+    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6 }, // Central Morocco Tamazight/Morocco
+    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyraboro Senni/Mali
+    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Shambala/Tanzania
+    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s
 };
 
 static const ushort date_format_data[] = {
-- 
cgit v0.12


From 7f41f062e05c02ddf31ab6b81444f57904614f2a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Feb 2011 15:40:19 +0000
Subject: Fix duplicate calls to _q_startOperation

Because of the shared QNetworkSession, we need to disconnect the signals
before detaching from the session. Otherwise we may receive signals from
an old session after switching configurations.
Also, when a session is connected, we get both the state change (connected)
and the opened signals from the session. This needs to be distinguished
from the roaming->connected state change to avoid getting the
networkSessionConnected signal twice.

Reviewed-by: Markus Goetz
Task-Number: QTBUG-16901
---
 src/network/access/qnetworkaccessmanager.cpp | 36 ++++++++++++++++++++++++----
 src/network/access/qnetworkaccessmanager_p.h |  2 ++
 src/network/access/qnetworkreplyimpl.cpp     |  2 +-
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index f1c4447..00c5d26 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1344,8 +1344,25 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
 
     initializeSession = false;
 
-    if (!config.isValid()) {
-        networkSession.clear();
+    QSharedPointer<QNetworkSession> newSession;
+    if (config.isValid())
+        newSession = QSharedNetworkSessionManager::getSession(config);
+
+    if (networkSession) {
+        //do nothing if new and old session are the same
+        if (networkSession == newSession)
+            return;
+        //disconnect from old session
+        QObject::disconnect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
+        QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
+        QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
+            q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
+    }
+
+    //switch to new session (null if config was invalid)
+    networkSession = newSession;
+
+    if (!networkSession) {
         online = false;
 
         if (networkAccessible == QNetworkAccessManager::NotAccessible)
@@ -1356,8 +1373,7 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
         return;
     }
 
-    networkSession = QSharedNetworkSessionManager::getSession(config);
-
+    //connect to new session
     QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
     //QueuedConnection is used to avoid deleting the networkSession inside its closed signal
     QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
@@ -1369,9 +1385,15 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
 
 void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
 {
+    Q_Q(QNetworkAccessManager);
     if (networkSession) {
         networkConfiguration = networkSession->configuration().identifier();
 
+        //disconnect from old session
+        QObject::disconnect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
+        QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
+        QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
+            q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
         networkSession.clear();
     }
 }
@@ -1380,8 +1402,12 @@ void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession
 {
     Q_Q(QNetworkAccessManager);
 
-    if (state == QNetworkSession::Connected)
+    //Do not emit the networkSessionConnected signal here, except for roaming -> connected
+    //transition, otherwise it is emitted twice in a row when opening a connection.
+    if (state == QNetworkSession::Connected && lastSessionState == QNetworkSession::Roaming)
         emit q->networkSessionConnected();
+    lastSessionState = state;
+
     if (online) {
         if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
             online = false;
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index cf4d2f3..6dcb6da 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -77,6 +77,7 @@ public:
 #endif
 #ifndef QT_NO_BEARERMANAGEMENT
           networkSession(0),
+          lastSessionState(QNetworkSession::Invalid),
           networkAccessible(QNetworkAccessManager::Accessible),
           online(false),
           initializeSession(true),
@@ -129,6 +130,7 @@ public:
 
 #ifndef QT_NO_BEARERMANAGEMENT
     QSharedPointer<QNetworkSession> networkSession;
+    QNetworkSession::State lastSessionState;
     QString networkConfiguration;
     QNetworkAccessManager::NetworkAccessibility networkAccessible;
     bool online;
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 41a6c62..8f2e64e 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -74,7 +74,7 @@ inline QNetworkReplyImplPrivate::QNetworkReplyImplPrivate()
 void QNetworkReplyImplPrivate::_q_startOperation()
 {
     // ensure this function is only being called once
-    if (state == Working) {
+    if (state == Working || state == Finished) {
         qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
         return;
     }
-- 
cgit v0.12


From b7667461ca80613d018f2258b54b5d1f9195e50d Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Tue, 22 Feb 2011 17:12:40 +0100
Subject: tst_qnetworkreply: Fix httpProxyCommands() on Windows.

Reviewed-by: Markus Goetz
---
 src/network/socket/qhttpsocketengine.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 4e628f3..6a025f2 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -743,7 +743,10 @@ void QHttpSocketEngine::emitReadNotification()
 {
     Q_D(QHttpSocketEngine);
     d->readNotificationActivated = true;
-    if (d->readNotificationEnabled && !d->readNotificationPending) {
+    // if there is a connection notification pending we have to emit the readNotification
+    // incase there is connection error. This is only needed for Windows, but it does not
+    // hurt in other cases.
+    if ((d->readNotificationEnabled && !d->readNotificationPending) || d->connectionNotificationPending) {
         d->readNotificationPending = true;
         QMetaObject::invokeMethod(this, "emitPendingReadNotification", Qt::QueuedConnection);
     }
-- 
cgit v0.12


From d9753717f322ffdd59017e91541fe27201940169 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Feb 2011 13:52:29 +0000
Subject: Fix compile errors in bearer tests

Excluded maemo code from symbian builds.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkconfiguration/tst_qnetworkconfiguration.cpp |  8 ++++----
 .../tst_qnetworkconfigurationmanager.cpp                       |  8 ++++----
 tests/auto/qnetworksession/test/tst_qnetworksession.cpp        | 10 ++++------
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/tests/auto/qnetworkconfiguration/tst_qnetworkconfiguration.cpp b/tests/auto/qnetworkconfiguration/tst_qnetworkconfiguration.cpp
index adcfd93..c31eac7 100644
--- a/tests/auto/qnetworkconfiguration/tst_qnetworkconfiguration.cpp
+++ b/tests/auto/qnetworkconfiguration/tst_qnetworkconfiguration.cpp
@@ -52,7 +52,7 @@
 */
 #include <QNetworkAccessManager>
 
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
 #include <stdio.h>
 #include <iapconf.h>
 #endif
@@ -73,7 +73,7 @@ private slots:
     void isRoamingAvailable();
 
 private:
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     Maemo::IAPConf *iapconf;
     Maemo::IAPConf *iapconf2;
     Maemo::IAPConf *gprsiap;
@@ -85,7 +85,7 @@ private:
 
 void tst_QNetworkConfiguration::initTestCase()
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf = new Maemo::IAPConf("007");
     iapconf->setValue("ipv4_type", "AUTO");
     iapconf->setValue("wlan_wepkey1", "connt");
@@ -158,7 +158,7 @@ void tst_QNetworkConfiguration::initTestCase()
 
 void tst_QNetworkConfiguration::cleanupTestCase()
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf->clear();
     delete iapconf;
     iapconf2->clear();
diff --git a/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp b/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp
index 443fd18..7787608 100644
--- a/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp
+++ b/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp
@@ -45,7 +45,7 @@
 #include <QtNetwork/qnetworkconfiguration.h>
 #include <QtNetwork/qnetworkconfigmanager.h>
 
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
 #include <stdio.h>
 #include <iapconf.h>
 #endif
@@ -67,7 +67,7 @@ private slots:
     void configurationFromIdentifier();
 
 private:
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     Maemo::IAPConf *iapconf;
     Maemo::IAPConf *iapconf2;
     Maemo::IAPConf *gprsiap;
@@ -79,7 +79,7 @@ private:
 
 void tst_QNetworkConfigurationManager::initTestCase()
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf = new Maemo::IAPConf("007");
     iapconf->setValue("ipv4_type", "AUTO");
     iapconf->setValue("wlan_wepkey1", "connt");
@@ -153,7 +153,7 @@ void tst_QNetworkConfigurationManager::initTestCase()
 
 void tst_QNetworkConfigurationManager::cleanupTestCase()
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf->clear();
     delete iapconf;
     iapconf2->clear();
diff --git a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
index 37fc9cd..154f790 100644
--- a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
+++ b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp
@@ -48,7 +48,7 @@
 #include <QtNetwork/qnetworkconfigmanager.h>
 #include <QtNetwork/qnetworksession.h>
 
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
 #include <stdio.h>
 #include <iapconf.h>
 #endif
@@ -60,8 +60,6 @@ QT_USE_NAMESPACE
 
 Q_DECLARE_METATYPE(QNetworkConfiguration)
 Q_DECLARE_METATYPE(QNetworkConfiguration::Type);
-Q_DECLARE_METATYPE(QNetworkSession::State);
-Q_DECLARE_METATYPE(QNetworkSession::SessionError);
 
 class tst_QNetworkSession : public QObject
 {
@@ -107,7 +105,7 @@ private:
 
     int inProcessSessionManagementCount;
 
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     Maemo::IAPConf *iapconf;
     Maemo::IAPConf *iapconf2;
     Maemo::IAPConf *gprsiap;
@@ -144,7 +142,7 @@ void tst_QNetworkSession::initTestCase()
     testsToRun["userChoiceSession"] = true;
     testsToRun["sessionOpenCloseStop"] = true;
 	
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf = new Maemo::IAPConf("007");
     iapconf->setValue("ipv4_type", "AUTO");
     iapconf->setValue("wlan_wepkey1", "connt");
@@ -230,7 +228,7 @@ void tst_QNetworkSession::cleanupTestCase()
                  "inProcessSessionManagement()");
     }
 
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_ICD) && !defined (Q_OS_SYMBIAN)
     iapconf->clear();
     delete iapconf;
     iapconf2->clear();
-- 
cgit v0.12


From 81fe6eac7530ad508bf54e7996cbdc9e2f0cb5d1 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 18 Feb 2011 17:58:47 +0100
Subject: Added UI languages property to QLocale

The return value is a sorted list of locale names that could be used for
presenting data to the user (i.e. for translations).

Task-number: QTBUG-7329
Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp      | 133 +++++++++++++++++++++++++++++++++++--
 src/corelib/tools/qlocale.h        |   3 +
 tests/auto/qlocale/tst_qlocale.cpp |  16 +++++
 tests/manual/qlocale/languages.cpp |  62 +++++++++++++++++
 tests/manual/qlocale/languages.h   |  62 +++++++++++++++++
 tests/manual/qlocale/qlocale.pro   |   4 +-
 tests/manual/qlocale/window.cpp    |   3 +
 tests/manual/qlocale/window.h      |   2 +
 8 files changed, 279 insertions(+), 6 deletions(-)
 create mode 100644 tests/manual/qlocale/languages.cpp
 create mode 100644 tests/manual/qlocale/languages.h

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 6f21633..ba9400c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -69,6 +69,7 @@ QT_END_NAMESPACE
 #   include <CoreFoundation/CoreFoundation.h>
 #endif
 #include "private/qnumeric_p.h"
+#include "private/qsystemlibrary_p.h"
 
 #include <ctype.h>
 #include <float.h>
@@ -254,12 +255,18 @@ static const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Cou
     return locale_data + idx;
 }
 
-static bool splitLocaleName(const QString &name, QChar *lang_begin, QChar *cntry_begin)
+static bool splitLocaleName(const QString &name,
+                            QChar *lang_begin, QChar *cntry_begin,
+                            int *lang_len = 0, int *cntry_len = 0)
 {
     for (int i = 0; i < 3; ++i)
         lang_begin[i] = 0;
     for (int i = 0; i < 3; ++i)
         cntry_begin[i] = 0;
+    if (lang_len)
+        *lang_len = 0;
+    if (cntry_len)
+        *cntry_len = 0;
 
     int l = name.length();
 
@@ -302,9 +309,13 @@ static bool splitLocaleName(const QString &name, QChar *lang_begin, QChar *cntry
         ++uc;
     }
 
-    int lang_len = lang - lang_begin;
+    if (lang_len)
+        *lang_len = lang - lang_begin;
+    if (cntry_len)
+        *cntry_len = cntry - cntry_begin;
 
-    return lang_len == 2 || lang_len == 3;
+    int lang_length = lang - lang_begin;
+    return lang_length == 2 || lang_length == 3;
 }
 
 void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Country &cntry)
@@ -733,6 +744,51 @@ static QString winFormatCurrency(const QVariant &in)
     return QString::fromWCharArray(out.data());
 }
 
+QStringList winUILanguages()
+{
+    if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) {
+        typedef BOOL (*GetUserPreferredUILanguagesFunc) (
+                    DWORD dwFlags,
+                    PULONG pulNumLanguages,
+                    PWSTR pwszLanguagesBuffer,
+                    PULONG pcchLanguagesBuffer);
+        static GetUserPreferredUILanguagesFunc GetUserPreferredUILanguages_ptr = 0;
+        if (!GetUserPreferredUILanguages_ptr) {
+            QSystemLibrary lib(QLatin1String("kernel32"));
+            if (lib.load())
+                GetUserPreferredUILanguages_ptr = (GetUserPreferredUILanguagesFunc)lib.resolve("GetUserPreferredUILanguages");
+        }
+        if (GetUserPreferredUILanguages_ptr) {
+            unsigned long cnt = 0;
+            QVarLengthArray<wchar_t, 64> buf(64);
+            unsigned long size = buf.size();
+            if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size)) {
+                size = 0;
+                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
+                    GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
+                    buf.resize(size);
+                    if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
+                        return QStringList();
+                }
+            }
+            QStringList result;
+            result.reserve(cnt);
+            const wchar_t *str = buf.constData();
+            for (; cnt > 0; --cnt) {
+                QString s = QString::fromWCharArray(str);
+                if (s.isEmpty())
+                    break; // something is wrong
+                result.append(s);
+                str += s.size()+1;
+            }
+            return result;
+        }
+    }
+
+    // old Windows before Vista
+    return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
+}
+
 /*!
     \since 4.6
     Returns the fallback locale obtained from the system.
@@ -828,6 +884,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
     case FormatCurrency:
         return QVariant(winFormatCurrency(in));
+    case UILanguages:
+        return QVariant(winUILanguages());
     default:
         break;
     }
@@ -1428,6 +1486,21 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
     case FormatCurrency:
         return macFormatCurrency(in);
+    case UILanguages: {
+        QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
+                 CFSTR("AppleLanguages"),
+                 kCFPreferencesAnyApplication,
+                 kCFPreferencesCurrentUser,
+                 kCFPreferencesAnyHost);
+        const int cnt = CFArrayGetCount(languages);
+        QStringList result;
+        result.reserve(cnt);
+        for (int i = 0; i < cnt; ++i) {
+            const QString lang = QCFString::toQString(
+                        static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i)));
+            result.append(lang);
+        }
+        return QVariant(result);
     case QuotationBegin:
     case QuotationEnd: {
         return macQuotationSymbol(type,in);
@@ -1477,9 +1550,37 @@ QVariant QSystemLocale::query(QueryType type, QVariant /* in */) const
 {
     if (type == MeasurementSystem) {
         return QVariant(unixGetSystemMeasurementSystem());
-    } else {
+    } else if (type == UILanguages) {
+        QString languages = QString::fromLocal8Bit(qgetenv("LANGUAGE"));
+        if (!languages.isEmpty()) {
+            QStringList lst = languages.split(QLatin1Char(':'));
+            for (int i = 0; i < lst.size();) {
+                const QString &name = lst.at(i);
+                QChar lang[3];
+                QChar cntry[3];
+                if (name.isEmpty() || !splitLocaleName(name, lang, cntry))
+                    lst.removeAt(i);
+                else
+                    ++i;
+            }
+            return lst;
+        }
+        QString name = QString::fromLocal8Bit(qgetenv("LC_ALL"));
+        if (name.isEmpty()) {
+            name = QString::fromLocal8Bit(qgetenv("LC_MESSAGES"));
+            if (name.isEmpty())
+                name = QString::fromLocal8Bit(qgetenv("LANG"));
+        }
+        if (!name.isEmpty()) {
+            QChar lang[3];
+            QChar cntry[3];
+            int lang_len, cntry_len;
+            if (splitLocaleName(name, lang, cntry, &lang_len, &cntry_len))
+                return QStringList(QString::fromRawData(lang, lang_len) % QLatin1Char('-') % QString::fromRawData(cntry, cntry_len));
+        }
         return QVariant();
     }
+    return QVariant();
 }
 
 #elif !defined(Q_OS_SYMBIAN)
@@ -1574,6 +1675,7 @@ Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
   \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
   \value FormatCurrency a localized string representation of a number with a currency symbol.
+  \value UILanguages a list of strings representing locale names that could be used for UI translation.
   \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
   \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
 */
@@ -5078,6 +5180,29 @@ QString QLocale::toCurrencyString(double value) const
     return format.arg(str, symbol);
 }
 
+/*!
+    \since 4.8
+
+    Returns a sorted list of locale names that could be used for translation
+    of messages presented to the user.
+
+    \sa QTranslator
+*/
+QStringList QLocale::uiLanguages() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
+        if (!res.isNull()) {
+            QStringList result = res.toStringList();
+            if (!result.isEmpty())
+                return result;
+        }
+    }
+#endif
+    return QStringList(name());
+}
+
 /*-
  * Copyright (c) 1992, 1993
  *        The Regents of the University of California.  All rights reserved.
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 924cb7b..18c6db3 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -98,6 +98,7 @@ public:
         FirstDayOfWeek, // Qt::DayOfWeek
         CurrencySymbol, // QString in: format
         FormatCurrency, // QString in: qlonglong, qulonglong or double
+        UILanguages, // QStringList
         QuotationBegin, // QString in: StandardQuotation or AlternateQuotation
         QuotationEnd // QString in: StandardQuotation or AlternateQuotation
     };
@@ -694,6 +695,8 @@ public:
     QString toCurrencyString(double) const;
     inline QString toCurrencyString(float) const;
 
+    QStringList uiLanguages() const;
+
     inline bool operator==(const QLocale &other) const;
     inline bool operator!=(const QLocale &other) const;
 
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 250aac9..878a31e 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -142,6 +142,7 @@ private slots:
     void ampm();
     void currency();
     void quoteString();
+    void uiLanguages();
 
 private:
     QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
@@ -2169,5 +2170,20 @@ void tst_QLocale::quoteString()
 
 }
 
+void tst_QLocale::uiLanguages()
+{
+    const QLocale c(QLocale::C);
+    QCOMPARE(c.uiLanguages().size(), 1);
+    QCOMPARE(c.uiLanguages().at(0), QLatin1String("C"));
+
+    const QLocale en_US("en_US");
+    QCOMPARE(en_US.uiLanguages().size(), 1);
+    QCOMPARE(en_US.uiLanguages().at(0), QLatin1String("en_US"));
+
+    const QLocale ru_RU("ru_RU");
+    QCOMPARE(ru_RU.uiLanguages().size(), 1);
+    QCOMPARE(ru_RU.uiLanguages().at(0), QLatin1String("ru_RU"));
+}
+
 QTEST_APPLESS_MAIN(tst_QLocale)
 #include "tst_qlocale.moc"
diff --git a/tests/manual/qlocale/languages.cpp b/tests/manual/qlocale/languages.cpp
new file mode 100644
index 0000000..65029c3
--- /dev/null
+++ b/tests/manual/qlocale/languages.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "languages.h"
+
+LanguagesWidget::LanguagesWidget()
+{
+    QVBoxLayout *l = new QVBoxLayout(this);
+
+    languagesLabel = new QLabel("Preferred languages:");
+    languagesList = new QListWidget;
+
+    l->addWidget(languagesLabel);
+    l->addWidget(languagesList);
+
+    localeChanged(QLocale());
+}
+
+void LanguagesWidget::localeChanged(QLocale locale)
+{
+    languagesList->clear();
+    languagesList->addItems(locale.uiLanguages());
+}
+
+
diff --git a/tests/manual/qlocale/languages.h b/tests/manual/qlocale/languages.h
new file mode 100644
index 0000000..18e503f
--- /dev/null
+++ b/tests/manual/qlocale/languages.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LANGUAGES_H
+#define LANGUAGES_H
+
+#include <QtGui>
+
+class LanguagesWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    LanguagesWidget();
+
+private:
+    QLocale currentLocale;
+
+    QLabel *languagesLabel;
+    QListWidget *languagesList;
+
+private slots:
+    void localeChanged(QLocale locale);
+};
+
+#endif
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 66d527b..46eaa16 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -4,5 +4,5 @@ DEPENDPATH += .
 INCLUDEPATH += .
 
 # Input
-HEADERS += currency.h calendar.h window.h  miscellaneous.h
-SOURCES += currency.cpp main.cpp calendar.cpp window.cpp miscellaneous.cpp
+HEADERS += currency.h calendar.h languages.h window.h miscellaneous.h
+SOURCES += currency.cpp main.cpp calendar.cpp languages.cpp window.cpp miscellaneous.cpp
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index caafcee..ebe5ea9 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -67,6 +67,8 @@ Window::Window()
     connect(this, SIGNAL(localeChanged(QLocale)), calendar, SLOT(localeChanged(QLocale)));
     currency = new CurrencyWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), currency, SLOT(localeChanged(QLocale)));
+    languages = new LanguagesWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), languages, SLOT(localeChanged(QLocale)));
     miscellaneous = new MiscWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), miscellaneous, SLOT(localeChanged(QLocale)));
 
@@ -83,6 +85,7 @@ Window::Window()
 
     tabWidget->addTab(calendar, "Calendar");
     tabWidget->addTab(currency, "Currency");
+    tabWidget->addTab(languages, "Languages");
     tabWidget->addTab(miscellaneous, "Misc");
     localeCombo->setCurrentIndex(0);
     systemLocaleChanged();
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
index c9a5480..35719ae 100644
--- a/tests/manual/qlocale/window.h
+++ b/tests/manual/qlocale/window.h
@@ -45,6 +45,7 @@
 
 #include "calendar.h"
 #include "currency.h"
+#include "languages.h"
 #include "miscellaneous.h"
 
 class Window : public QWidget
@@ -58,6 +59,7 @@ public:
     QTabWidget *tabWidget;
     CalendarWidget *calendar;
     CurrencyWidget *currency;
+    LanguagesWidget *languages;
     MiscWidget *miscellaneous;
 
 private:
-- 
cgit v0.12


From b0909ad9254a772abb5d91f2a179446e643c0fca Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 22 Feb 2011 15:38:58 +0100
Subject: Improved qlocale manualtest

Reviewed-by: trustme
---
 tests/manual/qlocale/currency.cpp      |  28 +++---
 tests/manual/qlocale/currency.h        |   3 -
 tests/manual/qlocale/dateformats.cpp   | 179 +++++++++++++++++++++++++++++++++
 tests/manual/qlocale/dateformats.h     |  78 ++++++++++++++
 tests/manual/qlocale/languages.cpp     |  11 +-
 tests/manual/qlocale/main.cpp          |   2 -
 tests/manual/qlocale/miscellaneous.cpp |  45 +++++----
 tests/manual/qlocale/miscellaneous.h   |   5 +-
 tests/manual/qlocale/numberformats.cpp |  83 +++++++++++++++
 tests/manual/qlocale/numberformats.h   |  63 ++++++++++++
 tests/manual/qlocale/qlocale.pro       |   4 +-
 tests/manual/qlocale/window.cpp        |   9 +-
 tests/manual/qlocale/window.h          |   4 +
 13 files changed, 469 insertions(+), 45 deletions(-)
 create mode 100644 tests/manual/qlocale/dateformats.cpp
 create mode 100644 tests/manual/qlocale/dateformats.h
 create mode 100644 tests/manual/qlocale/numberformats.cpp
 create mode 100644 tests/manual/qlocale/numberformats.h

diff --git a/tests/manual/qlocale/currency.cpp b/tests/manual/qlocale/currency.cpp
index ec932ff..c55df3d 100644
--- a/tests/manual/qlocale/currency.cpp
+++ b/tests/manual/qlocale/currency.cpp
@@ -42,7 +42,7 @@
 
 CurrencyWidget::CurrencyWidget()
 {
-    QGridLayout *l = new QGridLayout(this);
+    QGridLayout *l = new QGridLayout;
 
     currencySymbolLabel = new QLabel("Symbol:");
     currencySymbol = new QLineEdit;
@@ -54,7 +54,6 @@ CurrencyWidget::CurrencyWidget()
     currencyFormattingValue = new QLineEdit(QString::number(1234.56, 'f', 2));
     currencyFormatting = new QLineEdit;
 
-
     l->addWidget(currencySymbolLabel, 0, 0);
     l->addWidget(currencySymbol, 0, 1, 1, 2);
     l->addWidget(currencyISOLabel, 1, 0);
@@ -65,19 +64,12 @@ CurrencyWidget::CurrencyWidget()
     l->addWidget(currencyFormattingValue, 3, 1);
     l->addWidget(currencyFormatting, 3, 2);
 
+    QVBoxLayout *v = new QVBoxLayout(this);
+    v->addLayout(l);
+    v->addStretch();
+
     connect(currencyFormattingValue, SIGNAL(textChanged(QString)),
             this, SLOT(updateCurrencyFormatting(QString)));
-
-    update(QLocale());
-}
-
-void CurrencyWidget::update(const QLocale locale)
-{
-    currentLocale = locale;
-    currencySymbol->setText(locale.currencySymbol());
-    currencyISO->setText(locale.currencySymbol(QLocale::CurrencyIsoCode));
-    currencyName->setText(locale.currencySymbol(QLocale::CurrencyDisplayName));
-    updateCurrencyFormatting(currencyFormattingValue->text());
 }
 
 void CurrencyWidget::updateCurrencyFormatting(QString value)
@@ -86,17 +78,21 @@ void CurrencyWidget::updateCurrencyFormatting(QString value)
     bool ok;
     int i = value.toInt(&ok);
     if (ok) {
-        result = currentLocale.toCurrencyString(i);
+        result = locale().toCurrencyString(i);
     } else {
         double d = value.toDouble(&ok);
         if (ok)
-            result = currentLocale.toCurrencyString(d);
+            result = locale().toCurrencyString(d);
     }
     currencyFormatting->setText(result);
 }
 
 void CurrencyWidget::localeChanged(QLocale locale)
 {
-    update(locale);
+    setLocale(locale);
+    currencySymbol->setText(locale.currencySymbol());
+    currencyISO->setText(locale.currencySymbol(QLocale::CurrencyIsoCode));
+    currencyName->setText(locale.currencySymbol(QLocale::CurrencyDisplayName));
+    updateCurrencyFormatting(currencyFormattingValue->text());
 }
 
diff --git a/tests/manual/qlocale/currency.h b/tests/manual/qlocale/currency.h
index 97e1dd9..5e43689 100644
--- a/tests/manual/qlocale/currency.h
+++ b/tests/manual/qlocale/currency.h
@@ -50,8 +50,6 @@ public:
     CurrencyWidget();
 
 private:
-    QLocale currentLocale;
-
     QLabel *currencySymbolLabel;
     QLineEdit *currencySymbol;
     QLabel *currencyISOLabel;
@@ -64,7 +62,6 @@ private:
 
 private slots:
     void localeChanged(QLocale locale);
-    void update(const QLocale locale);
     void updateCurrencyFormatting(QString);
 };
 
diff --git a/tests/manual/qlocale/dateformats.cpp b/tests/manual/qlocale/dateformats.cpp
new file mode 100644
index 0000000..25b3e7a
--- /dev/null
+++ b/tests/manual/qlocale/dateformats.cpp
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "dateformats.h"
+
+DateFormatsWidget::DateFormatsWidget()
+{
+    scrollArea = new QScrollArea;
+    scrollAreaWidget = new QWidget;
+    scrollArea->setWidget(scrollAreaWidget);
+    scrollArea->setWidgetResizable(true);
+    layout = new QGridLayout(scrollAreaWidget);
+    QVBoxLayout *l = new QVBoxLayout(this);
+    l->addWidget(scrollArea);
+
+    shortDateFormat     = addItem("Date format (short):");
+    longDateFormat      = addItem("Date format (long):");
+    shortTimeFormat     = addItem("Time format (short):");
+    longTimeFormat      = addItem("Time format (long):");
+    shortDateTimeFormat = addItem("DateTime format (short):");
+    longDateTimeFormat  = addItem("DateTime format (long):");
+    amText = addItem("Before noon:");
+    pmText = addItem("After noon:");
+    firstDayOfWeek = addItem("First day of week:");
+
+    monthNamesShort = new QComboBox;
+    monthNamesLong = new QComboBox;
+    standaloneMonthNamesShort = new QComboBox;
+    standaloneMonthNamesLong = new QComboBox;
+    dayNamesShort = new QComboBox;
+    dayNamesLong = new QComboBox;
+    standaloneDayNamesShort = new QComboBox;
+    standaloneDayNamesLong = new QComboBox;
+
+    int row = layout->rowCount();
+    layout->addWidget(new QLabel("Month names [short/long]:"), row, 0);
+    layout->addWidget(monthNamesShort, row, 1);
+    layout->addWidget(monthNamesLong, row, 2);
+    row = layout->rowCount();
+    layout->addWidget(new QLabel("Standalone month names [short/long]:"), row, 0);
+    layout->addWidget(standaloneMonthNamesShort, row, 1);
+    layout->addWidget(standaloneMonthNamesLong, row, 2);
+    row = layout->rowCount();
+    layout->addWidget(new QLabel("Day names [short/long]:"), row, 0);
+    layout->addWidget(dayNamesShort, row, 1);
+    layout->addWidget(dayNamesLong, row, 2);
+    row = layout->rowCount();
+    layout->addWidget(new QLabel("Standalone day names [short/long]:"), row, 0);
+    layout->addWidget(standaloneDayNamesShort, row, 1);
+    layout->addWidget(standaloneDayNamesLong, row, 2);
+}
+
+QString toString(Qt::DayOfWeek dow)
+{
+    static const char *names[] = {
+        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
+    };
+    return QString::fromLatin1(names[dow-1]);
+}
+
+void DateFormatsWidget::localeChanged(QLocale locale)
+{
+    setLocale(locale);
+    QDateTime now = QDateTime::currentDateTime();
+    shortDateFormat->setText(locale.toString(now.date(), QLocale::ShortFormat));
+    shortDateFormat->setToolTip(locale.dateFormat(QLocale::ShortFormat));
+    longDateFormat->setText(locale.toString(now.date(), QLocale::LongFormat));
+    longDateFormat->setToolTip(locale.dateFormat(QLocale::LongFormat));
+    shortTimeFormat->setText(locale.toString(now.time(), QLocale::ShortFormat));
+    shortTimeFormat->setToolTip(locale.timeFormat(QLocale::ShortFormat));
+    longTimeFormat->setText(locale.toString(now.time(), QLocale::LongFormat));
+    longTimeFormat->setToolTip(locale.timeFormat(QLocale::LongFormat));
+    shortDateTimeFormat->setText(locale.toString(now, QLocale::ShortFormat));
+    shortDateTimeFormat->setToolTip(locale.dateTimeFormat(QLocale::ShortFormat));
+    longDateTimeFormat->setText(locale.toString(now, QLocale::LongFormat));
+    longDateTimeFormat->setToolTip(locale.dateTimeFormat(QLocale::LongFormat));
+    amText->setText(locale.amText());
+    pmText->setText(locale.pmText());
+    firstDayOfWeek->setText(toString(locale.firstDayOfWeek()));
+
+    int mns = monthNamesShort->currentIndex();
+    int mnl = monthNamesLong->currentIndex();
+    int smns = standaloneMonthNamesShort->currentIndex();
+    int smnl = standaloneMonthNamesLong->currentIndex();
+    int dnl = dayNamesLong->currentIndex();
+    int dns = dayNamesShort->currentIndex();
+    int sdnl = standaloneDayNamesLong->currentIndex();
+    int sdns = standaloneDayNamesShort->currentIndex();
+
+    monthNamesShort->clear();
+    monthNamesLong->clear();
+    standaloneMonthNamesShort->clear();
+    standaloneMonthNamesLong->clear();
+    dayNamesLong->clear();
+    dayNamesShort->clear();
+    standaloneDayNamesLong->clear();
+    standaloneDayNamesShort->clear();
+
+    for (int i = 1; i <= 12; ++i)
+        monthNamesShort->addItem(locale.monthName(i, QLocale::ShortFormat));
+    monthNamesShort->setCurrentIndex(mns >= 0 ? mns : 0);
+    for (int i = 1; i <= 12; ++i)
+        monthNamesLong->addItem(locale.monthName(i, QLocale::LongFormat));
+    monthNamesLong->setCurrentIndex(mnl >= 0 ? mnl : 0);
+
+    for (int i = 1; i <= 12; ++i)
+        standaloneMonthNamesShort->addItem(locale.standaloneMonthName(i, QLocale::ShortFormat));
+    standaloneMonthNamesShort->setCurrentIndex(smns >= 0 ? smns : 0);
+    for (int i = 1; i <= 12; ++i)
+        standaloneMonthNamesLong->addItem(locale.standaloneMonthName(i, QLocale::LongFormat));
+    standaloneMonthNamesLong->setCurrentIndex(smnl >= 0 ? smnl : 0);
+
+    for (int i = 1; i <= 7; ++i)
+        dayNamesLong->addItem(locale.dayName(i, QLocale::LongFormat));
+    dayNamesLong->setCurrentIndex(dnl >= 0 ? dnl : 0);
+    for (int i = 1; i <= 7; ++i)
+        dayNamesShort->addItem(locale.dayName(i, QLocale::ShortFormat));
+    dayNamesShort->setCurrentIndex(dns >= 0 ? dns : 0);
+
+    for (int i = 1; i <= 7; ++i)
+        standaloneDayNamesLong->addItem(locale.standaloneDayName(i, QLocale::LongFormat));
+    standaloneDayNamesLong->setCurrentIndex(sdnl >= 0 ? sdnl : 0);
+    for (int i = 1; i <= 7; ++i)
+        standaloneDayNamesShort->addItem(locale.standaloneDayName(i, QLocale::ShortFormat));
+    standaloneDayNamesShort->setCurrentIndex(sdns >= 0 ? sdns : 0);
+}
+
+void DateFormatsWidget::addItem(const QString &label, QWidget *w)
+{
+    QLabel *lbl = new QLabel(label);
+    int row = layout->rowCount();
+    layout->addWidget(lbl, row, 0);
+    layout->addWidget(w, row, 1, 1, 2);
+}
+
+QLineEdit *DateFormatsWidget::addItem(const QString &label)
+{
+    QLineEdit *le = new QLineEdit;
+    le->setReadOnly(true);
+    addItem(label, le);
+    return le;
+}
diff --git a/tests/manual/qlocale/dateformats.h b/tests/manual/qlocale/dateformats.h
new file mode 100644
index 0000000..f05ad2a
--- /dev/null
+++ b/tests/manual/qlocale/dateformats.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DATEFORMATS_H
+#define DATEFORMATS_H
+
+#include <QtGui>
+
+class DateFormatsWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    DateFormatsWidget();
+
+private:
+    void addItem(const QString &label, QWidget *);
+    QLineEdit *addItem(const QString &label);
+
+    QScrollArea *scrollArea;
+    QWidget *scrollAreaWidget;
+    QGridLayout *layout;
+
+    QLineEdit *shortDateFormat;
+    QLineEdit *longDateFormat;
+    QLineEdit *shortTimeFormat;
+    QLineEdit *longTimeFormat;
+    QLineEdit *shortDateTimeFormat;
+    QLineEdit *longDateTimeFormat;
+    QLineEdit *amText;
+    QLineEdit *pmText;
+    QLineEdit *firstDayOfWeek;
+    QComboBox *monthNamesShort, *monthNamesLong;
+    QComboBox *standaloneMonthNamesShort, *standaloneMonthNamesLong;
+    QComboBox *dayNamesShort, *dayNamesLong;
+    QComboBox *standaloneDayNamesShort, *standaloneDayNamesLong;
+
+private slots:
+    void localeChanged(QLocale locale);
+};
+
+#endif
diff --git a/tests/manual/qlocale/languages.cpp b/tests/manual/qlocale/languages.cpp
index 65029c3..18d72d7 100644
--- a/tests/manual/qlocale/languages.cpp
+++ b/tests/manual/qlocale/languages.cpp
@@ -56,7 +56,16 @@ LanguagesWidget::LanguagesWidget()
 void LanguagesWidget::localeChanged(QLocale locale)
 {
     languagesList->clear();
-    languagesList->addItems(locale.uiLanguages());
+    foreach (const QString &lang, locale.uiLanguages()) {
+        QListWidgetItem *item = new QListWidgetItem(lang, languagesList);
+        QLocale l(lang);
+        if (l.language() != QLocale::C) {
+            QString language = QLocale::languageToString(l.language());
+            QString country = QLocale::countryToString(l.country());
+            QString tooltip = QString(QLatin1String("%1: %2/%3")).arg(l.name(), language, country);
+            item->setToolTip(tooltip);
+        }
+    }
 }
 
 
diff --git a/tests/manual/qlocale/main.cpp b/tests/manual/qlocale/main.cpp
index f96e0a2..b14a44f 100644
--- a/tests/manual/qlocale/main.cpp
+++ b/tests/manual/qlocale/main.cpp
@@ -40,8 +40,6 @@
 
 #include <QtGui>
 
-#include "calendar.h"
-#include "currency.h"
 #include "window.h"
 
 int main(int argv, char *args[])
diff --git a/tests/manual/qlocale/miscellaneous.cpp b/tests/manual/qlocale/miscellaneous.cpp
index a1a3139..0b2250a 100644
--- a/tests/manual/qlocale/miscellaneous.cpp
+++ b/tests/manual/qlocale/miscellaneous.cpp
@@ -42,14 +42,13 @@
 
 MiscWidget::MiscWidget()
 {
-    QGridLayout *l = new QGridLayout(this);
+    QGridLayout *l = new QGridLayout;
 
-    textToQuoteLabel = new QLabel("Text to quote:");
-    standardQuotedTextLabel = new QLabel("Standard quotes:");
-    alternateQuotedTextLabel = new QLabel("Alternate quotes:");
-    textToQuote = new QLineEdit("some text");
-    standardQuotedText = new QLineEdit;
-    alternateQuotedText = new QLineEdit;
+    createLineEdit("Text to quote:", &textToQuoteLabel, &textToQuote);
+    createLineEdit("Standard quotes:", &standardQuotedTextLabel, &standardQuotedText);
+    createLineEdit("Alternate quotes:", &alternateQuotedTextLabel, &alternateQuotedText);
+    textToQuote->setText("some text");
+    createLineEdit("Text direction:", &textDirectionLabel, &textDirection);
 
     l->addWidget(textToQuoteLabel, 0, 0);
     l->addWidget(textToQuote, 0, 1);
@@ -57,27 +56,37 @@ MiscWidget::MiscWidget()
     l->addWidget(standardQuotedText, 0, 3);
     l->addWidget(alternateQuotedTextLabel, 1, 2);
     l->addWidget(alternateQuotedText, 1, 3);
+    l->addWidget(textDirectionLabel, 2, 0);
+    l->addWidget(textDirection, 2, 1, 1, 3);
 
     connect(textToQuote, SIGNAL(textChanged(QString)), this, SLOT(updateQuotedText(QString)));
 
-    update(QLocale());
-}
-
-void MiscWidget::update(const QLocale locale)
-{
-    currentLocale = locale;
-    updateQuotedText(textToQuote->text());
+    QVBoxLayout *v = new QVBoxLayout(this);
+    v->addLayout(l);
+    v->addStretch();
 }
 
 void MiscWidget::updateQuotedText(QString str)
 {
-    standardQuotedText->setText(currentLocale.quoteString(str));
-    alternateQuotedText->setText(currentLocale.quoteString(str, QLocale::AlternateQuotation));
+    standardQuotedText->setText(locale().quoteString(str));
+    alternateQuotedText->setText(locale().quoteString(str, QLocale::AlternateQuotation));
 }
 
 void MiscWidget::localeChanged(QLocale locale)
 {
-    update(locale);
+    setLocale(locale);
+    updateQuotedText(textToQuote->text());
+    textDirection->setText(locale.textDirection() == Qt::LeftToRight ? "Left To Right" : "Right To Left");
 }
 
-
+void MiscWidget::createLineEdit(const QString &label, QLabel **labelWidget, QLineEdit **lineEditWidget)
+{
+    QLabel *lbl = new QLabel(label);
+    QLineEdit *le = new QLineEdit;
+    le->setReadOnly(true);
+    lbl->setBuddy(le);
+    if (labelWidget)
+        *labelWidget = lbl;
+    if (lineEditWidget)
+        *lineEditWidget = le;
+}
diff --git a/tests/manual/qlocale/miscellaneous.h b/tests/manual/qlocale/miscellaneous.h
index e4a1a36..33d8ef9 100644
--- a/tests/manual/qlocale/miscellaneous.h
+++ b/tests/manual/qlocale/miscellaneous.h
@@ -50,18 +50,19 @@ public:
     MiscWidget();
 
 private:
-    QLocale currentLocale;
+    void createLineEdit(const QString &label, QLabel **labelWidget = 0, QLineEdit **lineEditWidget = 0);
 
     QLabel *textToQuoteLabel;
     QLabel *standardQuotedTextLabel;
     QLabel *alternateQuotedTextLabel;
+    QLabel *textDirectionLabel;
     QLineEdit *textToQuote;
     QLineEdit *standardQuotedText;
     QLineEdit *alternateQuotedText;
+    QLineEdit *textDirection;
 
 private slots:
     void localeChanged(QLocale locale);
-    void update(const QLocale locale);
     void updateQuotedText(QString str);
 };
 
diff --git a/tests/manual/qlocale/numberformats.cpp b/tests/manual/qlocale/numberformats.cpp
new file mode 100644
index 0000000..7b5fce4
--- /dev/null
+++ b/tests/manual/qlocale/numberformats.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "numberformats.h"
+
+NumberFormatsWidget::NumberFormatsWidget()
+{
+    QGridLayout *l = new QGridLayout;
+
+    QLabel *numbersLabel = new QLabel("Numbers:");
+    number1 = createLineEdit();
+    number2 = createLineEdit();
+    number3 = createLineEdit();
+
+    measurementLabel = new QLabel("Measurement units:");
+    measurementSystem = createLineEdit();
+
+    l->addWidget(numbersLabel, 0, 0);
+    l->addWidget(number1, 0, 1);
+    l->addWidget(number2, 0, 2);
+    l->addWidget(number3, 0, 3);
+
+    l->addWidget(measurementLabel, 1, 0);
+    l->addWidget(measurementSystem, 1, 1, 1, 3);
+
+    QVBoxLayout *v = new QVBoxLayout(this);
+    v->addLayout(l);
+    v->addStretch();
+}
+
+void NumberFormatsWidget::localeChanged(QLocale locale)
+{
+    number1->setText(locale.toString(-123456));
+    number2->setText(locale.toString(1234.56, 'f', 2));
+    number3->setText(locale.toString(1234.56, 'e', 4));
+
+    measurementSystem->setText(
+                locale.measurementSystem() == QLocale::ImperialSystem ? "US" : "Metric");
+}
+
+QLineEdit *NumberFormatsWidget::createLineEdit()
+{
+    QLineEdit *le = new QLineEdit;
+    le->setReadOnly(true);
+    return le;
+}
diff --git a/tests/manual/qlocale/numberformats.h b/tests/manual/qlocale/numberformats.h
new file mode 100644
index 0000000..4a3ab36
--- /dev/null
+++ b/tests/manual/qlocale/numberformats.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef NUMBERFORMATS_H
+#define NUMBERFORMATS_H
+
+#include <QtGui>
+
+class NumberFormatsWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    NumberFormatsWidget();
+
+private:
+    QLineEdit *createLineEdit();
+
+    QLineEdit *number1, *number2, *number3;
+    QLabel *measurementLabel;
+    QLineEdit *measurementSystem;
+
+private slots:
+    void localeChanged(QLocale locale);
+};
+
+#endif
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 46eaa16..6f0bf88 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -4,5 +4,5 @@ DEPENDPATH += .
 INCLUDEPATH += .
 
 # Input
-HEADERS += currency.h calendar.h languages.h window.h miscellaneous.h
-SOURCES += currency.cpp main.cpp calendar.cpp languages.cpp window.cpp miscellaneous.cpp
+HEADERS += currency.h calendar.h dateformats.h numberformats.h languages.h window.h miscellaneous.h
+SOURCES += currency.cpp main.cpp calendar.cpp dateformats.cpp numberformats.cpp languages.cpp window.cpp miscellaneous.cpp
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index ebe5ea9..ed66c57 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -69,6 +69,10 @@ Window::Window()
     connect(this, SIGNAL(localeChanged(QLocale)), currency, SLOT(localeChanged(QLocale)));
     languages = new LanguagesWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), languages, SLOT(localeChanged(QLocale)));
+    dateFormats = new DateFormatsWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), dateFormats, SLOT(localeChanged(QLocale)));
+    numberFormats = new NumberFormatsWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), numberFormats, SLOT(localeChanged(QLocale)));
     miscellaneous = new MiscWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), miscellaneous, SLOT(localeChanged(QLocale)));
 
@@ -86,7 +90,10 @@ Window::Window()
     tabWidget->addTab(calendar, "Calendar");
     tabWidget->addTab(currency, "Currency");
     tabWidget->addTab(languages, "Languages");
-    tabWidget->addTab(miscellaneous, "Misc");
+    tabWidget->addTab(dateFormats, "Date Formats");
+    tabWidget->addTab(numberFormats, "Number Formats");
+    tabWidget->addTab(miscellaneous, "Text");
+
     localeCombo->setCurrentIndex(0);
     systemLocaleChanged();
 }
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
index 35719ae..b75d3b2 100644
--- a/tests/manual/qlocale/window.h
+++ b/tests/manual/qlocale/window.h
@@ -46,6 +46,8 @@
 #include "calendar.h"
 #include "currency.h"
 #include "languages.h"
+#include "dateformats.h"
+#include "numberformats.h"
 #include "miscellaneous.h"
 
 class Window : public QWidget
@@ -60,6 +62,8 @@ public:
     CalendarWidget *calendar;
     CurrencyWidget *currency;
     LanguagesWidget *languages;
+    DateFormatsWidget *dateFormats;
+    NumberFormatsWidget *numberFormats;
     MiscWidget *miscellaneous;
 
 private:
-- 
cgit v0.12


From 5a77323a1c0de27b05a545c3e446f3b288d28971 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 21 Feb 2011 18:35:07 +0100
Subject: QLocale: Supporting multiple locale categories on Unix.

This patch adds support for LC_* environment variables on Unix.

Reviewed-by: Thiago Macieira
Reviewed-by: Olivier Goffart
---
 src/corelib/tools/qlocale.cpp | 145 ++++++++++++++++++++++++++++++++++++++----
 src/corelib/tools/qlocale.h   |   2 +-
 2 files changed, 133 insertions(+), 14 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index ba9400c..f1b45a6 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -43,8 +43,8 @@
 
 #ifndef QT_NO_SYSTEMLOCALE
 QT_BEGIN_NAMESPACE
-class QSystemLocale;
-static QSystemLocale *QSystemLocale_globalSystemLocale();
+class QSystemLocaleData;
+static QSystemLocaleData *QSystemLocale_globalSystemLocale();
 QT_END_NAMESPACE
 #endif
 
@@ -136,6 +136,53 @@ void qt_symbianUpdateSystemPrivate();
 void qt_symbianInitSystemLocale();
 #endif
 
+#ifndef QT_NO_SYSTEMLOCALE
+static QSystemLocale *_systemLocale = 0;
+
+struct QSystemLocaleData
+{
+    QSystemLocaleData()
+        : locale(true)
+    #if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+        ,lc_numeric(QLocale::C)
+        ,lc_time(QLocale::C)
+        ,lc_monetary(QLocale::C)
+        ,lc_messages(QLocale::C)
+    #endif
+    {
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+        QByteArray all = qgetenv("LC_ALL");
+        QByteArray numeric  = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
+        QByteArray time     = all.isEmpty() ? qgetenv("LC_TIME") : all;
+        QByteArray monetary = all.isEmpty() ? qgetenv("LC_MONETARY") : all;
+        QByteArray messages = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
+        QByteArray lang = qgetenv("LANG");
+        if (numeric.isEmpty())
+            numeric = lang;
+        if (monetary.isEmpty())
+            monetary = lang;
+        if (messages.isEmpty())
+            messages = lang;
+        lc_numeric = QLocale(QString::fromAscii(numeric));
+        lc_time = QLocale(QString::fromAscii(time));
+        lc_monetary = QLocale(QString::fromAscii(monetary));
+        lc_messages = QLocale(QString::fromAscii(messages));
+#endif
+    }
+    QSystemLocale locale;
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+    QLocale lc_numeric;
+    QLocale lc_time;
+    QLocale lc_monetary;
+    QLocale lc_messages;
+#endif
+};
+
+Q_GLOBAL_STATIC(QSystemLocaleData, QSystemLocale_globalSystemLocale)
+static QLocalePrivate *system_lp = 0;
+Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
+#endif
+
 /******************************************************************************
 ** Helpers for accessing Qt locale database
 */
@@ -1546,11 +1593,84 @@ QLocale QSystemLocale::fallbackLocale() const
 /*!
     \internal
 */
-QVariant QSystemLocale::query(QueryType type, QVariant /* in */) const
+QVariant QSystemLocale::query(QueryType type, QVariant in) const
 {
-    if (type == MeasurementSystem) {
+    QSystemLocaleData *d = QSystemLocale_globalSystemLocale();
+    const QLocale &lc_numeric = d->lc_numeric;
+    const QLocale &lc_time = d->lc_time;
+    const QLocale &lc_monetary = d->lc_monetary;
+
+    switch (type) {
+    case DecimalPoint:
+        return lc_numeric.decimalPoint();
+    case GroupSeparator:
+        return lc_numeric.groupSeparator();
+    case ZeroDigit:
+        return lc_numeric.zeroDigit();
+    case NegativeSign:
+        return lc_numeric.negativeSign();
+    case DateFormatLong:
+        return lc_time.dateFormat(QLocale::LongFormat);
+    case DateFormatShort:
+        return lc_time.dateFormat(QLocale::ShortFormat);
+    case TimeFormatLong:
+        return lc_time.timeFormat(QLocale::LongFormat);
+    case TimeFormatShort:
+        return lc_time.timeFormat(QLocale::ShortFormat);
+    case DayNameLong:
+        return lc_time.dayName(in.toInt(), QLocale::LongFormat);
+    case DayNameShort:
+        return lc_time.dayName(in.toInt(), QLocale::ShortFormat);
+    case MonthNameLong:
+        return lc_time.monthName(in.toInt(), QLocale::LongFormat);
+    case MonthNameShort:
+        return lc_time.monthName(in.toInt(), QLocale::ShortFormat);
+    case DateToStringLong:
+        return lc_time.toString(in.toDate(), QLocale::LongFormat);
+    case DateToStringShort:
+        return lc_time.toString(in.toDate(), QLocale::ShortFormat);
+    case TimeToStringLong:
+        return lc_time.toString(in.toTime(), QLocale::LongFormat);
+    case TimeToStringShort:
+        return lc_time.toString(in.toTime(), QLocale::ShortFormat);
+    case DateTimeFormatLong:
+        return lc_time.dateTimeFormat(QLocale::LongFormat);
+    case DateTimeFormatShort:
+        return lc_time.dateTimeFormat(QLocale::ShortFormat);
+    case DateTimeToStringLong:
+        return lc_time.toString(in.toDateTime(), QLocale::LongFormat);
+    case DateTimeToStringShort:
+        return lc_time.toString(in.toDateTime(), QLocale::ShortFormat);
+    case PositiveSign:
+        return lc_numeric.positiveSign();
+    case AMText:
+        return lc_time.amText();
+    case PMText:
+        return lc_time.pmText();
+    case FirstDayOfWeek:
+        return lc_time.firstDayOfWeek();
+    case CurrencySymbol:
+        return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
+    case FormatCurrency: {
+        switch (in.type()) {
+        case QVariant::Int:
+            return lc_monetary.toCurrencyString(in.toInt());
+        case QVariant::UInt:
+            return lc_monetary.toCurrencyString(in.toUInt());
+        case QVariant::Double:
+            return lc_monetary.toCurrencyString(in.toDouble());
+        case QVariant::LongLong:
+            return lc_monetary.toCurrencyString(in.toLongLong());
+        case QVariant::ULongLong:
+            return lc_monetary.toCurrencyString(in.toULongLong());
+        default:
+            break;
+        }
+        return QString();
+    }
+    case MeasurementSystem:
         return QVariant(unixGetSystemMeasurementSystem());
-    } else if (type == UILanguages) {
+    case UILanguages: {
         QString languages = QString::fromLocal8Bit(qgetenv("LANGUAGE"));
         if (!languages.isEmpty()) {
             QStringList lst = languages.split(QLatin1Char(':'));
@@ -1580,6 +1700,12 @@ QVariant QSystemLocale::query(QueryType type, QVariant /* in */) const
         }
         return QVariant();
     }
+    case QuotationBegin:
+    case QuotationEnd:
+        break; // TODO
+    default:
+        break;
+    }
     return QVariant();
 }
 
@@ -1612,13 +1738,6 @@ QVariant QSystemLocale::query(QueryType /* type */, QVariant /* in */) const
 
 #endif
 
-#ifndef QT_NO_SYSTEMLOCALE
-static QSystemLocale *_systemLocale = 0;
-Q_GLOBAL_STATIC_WITH_ARGS(QSystemLocale, QSystemLocale_globalSystemLocale, (true))
-static QLocalePrivate *system_lp = 0;
-Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
-#endif
-
 /******************************************************************************
 ** Default system locale behavior
 */
@@ -1718,7 +1837,7 @@ static const QSystemLocale *systemLocale()
 #if defined(Q_OS_SYMBIAN)
     qt_symbianInitSystemLocale();
 #endif
-    return QSystemLocale_globalSystemLocale();
+    return &QSystemLocale_globalSystemLocale()->locale;
 }
 
 void QLocalePrivate::updateSystemPrivate()
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 18c6db3..e62e2d9 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -107,7 +107,7 @@ public:
 
 private:
     QSystemLocale(bool);
-    friend QSystemLocale *QSystemLocale_globalSystemLocale();
+    friend class QSystemLocaleData;
 };
 #endif
 
-- 
cgit v0.12


From dc01a7829255a41bda606fb59f546d599b6654ba Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Feb 2011 14:36:07 +0000
Subject: Fix ignored messages in platformsocketengine test

Reviewed-by: Markus Goetz
---
 tests/auto/platformsocketengine/tst_platformsocketengine.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
index 0ecb4ae..184371d 100644
--- a/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/platformsocketengine/tst_platformsocketengine.cpp
@@ -68,10 +68,12 @@
 #include <QNetworkSession>
 #include <QScopedPointer>
 #define PLATFORMSOCKETENGINE QSymbianSocketEngine
+#define PLATFORMSOCKETENGINESTRING "QSymbianSocketEngine"
 #include <private/qsymbiansocketengine_p.h>
 #include <private/qcore_symbian_p.h>
 #else
 #define PLATFORMSOCKETENGINE QNativeSocketEngine
+#define PLATFORMSOCKETENGINESTRING "QNativeSocketEngine"
 #include <private/qnativesocketengine_p.h>
 #endif
 
@@ -148,10 +150,10 @@ void tst_PlatformSocketEngine::construction()
     QVERIFY(socketDevice.peerPort() == 0);
     QVERIFY(socketDevice.error() == QAbstractSocket::UnknownSocketError);
 
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::bytesAvailable() was called in QAbstractSocket::UnconnectedState");
+    QTest::ignoreMessage(QtWarningMsg, PLATFORMSOCKETENGINESTRING "::bytesAvailable() was called in QAbstractSocket::UnconnectedState");
     QVERIFY(socketDevice.bytesAvailable() == 0);
 
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::hasPendingDatagrams() was called in QAbstractSocket::UnconnectedState");
+    QTest::ignoreMessage(QtWarningMsg, PLATFORMSOCKETENGINESTRING "::hasPendingDatagrams() was called in QAbstractSocket::UnconnectedState");
     QVERIFY(!socketDevice.hasPendingDatagrams());
 }
 
@@ -664,7 +666,7 @@ void tst_PlatformSocketEngine::invalidSend()
     PLATFORMSOCKETENGINE socket;
     QVERIFY(socket.initialize(QAbstractSocket::TcpSocket));
 
-    QTest::ignoreMessage(QtWarningMsg, "QNativeSocketEngine::writeDatagram() was"
+    QTest::ignoreMessage(QtWarningMsg, PLATFORMSOCKETENGINESTRING "::writeDatagram() was"
                                " called by a socket other than QAbstractSocket::UdpSocket");
     QCOMPARE(socket.writeDatagram("hei", 3, QHostAddress::LocalHost, 143),
             (qlonglong) -1);
-- 
cgit v0.12


From 9838580a408e6968256a254f6023414247877ec9 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 23 Feb 2011 16:01:35 +0100
Subject: Compile fix.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index f1b45a6..86b6d33 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1548,10 +1548,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
             result.append(lang);
         }
         return QVariant(result);
+    }
     case QuotationBegin:
-    case QuotationEnd: {
+    case QuotationEnd:
         return macQuotationSymbol(type,in);
-    }
     default:
         break;
     }
-- 
cgit v0.12


From c9071e8f9a26dee3a166579df69da11e0f6323fa Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 23 Feb 2011 17:19:58 +0100
Subject: QLocale: Compile fix on Windows

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 86b6d33..61f7b7c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -457,6 +457,10 @@ static QByteArray envVarLocale()
 ** Wrappers for Windows locale system functions
 */
 
+#ifndef MUI_LANGUAGE_NAME
+#define MUI_LANGUAGE_NAME 0x8
+#endif
+
 static const char *winLangCodeToIsoName(int code);
 static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
 static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
-- 
cgit v0.12


From 18508ec10d0e1128b85dfb3fddfa3dee6a2b1ae9 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 21 Feb 2011 17:42:48 +0100
Subject: QTranslator improvements for QLocale UI languages

To be able to make use of the new QLocale::uiLanguages property, here is a new
overload in QTranslator::load that takes QLocale object as an argument and
tries to load the translation based on educated guesses of the locale name and
file name.

Task-number: related to QTBUG-7329
Reviewed-by: Zeno Albisser
---
 src/corelib/kernel/qtranslator.cpp | 149 +++++++++++++++++++++++++++++++++++++
 src/corelib/kernel/qtranslator.h   |   6 ++
 2 files changed, 155 insertions(+)

diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index d72c1ab..bdb1d5f 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -47,6 +47,7 @@
 
 #include "qfileinfo.h"
 #include "qstring.h"
+#include "qstringlist.h"
 #include "qcoreapplication.h"
 #include "qcoreapplication_p.h"
 #include "qdatastream.h"
@@ -55,6 +56,7 @@
 #include "qalgorithms.h"
 #include "qhash.h"
 #include "qtranslator_p.h"
+#include "qlocale.h"
 
 #if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
 #define QT_USE_MMAP
@@ -236,6 +238,7 @@ public:
     uint contextLength;
     uint numerusRulesLength;
 
+    bool do_load(const QString &filename);
     bool do_load(const uchar *data, int len);
     QString do_translate(const char *context, const char *sourceText, const char *comment,
                          int n) const;
@@ -435,7 +438,12 @@ bool QTranslator::load(const QString & filename, const QString & directory,
     }
 
     // realname is now the fully qualified name of a readable file.
+    return d->do_load(realname);
+}
 
+bool QTranslatorPrivate::do_load(const QString &realname)
+{
+    QTranslatorPrivate *d = this;
     bool ok = false;
 
 #ifdef QT_USE_MMAP
@@ -497,6 +505,147 @@ bool QTranslator::load(const QString & filename, const QString & directory,
     return d->do_load(reinterpret_cast<const uchar *>(d->unmapPointer), d->unmapLength);
 }
 
+static QString find_translation(const QLocale & locale,
+                                const QString & filename,
+                                const QString & prefix,
+                                const QString & directory,
+                                const QString & suffix)
+{
+    QString path;
+    if (QFileInfo(filename).isRelative()) {
+        path = directory;
+        if (!path.isEmpty() && !path.endsWith(QLatin1Char('/')))
+            path += QLatin1Char('/');
+    }
+
+    QFileInfo fi;
+    QString realname;
+    QStringList fuzzyLocales;
+
+    // see http://www.unicode.org/reports/tr35/#LanguageMatching for inspiration
+
+    QStringList languages = locale.uiLanguages();
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+    for (int i = languages.size()-1; i >= 0; --i) {
+        QString lang = languages.at(i);
+        QString lowerLang = lang.toLower();
+        if (lang != lowerLang)
+            languages.insert(i+1, lowerLang);
+    }
+#endif
+
+    // try explicit locales names first
+    foreach (QString localeName, languages) {
+        localeName.replace(QLatin1Char('-'), QLatin1Char('_'));
+
+        realname = path + filename + prefix + localeName + (suffix.isNull() ? QLatin1String(".qm") : suffix);
+        fi.setFile(realname);
+        if (fi.isReadable() && fi.isFile())
+            return realname;
+
+        realname = path + filename + prefix + localeName;
+        fi.setFile(realname);
+        if (fi.isReadable() && fi.isFile())
+            return realname;
+
+        fuzzyLocales.append(localeName);
+    }
+
+    // start guessing
+    foreach (QString localeName, fuzzyLocales) {
+        for (;;) {
+            int rightmost = localeName.lastIndexOf(QLatin1Char('_'));
+            // no truncations? fail
+            if (rightmost <= 0)
+                break;
+            localeName.truncate(rightmost);
+
+            realname = path + filename + prefix + localeName + (suffix.isNull() ? QLatin1String(".qm") : suffix);
+            fi.setFile(realname);
+            if (fi.isReadable() && fi.isFile())
+                return realname;
+
+            realname = path + filename + prefix + localeName;
+            fi.setFile(realname);
+            if (fi.isReadable() && fi.isFile())
+                return realname;
+        }
+    }
+
+    if (!suffix.isNull()) {
+        realname = path + filename + suffix;
+        fi.setFile(realname);
+        if (fi.isReadable() && fi.isFile())
+            return realname;
+    }
+
+    realname = path + filename + prefix;
+    fi.setFile(realname);
+    if (fi.isReadable() && fi.isFile())
+        return realname;
+
+    realname = path + filename;
+    fi.setFile(realname);
+    if (fi.isReadable() && fi.isFile())
+        return realname;
+
+    return QString();
+}
+
+/*!
+    \since 4.8
+
+    Loads \a filename + \a prefix + \a locale name + \a suffix (".qm" if the \a
+    suffix is not specified), which may be an absolute file name or relative to
+    \a directory. Returns true if the translation is successfully loaded;
+    otherwise returns false.
+
+    The previous contents of this translator object are discarded.
+
+    If the file name does not exist, other file names are tried
+    in the following order:
+
+    \list 1
+    \o File name without \a suffix appended.
+    \o File name with locale part after a "_" character stripped and \a suffix.
+    \o File name with locale part stripped without \a suffix appended.
+    \o File name with locale part stripped further, etc.
+    \endlist
+
+    For example, an application running in the locale with the following
+    l{QLocale::uiLanguages()}{ui languages} - "es", "fr-CA", "de" might call
+    load(QLocale::system(), "foo", ".", "/opt/foolib", ".qm"). load() would
+    then try to open the first existing readable file from this list:
+
+    \list 1
+    \o \c /opt/foolib/foo.es.qm
+    \o \c /opt/foolib/foo.es
+    \o \c /opt/foolib/foo.fr_CA.qm
+    \o \c /opt/foolib/foo.fr_CA
+    \o \c /opt/foolib/foo.de.qm
+    \o \c /opt/foolib/foo.de
+    \o \c /opt/foolib/foo.fr.qm
+    \o \c /opt/foolib/foo.fr
+    \o \c /opt/foolib/foo.qm
+    \o \c /opt/foolib/foo.
+    \o \c /opt/foolib/foo
+    \endlist
+
+    For OSs where file system is case sensitive, QTranslator also tries to load
+    a lower-cased version of the locale name.
+*/
+bool QTranslator::load(const QLocale & locale,
+                       const QString & filename,
+                       const QString & prefix,
+                       const QString & directory,
+                       const QString & suffix)
+{
+    Q_D(QTranslator);
+    d->clear();
+    QString fname = find_translation(locale, filename, prefix, directory, suffix);
+    return !fname.isEmpty() && d->do_load(fname);
+}
+
 /*!
   \overload load()
   \fn bool QTranslator::load(const uchar *data, int len)
diff --git a/src/corelib/kernel/qtranslator.h b/src/corelib/kernel/qtranslator.h
index 33e7f03..7a4fa00 100644
--- a/src/corelib/kernel/qtranslator.h
+++ b/src/corelib/kernel/qtranslator.h
@@ -53,6 +53,7 @@ QT_MODULE(Core)
 
 #ifndef QT_NO_TRANSLATION
 
+class QLocale;
 class QTranslatorPrivate;
 
 class Q_CORE_EXPORT QTranslator : public QObject
@@ -77,6 +78,11 @@ public:
               const QString & directory = QString(),
               const QString & search_delimiters = QString(),
               const QString & suffix = QString());
+    bool load(const QLocale & locale,
+              const QString & filename,
+              const QString & prefix = QString(),
+              const QString & directory = QString(),
+              const QString & suffix = QString());
     bool load(const uchar *data, int len);
 
 #ifdef QT3_SUPPORT
-- 
cgit v0.12


From 3def7f4dd09f5d93f90d20eaedd17d8bd8c4a6fd Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Tue, 22 Feb 2011 15:41:59 +0100
Subject: Implemented QLocale::weekendStart and QLocale::weekendEnd

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17088
---
 src/corelib/tools/qlocale.cpp          | 38 ++++++++++++++++++++-
 src/corelib/tools/qlocale.h            |  4 +++
 src/corelib/tools/qlocale_p.h          |  2 ++
 tests/auto/qlocale/tst_qlocale.cpp     | 11 ++++++
 tests/manual/qlocale/calendar.cpp      | 45 ++++++++++++++++--------
 tests/manual/qlocale/calendar.h        |  2 ++
 util/local_database/cldr2qlocalexml.py | 62 ++++++++++++++++++++++++++++++++++
 util/local_database/qlocalexml2cpp.py  |  8 +++--
 8 files changed, 154 insertions(+), 18 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 61f7b7c..1f8e73c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1795,7 +1795,9 @@ QVariant QSystemLocale::query(QueryType /* type */, QVariant /* in */) const
   \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
   \value AMText a string that represents the system AM designator associated with a 12-hour clock.
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
-  \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
+  \value FirstDayOfWeek a Qt::DayOfWeek enum specifying the first day of the week
+  \value WeekendStart a Qt::DayOfWeek enum specifying the first day of the weekend
+  \value WeekendEnd a Qt::DayOfWeek enum specifying the last day of the weekend
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
   \value FormatCurrency a localized string representation of a number with a currency symbol.
   \value UILanguages a list of strings representing locale names that could be used for UI translation.
@@ -3941,6 +3943,40 @@ Qt::DayOfWeek QLocale::firstDayOfWeek() const
 }
 
 /*!
+    \since 4.8
+
+    Returns the first day of the weekend according to the current locale.
+*/
+Qt::DayOfWeek QLocale::weekendStart() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::WeekendStart, QVariant());
+        if (!res.isNull())
+            return static_cast<Qt::DayOfWeek>(res.toUInt());
+    }
+#endif
+    return static_cast<Qt::DayOfWeek>(d()->m_weekend_start);
+}
+
+/*!
+    \since 4.8
+
+    Returns the last day of the weekend according to the current locale.
+*/
+Qt::DayOfWeek QLocale::weekendEnd() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::WeekendEnd, QVariant());
+        if (!res.isNull())
+            return static_cast<Qt::DayOfWeek>(res.toUInt());
+    }
+#endif
+    return static_cast<Qt::DayOfWeek>(d()->m_weekend_end);
+}
+
+/*!
     \since 4.4
 
     Returns the measurement system for the locale.
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index e62e2d9..38f8fa0 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -96,6 +96,8 @@ public:
         AMText, // QString
         PMText, // QString
         FirstDayOfWeek, // Qt::DayOfWeek
+        WeekendStart, // Qt::DayOfWeek
+        WeekendEnd, // Qt::DayOfWeek
         CurrencySymbol, // QString in: format
         FormatCurrency, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
@@ -677,6 +679,8 @@ public:
     QString standaloneDayName(int, FormatType format = LongFormat) const;
 
     Qt::DayOfWeek firstDayOfWeek() const;
+    Qt::DayOfWeek weekendStart() const;
+    Qt::DayOfWeek weekendEnd() const;
 
     QString amText() const;
     QString pmText() const;
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 1d286ab..1218e27 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -193,6 +193,8 @@ public:
     quint16 m_currency_digits : 2;
     quint16 m_currency_rounding : 3;
     quint16 m_first_day_of_week : 3;
+    quint16 m_weekend_start : 3;
+    quint16 m_weekend_end : 3;
 };
 
 inline char QLocalePrivate::digitToCLocale(const QChar &in) const
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 878a31e..913dbba 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -143,6 +143,7 @@ private slots:
     void currency();
     void quoteString();
     void uiLanguages();
+    void weekendDays();
 
 private:
     QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
@@ -1124,6 +1125,9 @@ void tst_QLocale::macDefaultLocale()
     QCOMPARE(locale.dayName(7), QString("Sunday"));
     QCOMPARE(locale.monthName(1), QString("January"));
     QCOMPARE(locale.monthName(12), QString("December"));
+    QCOMPARE(locale.firstDayOfWeek(), Qt::Sunday);
+    QCOMPARE(locale.weekendStart(), Qt::Saturday);
+    QCOMPARE(locale.weekendEnd(), Qt::Sunday);
     QCOMPARE(locale.quoteString("string"), QString::fromUtf8("\xe2\x80\x9c" "string" "\xe2\x80\x9d"));
     QCOMPARE(locale.quoteString("string", QLocale::AlternateQuotation), QString::fromUtf8("\xe2\x80\x98" "string" "\xe2\x80\x99"));
 
@@ -2185,5 +2189,12 @@ void tst_QLocale::uiLanguages()
     QCOMPARE(ru_RU.uiLanguages().at(0), QLatin1String("ru_RU"));
 }
 
+void tst_QLocale::weekendDays()
+{
+    const QLocale c(QLocale::C);
+    QCOMPARE(c.weekendStart(), Qt::Saturday);
+    QCOMPARE(c.weekendEnd(), Qt::Sunday);
+}
+
 QTEST_APPLESS_MAIN(tst_QLocale)
 #include "tst_qlocale.moc"
diff --git a/tests/manual/qlocale/calendar.cpp b/tests/manual/qlocale/calendar.cpp
index b59fae6..615e44e 100644
--- a/tests/manual/qlocale/calendar.cpp
+++ b/tests/manual/qlocale/calendar.cpp
@@ -67,6 +67,7 @@ void CalendarWidget::localeChanged(QLocale locale)
 {
     calendar->setLocale(locale);
     firstDayCombo->setCurrentIndex(locale.firstDayOfWeek()-1);
+    updateWeekendDays();
 }
 
 void CalendarWidget::firstDayChanged(int index)
@@ -110,27 +111,41 @@ void CalendarWidget::maximumDateChanged(const QDate &date)
     minimumDateEdit->setDate(calendar->minimumDate());
 }
 
-void CalendarWidget::weekdayFormatChanged()
-{
-    QTextCharFormat format;
+bool CalendarWidget::isWeekendDay(Qt::DayOfWeek day) {
+    Qt::DayOfWeek start = calendar->locale().weekendStart();
+    Qt::DayOfWeek end = calendar->locale().weekendEnd();
 
-    format.setForeground(qvariant_cast<QColor>(
+    if (start <= day && day <= end)
+        return true;
+    if (start > end && (day >= start || day <= end))
+        return true;
+    return false;
+}
+
+void CalendarWidget::updateWeekendDays() {
+    QTextCharFormat weekFormat, weekendFormat;
+    weekFormat.setForeground(qvariant_cast<QColor>(
         weekdayColorCombo->itemData(weekdayColorCombo->currentIndex())));
-    calendar->setWeekdayTextFormat(Qt::Monday, format);
-    calendar->setWeekdayTextFormat(Qt::Tuesday, format);
-    calendar->setWeekdayTextFormat(Qt::Wednesday, format);
-    calendar->setWeekdayTextFormat(Qt::Thursday, format);
-    calendar->setWeekdayTextFormat(Qt::Friday, format);
+    weekendFormat.setForeground(qvariant_cast<QColor>(
+        weekendColorCombo->itemData(weekendColorCombo->currentIndex())));
+
+    calendar->setWeekdayTextFormat(Qt::Monday, isWeekendDay(Qt::Monday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Tuesday, isWeekendDay(Qt::Tuesday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Wednesday, isWeekendDay(Qt::Wednesday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Thursday, isWeekendDay(Qt::Thursday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Friday, isWeekendDay(Qt::Friday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Saturday, isWeekendDay(Qt::Saturday) ? weekendFormat : weekFormat);
+    calendar->setWeekdayTextFormat(Qt::Sunday, isWeekendDay(Qt::Sunday) ? weekendFormat : weekFormat);
 }
 
-void CalendarWidget::weekendFormatChanged()
+void CalendarWidget::weekdayFormatChanged()
 {
-    QTextCharFormat format;
+    updateWeekendDays();
+}
 
-    format.setForeground(qvariant_cast<QColor>(
-        weekendColorCombo->itemData(weekendColorCombo->currentIndex())));
-    calendar->setWeekdayTextFormat(Qt::Saturday, format);
-    calendar->setWeekdayTextFormat(Qt::Sunday, format);
+void CalendarWidget::weekendFormatChanged()
+{
+    updateWeekendDays();
 }
 
 void CalendarWidget::reformatHeaders()
diff --git a/tests/manual/qlocale/calendar.h b/tests/manual/qlocale/calendar.h
index 3ac39c3..b5bb3c9 100644
--- a/tests/manual/qlocale/calendar.h
+++ b/tests/manual/qlocale/calendar.h
@@ -59,12 +59,14 @@ private slots:
     void selectedDateChanged();
     void minimumDateChanged(const QDate &date);
     void maximumDateChanged(const QDate &date);
+    void updateWeekendDays();
     void weekdayFormatChanged();
     void weekendFormatChanged();
     void reformatHeaders();
     void reformatCalendarPage();
 
 private:
+    bool isWeekendDay(Qt::DayOfWeek);
     void createPreviewGroupBox();
     void createGeneralOptionsGroupBox();
     void createDatesGroupBox();
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index 0bc1664..c70cf18 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -413,6 +413,22 @@ def integrateWeekData(filePath):
     satFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=sat]", attribute="territories")[0].split(" ")
     sunFirstDayIn = findEntryInFile(filePath, "weekData/firstDay[day=sun]", attribute="territories")[0].split(" ")
 
+    monWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=mon]", attribute="territories")[0].split(" ")
+    tueWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=tue]", attribute="territories")[0].split(" ")
+    wedWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=wed]", attribute="territories")[0].split(" ")
+    thuWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=thu]", attribute="territories")[0].split(" ")
+    friWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=fri]", attribute="territories")[0].split(" ")
+    satWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=sat]", attribute="territories")[0].split(" ")
+    sunWeekendStart = findEntryInFile(filePath, "weekData/weekendStart[day=sun]", attribute="territories")[0].split(" ")
+
+    monWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=mon]", attribute="territories")[0].split(" ")
+    tueWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=tue]", attribute="territories")[0].split(" ")
+    wedWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=wed]", attribute="territories")[0].split(" ")
+    thuWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=thu]", attribute="territories")[0].split(" ")
+    friWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=fri]", attribute="territories")[0].split(" ")
+    satWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=sat]", attribute="territories")[0].split(" ")
+    sunWeekendEnd = findEntryInFile(filePath, "weekData/weekendEnd[day=sun]", attribute="territories")[0].split(" ")
+
     firstDayByCountryCode = {}
     for countryCode in monFirstDayIn:
         firstDayByCountryCode[countryCode] = "mon"
@@ -429,6 +445,38 @@ def integrateWeekData(filePath):
     for countryCode in sunFirstDayIn:
         firstDayByCountryCode[countryCode] = "sun"
 
+    weekendStartByCountryCode = {}
+    for countryCode in monWeekendStart:
+        weekendStartByCountryCode[countryCode] = "mon"
+    for countryCode in tueWeekendStart:
+        weekendStartByCountryCode[countryCode] = "tue"
+    for countryCode in wedWeekendStart:
+        weekendStartByCountryCode[countryCode] = "wed"
+    for countryCode in thuWeekendStart:
+        weekendStartByCountryCode[countryCode] = "thu"
+    for countryCode in friWeekendStart:
+        weekendStartByCountryCode[countryCode] = "fri"
+    for countryCode in satWeekendStart:
+        weekendStartByCountryCode[countryCode] = "sat"
+    for countryCode in sunWeekendStart:
+        weekendStartByCountryCode[countryCode] = "sun"
+
+    weekendEndByCountryCode = {}
+    for countryCode in monWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "mon"
+    for countryCode in tueWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "tue"
+    for countryCode in wedWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "wed"
+    for countryCode in thuWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "thu"
+    for countryCode in friWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "fri"
+    for countryCode in satWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "sat"
+    for countryCode in sunWeekendEnd:
+        weekendEndByCountryCode[countryCode] = "sun"
+
     for (key,locale) in locale_database.iteritems():
         countryCode = locale['country_code']
         if countryCode in firstDayByCountryCode:
@@ -436,6 +484,16 @@ def integrateWeekData(filePath):
         else:
             locale_database[key]['firstDayOfWeek'] = firstDayByCountryCode["001"]
 
+        if countryCode in weekendStartByCountryCode:
+            locale_database[key]['weekendStart'] = weekendStartByCountryCode[countryCode]
+        else:
+            locale_database[key]['weekendStart'] = weekendStartByCountryCode["001"]
+
+        if countryCode in weekendEndByCountryCode:
+            locale_database[key]['weekendEnd'] = weekendEndByCountryCode[countryCode]
+        else:
+            locale_database[key]['weekendEnd'] = weekendEndByCountryCode["001"]
+
 if len(sys.argv) != 2:
     usage()
 
@@ -611,6 +669,8 @@ print \
             <am>AM</am>\n\
             <pm>PM</pm>\n\
             <firstDayOfWeek>mon</firstDayOfWeek>\n\
+            <weekendStart>sat</weekendStart>\n\
+            <weekendEnd>sun</weekendEnd>\n\
             <longDateFormat>EEEE, d MMMM yyyy</longDateFormat>\n\
             <shortDateFormat>d MMM yyyy</shortDateFormat>\n\
             <longTimeFormat>HH:mm:ss z</longTimeFormat>\n\
@@ -659,6 +719,8 @@ for key in locale_keys:
     print "            <am>"       + l['am'].encode('utf-8') + "</am>"
     print "            <pm>"       + l['pm'].encode('utf-8') + "</pm>"
     print "            <firstDayOfWeek>"  + l['firstDayOfWeek'].encode('utf-8') + "</firstDayOfWeek>"
+    print "            <weekendStart>"  + l['weekendStart'].encode('utf-8') + "</weekendStart>"
+    print "            <weekendEnd>"  + l['weekendEnd'].encode('utf-8') + "</weekendEnd>"
     print "            <longDateFormat>"  + l['longDateFormat'].encode('utf-8')  + "</longDateFormat>"
     print "            <shortDateFormat>" + l['shortDateFormat'].encode('utf-8') + "</shortDateFormat>"
     print "            <longTimeFormat>"  + l['longTimeFormat'].encode('utf-8')  + "</longTimeFormat>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 6b8fdb9..86adf90 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -218,6 +218,8 @@ class Locale:
         self.am = eltText(firstChildElt(elt, "am"))
         self.pm = eltText(firstChildElt(elt, "pm"))
         self.firstDayOfWeek = convertToQtDayOfWeek(eltText(firstChildElt(elt, "firstDayOfWeek")))
+        self.weekendStart = convertToQtDayOfWeek(eltText(firstChildElt(elt, "weekendStart")))
+        self.weekendEnd = convertToQtDayOfWeek(eltText(firstChildElt(elt, "weekendEnd")))
         self.longDateFormat = convertFormat(eltText(firstChildElt(elt, "longDateFormat")))
         self.shortDateFormat = convertFormat(eltText(firstChildElt(elt, "shortDateFormat")))
         self.longTimeFormat = convertFormat(eltText(firstChildElt(elt, "longTimeFormat")))
@@ -451,7 +453,7 @@ def main():
     for key in locale_keys:
         l = locale_map[key]
 
-        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d }, // %s/%s\n" \
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s\n" \
                     % (key[0], key[1],
                         l.decimal,
                         l.group,
@@ -491,9 +493,11 @@ def main():
                         l.currencyDigits,
                         l.currencyRounding,
                         l.firstDayOfWeek,
+                        l.weekendStart,
+                        l.weekendEnd,
                         l.language,
                         l.country))
-    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
     data_temp_file.write("};\n")
 
     data_temp_file.write("\n")
-- 
cgit v0.12


From 87bffe501cf21cbdc3394435f397cbc0da9c50d6 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Tue, 22 Feb 2011 16:35:55 +0100
Subject: Updated CLDR data for QLocale.

This is a temporary commit and meant to be removed before merging the branch
into Qt as we don't want to bloat the repository size by updating CLDR every
time we make a small change to QLocale, but do that only once when we are done.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 652 ++++++++++++++++++-------------------
 1 file changed, 326 insertions(+), 326 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index 4ff6138..706dde9 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -75,7 +75,7 @@ static const int ImperialMeasurementSystemsCount =
 // GENERATED PART STARTS HERE
 
 /*
-    This part of the file was generated on 2011-02-22 from the
+    This part of the file was generated on 2011-02-23 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -306,331 +306,331 @@ static const quint16 locale_index[] = {
 
 static const QLocalePrivate locale_data[] = {
 //      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // C/AnyCountry
-    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Ethiopia
-    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afan/Kenya
-    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6 }, // Afar/Djibouti
-    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Eritrea
-    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Afar/Ethiopia
-    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1 }, // Afrikaans/SouthAfrica
-    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Afrikaans/Namibia
-    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1 }, // Albanian/Albania
-    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6 }, // Amharic/Ethiopia
-    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/SaudiArabia
-    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Algeria
-    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Bahrain
-    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Egypt
-    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6 }, // Arabic/Iraq
-    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Jordan
-    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Kuwait
-    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1 }, // Arabic/Lebanon
-    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/LibyanArabJamahiriya
-    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Morocco
-    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6 }, // Arabic/Oman
-    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6 }, // Arabic/Qatar
-    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6 }, // Arabic/Sudan
-    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7 }, // Arabic/SyrianArabRepublic
-    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6 }, // Arabic/Tunisia
-    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1 }, // Arabic/UnitedArabEmirates
-    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6 }, // Arabic/Yemen
-    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1 }, // Armenian/Armenia
-    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Assamese/India
-    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7 }, // Azerbaijani/Azerbaijan
-    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6 }, // Azerbaijani/Iran
-    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Basque/Spain
-    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1 }, // Bengali/Bangladesh
-    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7 }, // Bengali/India
-    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1 }, // Bhutani/Bhutan
-    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Breton/France
-    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1 }, // Bulgarian/Bulgaria
-    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1 }, // Burmese/Myanmar
-    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Byelorussian/Belarus
-    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1 }, // Cambodian/Cambodia
-    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Catalan/Spain
-    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/China
-    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7 }, // Chinese/HongKong
-    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Macau
-    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Singapore
-    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7 }, // Chinese/Taiwan
-    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1 }, // Croatian/Croatia
-    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Czech/CzechRepublic
-    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Danish/Denmark
-    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1 }, // Dutch/Netherlands
-    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Dutch/Belgium
-    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStates
-    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/AmericanSamoa
-    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Australia
-    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // English/Belgium
-    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Belize
-    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Botswana
-    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Canada
-    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Guam
-    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/HongKong
-    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7 }, // English/India
-    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Ireland
-    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Jamaica
-    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Malta
-    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/MarshallIslands
-    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1 }, // English/Mauritius
-    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1 }, // English/Namibia
-    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7 }, // English/NewZealand
-    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/NorthernMarianaIslands
-    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7 }, // English/Pakistan
-    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Philippines
-    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7 }, // English/Singapore
-    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1 }, // English/SouthAfrica
-    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7 }, // English/TrinidadAndTobago
-    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1 }, // English/UnitedKingdom
-    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/UnitedStatesMinorOutlyingIslands
-    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7 }, // English/USVirginIslands
-    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7 }, // English/Zimbabwe
-    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1 }, // Estonian/Estonia
-    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7 }, // Faroese/FaroeIslands
-    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Finnish/Finland
-    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/France
-    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Belgium
-    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Cameroon
-    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7 }, // French/Canada
-    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1 }, // French/CentralAfricanRepublic
-    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/IvoryCoast
-    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Guadeloupe
-    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Guinea
-    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Luxembourg
-    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Madagascar
-    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Mali
-    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Martinique
-    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Monaco
-    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Niger
-    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Reunion
-    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1 }, // French/Senegal
-    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1 }, // French/Switzerland
-    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Barthelemy
-    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1 }, // French/Saint Martin
-    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Galician/Spain
-    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Georgian/Georgia
-    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Germany
-    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1 }, // German/Austria
-    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Belgium
-    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1 }, // German/Liechtenstein
-    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1 }, // German/Luxembourg
-    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1 }, // German/Switzerland
-    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Greek/Greece
-    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1 }, // Greek/Cyprus
-    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7 }, // Greenlandic/Greenland
-    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Gujarati/India
-    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Ghana
-    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1 }, // Hausa/Niger
-    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1 }, // Hausa/Nigeria
-    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6 }, // Hausa/Sudan
-    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7 }, // Hebrew/Israel
-    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7 }, // Hindi/India
-    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1 }, // Hungarian/Hungary
-    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7 }, // Icelandic/Iceland
-    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1 }, // Indonesian/Indonesia
-    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Irish/Ireland
-    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Italian/Italy
-    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1 }, // Italian/Switzerland
-    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7 }, // Japanese/Japan
-    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kannada/India
-    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Kazakh/Kazakhstan
-    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kinyarwanda/Rwanda
-    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Kirghiz/Kyrgyzstan
-    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7 }, // Korean/RepublicOfKorea
-    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iran
-    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6 }, // Kurdish/Iraq
-    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Kurdish/SyrianArabRepublic
-    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kurdish/Turkey
-    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7 }, // Laothian/Lao
-    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Latvian/Latvia
-    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Lingala/DemocraticRepublicOfCongo
-    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Lingala/PeoplesRepublicOfCongo
-    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Lithuanian/Lithuania
-    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1 }, // Macedonian/Macedonia
-    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1 }, // Malagasy/Madagascar
-    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1 }, // Malay/Malaysia
-    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Malay/BruneiDarussalam
-    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7 }, // Malayalam/India
-    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7 }, // Maltese/Malta
-    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Maori/NewZealand
-    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Marathi/India
-    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7 }, // Mongolian/Mongolia
-    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Mongolian/China
-    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Nepali/Nepal
-    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7 }, // Nepali/India
-    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1 }, // Norwegian/Norway
-    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Occitan/France
-    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7 }, // Oriya/India
-    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Pashto/Afghanistan
-    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Iran
-    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6 }, // Persian/Afghanistan
-    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1 }, // Polish/Poland
-    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1 }, // Portuguese/Portugal
-    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Brazil
-    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1 }, // Portuguese/GuineaBissau
-    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1 }, // Portuguese/Mozambique
-    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7 }, // Punjabi/India
-    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7 }, // Punjabi/Pakistan
-    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1 }, // RhaetoRomance/Switzerland
-    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Moldova
-    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1 }, // Romanian/Romania
-    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/RussianFederation
-    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Moldova
-    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1 }, // Russian/Ukraine
-    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1 }, // Sangho/CentralAfricanRepublic
-    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7 }, // Sanskrit/India
-    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/SerbiaAndMontenegro
-    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/BosniaAndHerzegowina
-    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // Serbian/Yugoslavia
-    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1 }, // Serbian/Montenegro
-    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1 }, // Serbian/Serbia
-    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/SerbiaAndMontenegro
-    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/BosniaAndHerzegowina
-    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1 }, // SerboCroatian/Yugoslavia
-    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/Lesotho
-    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Sesotho/SouthAfrica
-    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Setswana/SouthAfrica
-    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7 }, // Shona/Zimbabwe
-    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1 }, // Singhalese/SriLanka
-    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/SouthAfrica
-    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Siswati/Swaziland
-    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovak/Slovakia
-    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1 }, // Slovenian/Slovenia
-    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Somalia
-    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6 }, // Somali/Djibouti
-    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Ethiopia
-    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Somali/Kenya
-    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Spain
-    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/Argentina
-    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Bolivia
-    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1 }, // Spanish/Chile
-    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/Colombia
-    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/CostaRica
-    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/DominicanRepublic
-    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Ecuador
-    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/ElSalvador
-    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1 }, // Spanish/EquatorialGuinea
-    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Guatemala
-    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Honduras
-    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Mexico
-    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Nicaragua
-    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Panama
-    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1 }, // Spanish/Paraguay
-    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/Peru
-    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/PuertoRico
-    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7 }, // Spanish/UnitedStates
-    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1 }, // Spanish/Uruguay
-    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1 }, // Spanish/Venezuela
-    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1 }, // Spanish/LatinAmericaAndTheCaribbean
-    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6 }, // Swahili/Kenya
-    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1 }, // Swahili/Tanzania
-    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Sweden
-    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1 }, // Swedish/Finland
-    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1 }, // Tajik/Tajikistan
-    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tamil/India
-    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tamil/SriLanka
-    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Tatar/RussianFederation
-    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Telugu/India
-    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7 }, // Thai/Thailand
-    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/China
-    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Tibetan/India
-    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Eritrea
-    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigrinya/Ethiopia
-    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Tonga/Tonga
-    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Tsonga/SouthAfrica
-    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1 }, // Turkish/Turkey
-    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Uigur/China
-    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1 }, // Ukrainian/Ukraine
-    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Urdu/India
-    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7 }, // Urdu/Pakistan
-    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7 }, // Uzbek/Uzbekistan
-    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6 }, // Uzbek/Afghanistan
-    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1 }, // Vietnamese/VietNam
-    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1 }, // Welsh/UnitedKingdom
-    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Wolof/Senegal
-    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Xhosa/SouthAfrica
-    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1 }, // Yoruba/Nigeria
-    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Zulu/SouthAfrica
-    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1 }, // Nynorsk/Norway
-    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1 }, // Bosnian/BosniaAndHerzegowina
-    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5 }, // Divehi/Maldives
-    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Manx/UnitedKingdom
-    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Cornish/UnitedKingdom
-    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Akan/Ghana
-    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Konkani/India
-    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Ga/Ghana
-    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1 }, // Igbo/Nigeria
-    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kamba/Kenya
-    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7 }, // Syriac/SyrianArabRepublic
-    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Blin/Eritrea
-    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Eritrea
-    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Geez/Ethiopia
-    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Koro/IvoryCoast
-    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Sidamo/Ethiopia
-    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Atsam/Nigeria
-    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Tigre/Eritrea
-    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1 }, // Jju/Nigeria
-    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Friulian/Italy
-    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Venda/SouthAfrica
-    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1 }, // Ewe/Ghana
-    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1 }, // Ewe/Togo
-    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6 }, // Walamo/Ethiopia
-    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7 }, // Hawaiian/UnitedStates
-    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1 }, // Tyap/Nigeria
-    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1 }, // Chewa/Malawi
-    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7 }, // Filipino/Philippines
-    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1 }, // Swiss German/Switzerland
-    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7 }, // Sichuan Yi/China
-    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1 }, // Kpelle/Guinea
-    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1 }, // Kpelle/Liberia
-    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1 }, // Low German/Germany
-    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // South Ndebele/SouthAfrica
-    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1 }, // Northern Sotho/SouthAfrica
-    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Finland
-    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1 }, // Northern Sami/Norway
-    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7 }, // Taroko/Taiwan
-    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Gusii/Kenya
-    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Taita/Kenya
-    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Fulah/Senegal
-    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6 }, // Kikuyu/Kenya
-    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Samburu/Kenya
-    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1 }, // Sena/Mozambique
-    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7 }, // North Ndebele/Zimbabwe
-    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1 }, // Rombo/Tanzania
-    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Tachelhit/Morocco
-    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6 }, // Kabyle/Algeria
-    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Nyankole/Uganda
-    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1 }, // Bena/Tanzania
-    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Vunjo/Tanzania
-    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1 }, // Bambara/Mali
-    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Embu/Kenya
-    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7 }, // Cherokee/UnitedStates
-    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1 }, // Morisyen/Mauritius
-    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1 }, // Makonde/Tanzania
-    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1 }, // Langi/Tanzania
-    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1 }, // Ganda/Uganda
-    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1 }, // Bemba/Zambia
-    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1 }, // Kabuverdianu/CapeVerde
-    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6 }, // Meru/Kenya
-    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6 }, // Kalenjin/Kenya
-    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1 }, // Nama/Namibia
-    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1 }, // Machame/Tanzania
-    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1 }, // Colognian/Germany
-    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6 }, // Masai/Kenya
-    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Masai/Tanzania
-    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1 }, // Soga/Uganda
-    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6 }, // Luyia/Kenya
-    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1 }, // Asu/Tanzania
-    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6 }, // Teso/Kenya
-    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1 }, // Teso/Uganda
-    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6 }, // Saho/Eritrea
-    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyra Chiini/Mali
-    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Rwa/Tanzania
-    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6 }, // Luo/Kenya
-    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1 }, // Chiga/Uganda
-    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6 }, // Central Morocco Tamazight/Morocco
-    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1 }, // Koyraboro Senni/Mali
-    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1 }, // Shambala/Tanzania
-    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0 }  // trailing 0s
+    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyCountry
+    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/Ethiopia
+    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/Kenya
+    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/Djibouti
+    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/Eritrea
+    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/Ethiopia
+    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/SouthAfrica
+    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/Namibia
+    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/Albania
+    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/Ethiopia
+    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/SaudiArabia
+    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/Algeria
+    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Bahrain
+    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Egypt
+    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/Iraq
+    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Jordan
+    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Kuwait
+    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/Lebanon
+    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/LibyanArabJamahiriya
+    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Morocco
+    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/Oman
+    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/Qatar
+    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Sudan
+    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/SyrianArabRepublic
+    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/Tunisia
+    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/UnitedArabEmirates
+    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/Yemen
+    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/Armenia
+    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/India
+    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Azerbaijan
+    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Iran
+    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/Spain
+    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/Bangladesh
+    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/India
+    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/Bhutan
+    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/France
+    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/Bulgaria
+    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/Myanmar
+    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/Belarus
+    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/Cambodia
+    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/Spain
+    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/China
+    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/HongKong
+    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Macau
+    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Singapore
+    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Taiwan
+    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/Croatia
+    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/CzechRepublic
+    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/Denmark
+    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/Netherlands
+    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/Belgium
+    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/UnitedStates
+    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AmericanSamoa
+    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Australia
+    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Belgium
+    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Belize
+    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Botswana
+    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Canada
+    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Guam
+    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/HongKong
+    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/India
+    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Ireland
+    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Jamaica
+    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Malta
+    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/MarshallIslands
+    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/Mauritius
+    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Namibia
+    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/NewZealand
+    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/NorthernMarianaIslands
+    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/Pakistan
+    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Philippines
+    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Singapore
+    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/SouthAfrica
+    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/TrinidadAndTobago
+    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/UnitedKingdom
+    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/UnitedStatesMinorOutlyingIslands
+    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/USVirginIslands
+    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Zimbabwe
+    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/Estonia
+    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/FaroeIslands
+    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/Finland
+    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/France
+    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Belgium
+    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Cameroon
+    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/Canada
+    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/CentralAfricanRepublic
+    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/IvoryCoast
+    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Guadeloupe
+    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Guinea
+    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Luxembourg
+    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Madagascar
+    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Mali
+    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Martinique
+    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Monaco
+    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Niger
+    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Reunion
+    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Senegal
+    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/Switzerland
+    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Saint Barthelemy
+    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Saint Martin
+    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/Spain
+    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/Georgia
+    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Germany
+    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Austria
+    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Belgium
+    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/Liechtenstein
+    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Luxembourg
+    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/Switzerland
+    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/Greece
+    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/Cyprus
+    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/Greenland
+    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/India
+    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Ghana
+    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Niger
+    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Nigeria
+    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Sudan
+    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/Israel
+    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/India
+    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/Hungary
+    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/Iceland
+    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/Indonesia
+    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/Ireland
+    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/Italy
+    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/Switzerland
+    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/Japan
+    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/India
+    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Kazakhstan
+    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/Rwanda
+    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/Kyrgyzstan
+    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/RepublicOfKorea
+    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Iran
+    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Iraq
+    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/SyrianArabRepublic
+    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Turkey
+    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/Lao
+    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/Latvia
+    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/DemocraticRepublicOfCongo
+    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/PeoplesRepublicOfCongo
+    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/Lithuania
+    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/Macedonia
+    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/Madagascar
+    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/Malaysia
+    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/BruneiDarussalam
+    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/India
+    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/Malta
+    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/NewZealand
+    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/India
+    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Mongolia
+    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/China
+    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/Nepal
+    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/India
+    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/Norway
+    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/France
+    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/India
+    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/Afghanistan
+    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/Iran
+    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/Afghanistan
+    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/Poland
+    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/Portugal
+    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/Brazil
+    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/GuineaBissau
+    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/Mozambique
+    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/India
+    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Pakistan
+    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/Switzerland
+    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/Moldova
+    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/Romania
+    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/RussianFederation
+    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/Moldova
+    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/Ukraine
+    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/CentralAfricanRepublic
+    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/India
+    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/SerbiaAndMontenegro
+    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/BosniaAndHerzegowina
+    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Yugoslavia
+    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Montenegro
+    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Serbia
+    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/SerbiaAndMontenegro
+    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/BosniaAndHerzegowina
+    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/Yugoslavia
+    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/Lesotho
+    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/SouthAfrica
+    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/SouthAfrica
+    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/Zimbabwe
+    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/SriLanka
+    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/SouthAfrica
+    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/Swaziland
+    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/Slovakia
+    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/Slovenia
+    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/Somalia
+    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/Djibouti
+    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/Ethiopia
+    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/Kenya
+    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Spain
+    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/Argentina
+    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Bolivia
+    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/Chile
+    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/Colombia
+    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/CostaRica
+    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/DominicanRepublic
+    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/Ecuador
+    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/ElSalvador
+    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/EquatorialGuinea
+    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Guatemala
+    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Honduras
+    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Mexico
+    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Nicaragua
+    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Panama
+    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/Paraguay
+    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Peru
+    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/PuertoRico
+    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/UnitedStates
+    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/Uruguay
+    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/Venezuela
+    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/LatinAmericaAndTheCaribbean
+    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/Kenya
+    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/Tanzania
+    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/Sweden
+    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/Finland
+    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Tajikistan
+    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/India
+    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/SriLanka
+    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/RussianFederation
+    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/India
+    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/Thailand
+    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/China
+    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/India
+    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/Eritrea
+    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/Ethiopia
+    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/Tonga
+    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/SouthAfrica
+    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/Turkey
+    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/China
+    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/Ukraine
+    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/India
+    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/Pakistan
+    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Uzbekistan
+    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Afghanistan
+    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/VietNam
+    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/UnitedKingdom
+    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Senegal
+    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/SouthAfrica
+    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/Nigeria
+    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/SouthAfrica
+    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/Norway
+    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/BosniaAndHerzegowina
+    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/Maldives
+    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/UnitedKingdom
+    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/UnitedKingdom
+    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/Ghana
+    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/India
+    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/Ghana
+    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/Nigeria
+    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/Kenya
+    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/SyrianArabRepublic
+    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/Eritrea
+    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/Eritrea
+    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/Ethiopia
+    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/IvoryCoast
+    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/Ethiopia
+    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/Nigeria
+    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/Eritrea
+    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/Nigeria
+    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/Italy
+    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/SouthAfrica
+    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/Ghana
+    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/Togo
+    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/Ethiopia
+    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/UnitedStates
+    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/Nigeria
+    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/Malawi
+    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/Philippines
+    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/Switzerland
+    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/China
+    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/Guinea
+    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/Liberia
+    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/Germany
+    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/SouthAfrica
+    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/SouthAfrica
+    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/Finland
+    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/Norway
+    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/Taiwan
+    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/Kenya
+    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/Kenya
+    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/Senegal
+    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/Kenya
+    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/Kenya
+    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/Mozambique
+    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/Zimbabwe
+    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/Tanzania
+    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Morocco
+    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/Algeria
+    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/Uganda
+    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/Tanzania
+    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/Tanzania
+    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/Mali
+    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/Kenya
+    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/UnitedStates
+    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/Mauritius
+    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/Tanzania
+    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/Tanzania
+    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/Uganda
+    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/Zambia
+    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/CapeVerde
+    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/Kenya
+    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/Kenya
+    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/Namibia
+    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/Tanzania
+    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/Germany
+    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/Kenya
+    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/Tanzania
+    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/Uganda
+    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/Kenya
+    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/Tanzania
+    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/Kenya
+    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/Uganda
+    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/Eritrea
+    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/Mali
+    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/Tanzania
+    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/Kenya
+    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/Uganda
+    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Morocco
+    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/Mali
+    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/Tanzania
+    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
 };
 
 static const ushort date_format_data[] = {
-- 
cgit v0.12


From 8d1ee3335f4c1bf262fb3a85fd4cc7e837129b8c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Feb 2011 15:28:54 +0000
Subject: bugfix: QDir::entryList(Files|Readable) not listing writable files

Mistake in the qfilesystemiterator_symbian implementation.
Readable without Writable was thought to mean show only read-only files,
but this isn't the expected behaviour of QDir[Iterator]

Added an autotest, as this was only covered by ssl tests in the network
layer.

Reviewed-by: joao
---
 src/corelib/io/qfilesystemiterator_symbian.cpp | 2 --
 tests/auto/qdir/tst_qdir.cpp                   | 6 ++++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/corelib/io/qfilesystemiterator_symbian.cpp b/src/corelib/io/qfilesystemiterator_symbian.cpp
index e316526..0adc26d 100644
--- a/src/corelib/io/qfilesystemiterator_symbian.cpp
+++ b/src/corelib/io/qfilesystemiterator_symbian.cpp
@@ -88,8 +88,6 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &path, QDir::Fil
     else if (symbianMask == 0) {
         if ((filters & QDir::PermissionMask) == QDir::Writable)
             symbianMask = KEntryAttMatchExclude | KEntryAttReadOnly;
-        else if ((filters & QDir::PermissionMask) == QDir::Readable)
-            symbianMask = KEntryAttMatchExclusive | KEntryAttReadOnly;
     }
 
     lastError = dirHandle.Open(fs, qt_QString2TPtrC(absPath), symbianMask);
diff --git a/tests/auto/qdir/tst_qdir.cpp b/tests/auto/qdir/tst_qdir.cpp
index 2fa0c24..21460be 100644
--- a/tests/auto/qdir/tst_qdir.cpp
+++ b/tests/auto/qdir/tst_qdir.cpp
@@ -571,6 +571,12 @@ void tst_QDir::entryList_data()
                                   << int(QDir::AllEntries | QDir::Writable) << int(QDir::Name)
                                   << filterLinks(QString(".,..,directory,linktodirectory.lnk,writable").split(','));
 #endif
+    QTest::newRow("QDir::Files | QDir::Readable") << SRCDIR "entrylist/" << QStringList("*")
+                                  << int(QDir::Files | QDir::Readable) << int(QDir::Name)
+                                  << filterLinks(QString("file,linktofile.lnk,writable").split(','));
+    QTest::newRow("QDir::Dirs | QDir::Readable") << SRCDIR "entrylist/" << QStringList("*")
+                                  << int(QDir::Dirs | QDir::Readable) << int(QDir::Name)
+                                  << filterLinks(QString(".,..,directory,linktodirectory.lnk").split(','));
     QTest::newRow("Namefilters b*") << SRCDIR "entrylist/" << QStringList("d*")
                                   << int(QDir::NoFilter) << int(QDir::Name)
                                   << filterLinks(QString("directory").split(','));
-- 
cgit v0.12


From 6a8a70b434c61bc39e4aad0036012e78fa690b1d Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Feb 2011 17:12:44 +0000
Subject: Fix qsslsocket test crashes

Convert assertions to failure, increase heap size to allow
creating 10MB buffers without std::bad_alloc exception or memory
allocation error from openssl.

Reviewed-by: Markus Goetz
---
 tests/auto/qsslsocket/qsslsocket.pro     | 2 +-
 tests/auto/qsslsocket/tst_qsslsocket.cpp | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/auto/qsslsocket/qsslsocket.pro b/tests/auto/qsslsocket/qsslsocket.pro
index aeeae8f..154f9ca 100644
--- a/tests/auto/qsslsocket/qsslsocket.pro
+++ b/tests/auto/qsslsocket/qsslsocket.pro
@@ -23,7 +23,7 @@ wince* {
     DEPLOYMENT += certFiles
 } else:symbian {
     DEFINES += QSSLSOCKET_CERTUNTRUSTED_WORKAROUND
-    TARGET.EPOCHEAPSIZE="0x100 0x1000000"
+    TARGET.EPOCHEAPSIZE="0x100 0x3000000"
     TARGET.CAPABILITY=NetworkServices
 
     certFiles.files = certs ssl.tar.gz
diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index 8177d29..9a98712 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -541,7 +541,7 @@ void tst_QSslSocket::sslErrors()
     }
 
 #ifdef QSSLSOCKET_CERTUNTRUSTED_WORKAROUND
-    if (output.last() == QSslError::CertificateUntrusted)
+    if (output.count() && output.last() == QSslError::CertificateUntrusted)
         output.takeLast();
 #endif
     QCOMPARE(output, expected);
@@ -1417,8 +1417,8 @@ protected:
         // delayed start of encryption
         QTest::qSleep(100);
         QSslSocket *socket = server.socket;
-        Q_ASSERT(socket);
-        Q_ASSERT(socket->isValid());
+        QVERIFY(socket);
+        QVERIFY(socket->isValid());
         socket->ignoreSslErrors();
         socket->startServerEncryption();
         if (!socket->waitForEncrypted(2000))
-- 
cgit v0.12


From 88e192419ed928be1239d7a928336332f1d521f4 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Feb 2011 18:20:14 +0000
Subject: Fix symbian test failures for qsslsocket

Increased timeout on some unstable test cases.
Added a Q_EXPECT_FAIL if we can't connect to a server which is inside
firewall.

Reviewed-by: Markus Goetz
---
 tests/auto/qsslsocket/tst_qsslsocket.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index 9a98712..1c34759 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -519,6 +519,7 @@ void tst_QSslSocket::sslErrors_data()
         << (SslErrorList() << QSslError::HostNameMismatch
                            << QSslError::SelfSignedCertificate);
 
+    //note this test case does not work outside Nokia network
     QTest::newRow("imap.trolltech.com")
         << "imap.trolltech.com"
         << 993
@@ -533,6 +534,8 @@ void tst_QSslSocket::sslErrors()
 
     QSslSocketPtr socket = newSocket();
     socket->connectToHostEncrypted(host, port);
+    if (!socket->waitForConnected())
+        QEXPECT_FAIL("imap.trolltech.com", "server not open to internet", Continue);
     socket->waitForEncrypted(5000);
 
     SslErrorList output;
@@ -650,7 +653,7 @@ void tst_QSslSocket::sessionCipher()
     connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
     QVERIFY(socket->sessionCipher().isNull());
     socket->connectToHost(QtNetworkSettings::serverName(), 443 /* https */);
-    QVERIFY(socket->waitForConnected(5000));
+    QVERIFY(socket->waitForConnected(10000));
     QVERIFY(socket->sessionCipher().isNull());
     socket->startClientEncryption();
     QVERIFY(socket->waitForEncrypted(5000));
@@ -684,7 +687,7 @@ void tst_QSslSocket::localCertificate()
     socket->setPrivateKey(QLatin1String(SRCDIR "certs/fluke.key"));
 
     socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
-    QVERIFY(socket->waitForEncrypted(5000));
+    QVERIFY(socket->waitForEncrypted(10000));
 }
 
 void tst_QSslSocket::mode()
@@ -1608,7 +1611,7 @@ void tst_QSslSocket::disconnectFromHostWhenConnecting()
     QCOMPARE(state, socket->state());
     QVERIFY(socket->state() == QAbstractSocket::HostLookupState ||
             socket->state() == QAbstractSocket::ConnectingState);
-    QVERIFY(socket->waitForDisconnected(5000));
+    QVERIFY(socket->waitForDisconnected(10000));
     QCOMPARE(socket->state(), QAbstractSocket::UnconnectedState);
     // we did not call close, so the socket must be still open
     QVERIFY(socket->isOpen());
-- 
cgit v0.12


From b58c6bfe14d86a2094c240c24c37a6bb3fa62726 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 23 Feb 2011 17:08:47 +0100
Subject: Split monolithic qlocale.cpp into platform-specific files

This is just a refactoring change to split huge unreadable qlocale.cpp into
multiple files.

Reviewed-by: Zeno Albisser
---
 qmake/Makefile.unix                 |   14 +-
 qmake/Makefile.win32                |    2 +
 qmake/Makefile.win32-g++            |    8 +
 qmake/Makefile.win32-g++-sh         |    8 +
 src/corelib/tools/qlocale.cpp       | 8958 ++++++++---------------------------
 src/corelib/tools/qlocale.h         |    2 +-
 src/corelib/tools/qlocale.qdoc      |  773 +++
 src/corelib/tools/qlocale_mac.mm    |  485 ++
 src/corelib/tools/qlocale_p.h       |   10 +
 src/corelib/tools/qlocale_tools.cpp | 2961 ++++++++++++
 src/corelib/tools/qlocale_tools_p.h |  122 +
 src/corelib/tools/qlocale_unix.cpp  |  256 +
 src/corelib/tools/qlocale_win.cpp   |  757 +++
 src/corelib/tools/tools.pri         |   15 +-
 src/tools/bootstrap/bootstrap.pro   |    6 +
 15 files changed, 7353 insertions(+), 7024 deletions(-)
 create mode 100644 src/corelib/tools/qlocale.qdoc
 create mode 100644 src/corelib/tools/qlocale_mac.mm
 create mode 100644 src/corelib/tools/qlocale_tools.cpp
 create mode 100644 src/corelib/tools/qlocale_tools_p.h
 create mode 100644 src/corelib/tools/qlocale_unix.cpp
 create mode 100644 src/corelib/tools/qlocale_win.cpp

diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index a24076e..5ac9c8c 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -21,7 +21,8 @@ QOBJS=qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qgl
       qfsfileengine_iterator.o qregexp.o qvector.o qbitarray.o qdir.o qdiriterator.o quuid.o qhash.o \
       qfileinfo.o qdatetime.o qstringlist.o qabstractfileengine.o qtemporaryfile.o \
       qmap.o qmetatype.o qsettings.o qsystemerror.o qlibraryinfo.o qvariant.o qvsnprintf.o \
-      qlocale.o qlinkedlist.o qurl.o qnumeric.o qcryptographichash.o qxmlstream.o qxmlutils.o \
+      qlocale.o qlocale_tools.o qlocale_unix.o qlinkedlist.o qurl.o qnumeric.o qcryptographichash.o \
+      qxmlstream.o qxmlutils.o \
       $(QTOBJS)
 
 
@@ -57,7 +58,10 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
 	   $(SOURCE_PATH)/src/corelib/io/qfileinfo.cpp $(SOURCE_PATH)/src/corelib/tools/qdatetime.cpp \
 	   $(SOURCE_PATH)/src/corelib/tools/qstringlist.cpp $(SOURCE_PATH)/src/corelib/tools/qmap.cpp \
 	   $(SOURCE_PATH)/src/corelib/global/qconfig.cpp $(SOURCE_PATH)/src/corelib/io/qurl.cpp \
-	   $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp $(SOURCE_PATH)/src/corelib/tools/qlinkedlist.cpp \
+	   $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp \
+	   $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp \
+	   $(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp \
+	   $(SOURCE_PATH)/src/corelib/tools/qlinkedlist.cpp \
 	   $(SOURCE_PATH)/src/corelib/tools/qhash.cpp $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \
 	   $(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp $(SOURCE_PATH)/src/corelib/kernel/qmetatype.cpp \
 	   $(SOURCE_PATH)/src/corelib/io/qsettings.cpp $(SOURCE_PATH)/src/corelib/kernel/qvariant.cpp \
@@ -156,6 +160,12 @@ qstring.o: $(SOURCE_PATH)/src/corelib/tools/qstring.cpp
 qlocale.o: $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 	$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 
+qlocale_tools.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+	$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+
+qlocale_unix.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp
+	$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp
+
 qdatastream.o: $(SOURCE_PATH)/src/corelib/io/qdatastream.cpp
 	$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qdatastream.cpp
 
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index 4d29537..0791eb4 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -97,6 +97,8 @@ QTOBJS= \
 	qlist.obj \
 	qlinkedlist.obj \
 	qlocale.obj \
+	qlocale_tools.obj \
+	qlocale_win.obj \
 	qmalloc.obj \
 	qmap.obj \
 	qregexp.obj \
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index 59ac8c2..ee194f6 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -75,6 +75,8 @@ QTOBJS= \
 	qlist.o \
 	qlinkedlist.o \
 	qlocale.o \
+	qlocale_tools.o \
+	qlocale_win.o \
 	qmalloc.o \
 	qmap.o \
 	qregexp.o \
@@ -176,6 +178,12 @@ qstring.o: $(SOURCE_PATH)/src/corelib/tools/qstring.cpp
 qlocale.o: $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 
+qlocale_tools.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+
+qlocale_win.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp
+	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp
+
 quuid.o: $(SOURCE_PATH)/src/corelib/plugin/quuid.cpp
 	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/plugin/quuid.cpp
 
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index a84b3f6..52ad7a2 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -75,6 +75,8 @@ QTOBJS= \
 	qlist.o \
 	qlinkedlist.o \
 	qlocale.o \
+	qlocale_tools.o \
+	qlocale_win.o \
 	qmalloc.o \
 	qmap.o \
 	qregexp.o \
@@ -175,6 +177,12 @@ qstring.o: $(SOURCE_PATH)/src/corelib/tools/qstring.cpp
 qlocale.o: $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale.cpp
 
+qlocale_tools.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_tools.cpp
+
+qlocale_win.o: $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp
+	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp
+
 quuid.o: $(SOURCE_PATH)/src/corelib/plugin/quuid.cpp
 	$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/plugin/quuid.cpp
 
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 61f7b7c..c8291d7 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -43,8 +43,8 @@
 
 #ifndef QT_NO_SYSTEMLOCALE
 QT_BEGIN_NAMESPACE
-class QSystemLocaleData;
-static QSystemLocaleData *QSystemLocale_globalSystemLocale();
+class QSystemLocale;
+static QSystemLocale *QSystemLocale_globalSystemLocale();
 QT_END_NAMESPACE
 #endif
 
@@ -54,6 +54,7 @@ QT_END_NAMESPACE
 #include "qstring.h"
 #include "qlocale.h"
 #include "qlocale_p.h"
+#include "qlocale_tools_p.h"
 #include "qdatetime_p.h"
 #include "qnamespace.h"
 #include "qdatetime.h"
@@ -71,66 +72,8 @@ QT_END_NAMESPACE
 #include "private/qnumeric_p.h"
 #include "private/qsystemlibrary_p.h"
 
-#include <ctype.h>
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-#include <stdlib.h>
-#include <qdebug.h>
-#include <time.h>
-
-#if defined(__GLIBC__) && !defined(__UCLIBC__)
-#    include <fenv.h>
-#endif
-
-#if !defined(QT_QLOCALE_NEEDS_VOLATILE)
-#  if defined(Q_CC_GNU)
-#    if  __GNUC__ == 4
-#      define QT_QLOCALE_NEEDS_VOLATILE
-#    elif defined(Q_OS_WIN)
-#      define QT_QLOCALE_NEEDS_VOLATILE
-#    endif
-#  endif
-#endif
-
-#if defined(QT_QLOCALE_NEEDS_VOLATILE)
-#   define NEEDS_VOLATILE volatile
-#else
-#   define NEEDS_VOLATILE
-#endif
-
-// Sizes as defined by the ISO C99 standard - fallback
-#ifndef LLONG_MAX
-#   define LLONG_MAX Q_INT64_C(0x7fffffffffffffff)
-#endif
-#ifndef LLONG_MIN
-#   define LLONG_MIN (-LLONG_MAX - Q_INT64_C(1))
-#endif
-#ifndef ULLONG_MAX
-#   define ULLONG_MAX Q_UINT64_C(0xffffffffffffffff)
-#endif
-
-#define CONVERSION_BUFF_SIZE 255
-
 QT_BEGIN_NAMESPACE
 
-#ifndef QT_QLOCALE_USES_FCVT
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt,
-                        int *sign, char **rve, char **digits_str);
-#endif
-Q_CORE_EXPORT char *qdtoa(double d, int mode, int ndigits, int *decpt,
-                        int *sign, char **rve, char **digits_str);
-Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
-static qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok);
-static qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok);
-
-#if defined(Q_CC_MWERKS) && defined(Q_OS_WIN32)
-inline bool isascii(int c)
-{
-        return (c >= 0 && c <=127);
-}
-#endif
-
 #if defined(Q_OS_SYMBIAN)
 void qt_symbianUpdateSystemPrivate();
 void qt_symbianInitSystemLocale();
@@ -138,47 +81,7 @@ void qt_symbianInitSystemLocale();
 
 #ifndef QT_NO_SYSTEMLOCALE
 static QSystemLocale *_systemLocale = 0;
-
-struct QSystemLocaleData
-{
-    QSystemLocaleData()
-        : locale(true)
-    #if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
-        ,lc_numeric(QLocale::C)
-        ,lc_time(QLocale::C)
-        ,lc_monetary(QLocale::C)
-        ,lc_messages(QLocale::C)
-    #endif
-    {
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
-        QByteArray all = qgetenv("LC_ALL");
-        QByteArray numeric  = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
-        QByteArray time     = all.isEmpty() ? qgetenv("LC_TIME") : all;
-        QByteArray monetary = all.isEmpty() ? qgetenv("LC_MONETARY") : all;
-        QByteArray messages = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
-        QByteArray lang = qgetenv("LANG");
-        if (numeric.isEmpty())
-            numeric = lang;
-        if (monetary.isEmpty())
-            monetary = lang;
-        if (messages.isEmpty())
-            messages = lang;
-        lc_numeric = QLocale(QString::fromAscii(numeric));
-        lc_time = QLocale(QString::fromAscii(time));
-        lc_monetary = QLocale(QString::fromAscii(monetary));
-        lc_messages = QLocale(QString::fromAscii(messages));
-#endif
-    }
-    QSystemLocale locale;
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
-    QLocale lc_numeric;
-    QLocale lc_time;
-    QLocale lc_monetary;
-    QLocale lc_messages;
-#endif
-};
-
-Q_GLOBAL_STATIC(QSystemLocaleData, QSystemLocale_globalSystemLocale)
+Q_GLOBAL_STATIC_WITH_ARGS(QSystemLocale, QSystemLocale_globalSystemLocale, (true))
 static QLocalePrivate *system_lp = 0;
 Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
 #endif
@@ -205,7 +108,7 @@ QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
 // Assumes that code is a
 // QChar code[3];
 // If the code is two-digit the third digit must be 0
-static QLocale::Language codeToLanguage(const QChar *code)
+QLocale::Language codeToLanguage(const QChar *code)
 {
     ushort uc1 = code[0].unicode();
     ushort uc2 = code[1].unicode();
@@ -225,7 +128,7 @@ static QLocale::Language codeToLanguage(const QChar *code)
 
 // Assumes that code is a
 // QChar code[3];
-static QLocale::Country codeToCountry(const QChar *code)
+QLocale::Country codeToCountry(const QChar *code)
 {
     ushort uc1 = code[0].unicode();
     ushort uc2 = code[1].unicode();
@@ -240,7 +143,7 @@ static QLocale::Country codeToCountry(const QChar *code)
     return QLocale::AnyCountry;
 }
 
-static QString languageToCode(QLocale::Language language)
+QString languageToCode(QLocale::Language language)
 {
     if (language == QLocale::C)
         return QLatin1String("C");
@@ -257,7 +160,7 @@ static QString languageToCode(QLocale::Language language)
     return code;
 }
 
-static QString countryToCode(QLocale::Country country)
+QString countryToCode(QLocale::Country country)
 {
     if (country == QLocale::AnyCountry)
         return QString();
@@ -274,7 +177,7 @@ static QString countryToCode(QLocale::Country country)
     return code;
 }
 
-static const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country country)
+const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country country)
 {
     unsigned language_id = language;
     unsigned country_id = country;
@@ -302,9 +205,9 @@ static const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Cou
     return locale_data + idx;
 }
 
-static bool splitLocaleName(const QString &name,
-                            QChar *lang_begin, QChar *cntry_begin,
-                            int *lang_len = 0, int *cntry_len = 0)
+bool splitLocaleName(const QString &name,
+                     QChar *lang_begin, QChar *cntry_begin,
+                     int *lang_len, int *cntry_len)
 {
     for (int i = 0; i < 3; ++i)
         lang_begin[i] = 0;
@@ -383,7 +286,7 @@ void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Co
         cntry = codeToCountry(cntry_code);
 }
 
-static const QLocalePrivate *findLocale(const QString &name)
+const QLocalePrivate *findLocale(const QString &name)
 {
     QLocale::Language lang;
     QLocale::Country cntry;
@@ -391,7 +294,7 @@ static const QLocalePrivate *findLocale(const QString &name)
 
     return findLocale(lang, cntry);
 }
-static QString readEscapedFormatString(const QString &format, int *idx)
+QString readEscapedFormatString(const QString &format, int *idx)
 {
     int &i = *idx;
 
@@ -425,7 +328,7 @@ static QString readEscapedFormatString(const QString &format, int *idx)
     return result;
 }
 
-static int repeatCount(const QString &s, int i)
+int repeatCount(const QString &s, int i)
 {
     QChar c = s.at(i);
     int j = i + 1;
@@ -438,7589 +341,2614 @@ static const QLocalePrivate *default_lp = 0;
 static uint default_number_options = 0;
 
 #ifndef QT_NO_SYSTEMLOCALE
-static QByteArray envVarLocale()
-{
-    static QByteArray lang = 0;
-#ifdef Q_OS_UNIX
-    lang = qgetenv("LC_ALL");
-    if (lang.isNull())
-        lang = qgetenv("LC_NUMERIC");
-    if (lang.isNull())
-#endif
-        lang = qgetenv("LANG");
-    return lang;
-}
 
 
-#if defined(Q_OS_WIN)
 /******************************************************************************
-** Wrappers for Windows locale system functions
+** Default system locale behavior
 */
 
-#ifndef MUI_LANGUAGE_NAME
-#define MUI_LANGUAGE_NAME 0x8
-#endif
-
-static const char *winLangCodeToIsoName(int code);
-static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
-
-static QString getWinLocaleInfo(LCTYPE type)
+/*!
+  Constructs a QSystemLocale object. The constructor will automatically
+  install this object as the system locale and remove any earlier installed
+  system locales.
+*/
+QSystemLocale::QSystemLocale()
 {
-    LCID id = GetUserDefaultLCID();
-    int cnt = GetLocaleInfo(id, type, 0, 0) * 2;
-
-    if (cnt == 0) {
-        qWarning("QLocale: empty windows locale info (%d)", (int)type);
-        return QString();
-    }
-
-    QByteArray buff(cnt, 0);
-
-    cnt = GetLocaleInfo(id, type, reinterpret_cast<wchar_t*>(buff.data()), buff.size() / 2);
-
-    if (cnt == 0) {
-        qWarning("QLocale: empty windows locale info (%d)", (int)type);
-        return QString();
-    }
+    delete _systemLocale;
+    _systemLocale = this;
 
-    return QString::fromWCharArray(reinterpret_cast<const wchar_t *>(buff.data()));
+    if (system_lp)
+        system_lp->m_language_id = 0;
 }
 
-QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT)
+/*! \internal */
+QSystemLocale::QSystemLocale(bool)
+{ }
+
+/*!
+  Deletes the object.
+*/
+QSystemLocale::~QSystemLocale()
 {
-    QByteArray result;
-    if (id == LOCALE_USER_DEFAULT) {
-        result = envVarLocale();
-        QChar lang[3];
-        QChar cntry[3];
-        if ( result == "C" || (!result.isEmpty()
-                && splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) ) {
-            long id = 0;
-            bool ok = false;
-            id = qstrtoll(result.data(), 0, 0, &ok);
-            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
-                return result;
-            else
-                return winLangCodeToIsoName( (int)id );
-        }
-    }
+    if (_systemLocale == this) {
+        _systemLocale = 0;
 
-#if defined(Q_OS_WINCE)
-    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
-#else
-    if (id == LOCALE_USER_DEFAULT)
-        id = GetUserDefaultLCID();
-    QString resultuage = winIso639LangName(id);
-    QString country = winIso3116CtryName(id);
-    result = resultuage.toLatin1();
-    if (!country.isEmpty()) {
-        result += '_';
-        result += country.toLatin1();
+        if (system_lp)
+            system_lp->m_language_id = 0;
     }
-#endif
-
-    return result;
 }
 
-Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
+static const QSystemLocale *systemLocale()
 {
-    return QLocale(QString::fromLatin1(getWinLocaleName(id)));
+    if (_systemLocale)
+        return _systemLocale;
+#if defined(Q_OS_SYMBIAN)
+    qt_symbianInitSystemLocale();
+#endif
+    return QSystemLocale_globalSystemLocale();
 }
 
-static QString winToQtFormat(const QString &sys_fmt)
+void QLocalePrivate::updateSystemPrivate()
 {
-    QString result;
-    int i = 0;
+    const QSystemLocale *sys_locale = systemLocale();
+    if (!system_lp)
+        system_lp = globalLocalePrivate();
+    *system_lp = *sys_locale->fallbackLocale().d();
 
-    while (i < sys_fmt.size()) {
-        if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
-            QString text = readEscapedFormatString(sys_fmt, &i);
-            if (text == QLatin1String("'"))
-                result += QLatin1String("''");
-            else
-                result += QString(QLatin1Char('\'') + text + QLatin1Char('\''));
-            continue;
-        }
+#if defined(Q_OS_SYMBIAN)
+    qt_symbianUpdateSystemPrivate();
+#endif
 
-        QChar c = sys_fmt.at(i);
-        int repeat = repeatCount(sys_fmt, i);
+    QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
+    if (!res.isNull())
+        system_lp->m_language_id = res.toInt();
+    res = sys_locale->query(QSystemLocale::CountryId, QVariant());
+    if (!res.isNull())
+        system_lp->m_country_id = res.toInt();
 
-        switch (c.unicode()) {
-            // Date
-            case 'y':
-                if (repeat > 5)
-                    repeat = 5;
-                else if (repeat == 3)
-                    repeat = 2;
-                switch (repeat) {
-                    case 1:
-                        result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
-                        break;
-                    case 5:
-                        result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
-                        break;
-                    default:
-                        result += QString(repeat, QLatin1Char('y'));
-                        break;
-                }
-                break;
-            case 'g':
-                if (repeat > 2)
-                    repeat = 2;
-                switch (repeat) {
-                    case 2:
-                        break; // no equivalent of "gg" in Qt
-                    default:
-                        result += QLatin1Char('g');
-                        break;
-                }
-                break;
-            case 't':
-                if (repeat > 2)
-                    repeat = 2;
-                result += QLatin1String("AP"); // "t" unsupported, use "AP"
-                break;
-            default:
-                result += QString(repeat, c);
-                break;
-        }
+    res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
+    if (!res.isNull())
+        system_lp->m_decimal = res.toString().at(0).unicode();
 
-        i += repeat;
-    }
+    res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
+    if (!res.isNull())
+        system_lp->m_group = res.toString().at(0).unicode();
 
-    return result;
-}
+    res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
+    if (!res.isNull())
+        system_lp->m_zero = res.toString().at(0).unicode();
 
+    res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
+    if (!res.isNull())
+        system_lp->m_minus = res.toString().at(0).unicode();
 
+    res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
+    if (!res.isNull())
+        system_lp->m_plus = res.toString().at(0).unicode();
+}
+#endif
 
-static QString winDateToString(const QDate &date, DWORD flags)
+static const QLocalePrivate *systemPrivate()
 {
-    SYSTEMTIME st;
-    memset(&st, 0, sizeof(SYSTEMTIME));
-    st.wYear = date.year();
-    st.wMonth = date.month();
-    st.wDay = date.day();
-
-    LCID id = GetUserDefaultLCID();
+#ifndef QT_NO_SYSTEMLOCALE
+    // copy over the information from the fallback locale and modify
+    if (!system_lp || system_lp->m_language_id == 0)
+        QLocalePrivate::updateSystemPrivate();
 
-    wchar_t buf[255];
-    if (GetDateFormat(id, flags, &st, 0, buf, 255))
-        return QString::fromWCharArray(buf);
+    return system_lp;
+#else
+    return locale_data;
+#endif
+}
 
-    return QString();
+static const QLocalePrivate *defaultPrivate()
+{
+    if (!default_lp)
+        default_lp = systemPrivate();
+    return default_lp;
 }
 
-static QString winTimeToString(const QTime &time)
+static QString getLocaleListData(const ushort *data, int size, int index)
 {
-    SYSTEMTIME st;
-    memset(&st, 0, sizeof(SYSTEMTIME));
-    st.wHour = time.hour();
-    st.wMinute = time.minute();
-    st.wSecond = time.second();
-    st.wMilliseconds = 0;
+    static const ushort separator = ';';
+    while (index && size > 0) {
+        while (*data != separator)
+            ++data, --size;
+        --index;
+        ++data;
+        --size;
+    }
+    const ushort *end = data;
+    while (size > 0 && *end != separator)
+        ++end, --size;
+    if (end-data == 0)
+        return QString();
+    return QString::fromRawData(reinterpret_cast<const QChar*>(data), end-data);
+}
 
-    DWORD flags = 0;
-    LCID id = GetUserDefaultLCID();
+static inline QString getLocaleData(const ushort *data, int size)
+{
+    return size ? QString::fromRawData(reinterpret_cast<const QChar*>(data), size) : QString();
+}
 
-    wchar_t buf[255];
-    if (GetTimeFormat(id, flags, &st, 0, buf, 255))
-        return QString::fromWCharArray(buf);
 
-    return QString();
+#ifndef QT_NO_DATASTREAM
+QDataStream &operator<<(QDataStream &ds, const QLocale &l)
+{
+    ds << l.name();
+    return ds;
 }
 
-static QString winDayName(int day, bool short_format)
+QDataStream &operator>>(QDataStream &ds, QLocale &l)
 {
-    static const LCTYPE short_day_map[]
-        = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
-            LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
-            LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7 };
-
-    static const LCTYPE long_day_map[]
-        = { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2,
-            LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
-            LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
+    QString s;
+    ds >> s;
+    l = QLocale(s);
+    return ds;
+}
+#endif // QT_NO_DATASTREAM
 
-    day -= 1;
 
-    LCTYPE type = short_format
-                    ? short_day_map[day] : long_day_map[day];
-    return getWinLocaleInfo(type);
-}
+static const int locale_data_size = sizeof(locale_data)/sizeof(QLocalePrivate) - 1;
 
-static QString winMonthName(int month, bool short_format)
+static const QLocalePrivate *dataPointerHelper(quint16 index)
 {
-    static const LCTYPE short_month_map[]
-        = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
-            LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
-            LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9,
-            LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
-
-    static const LCTYPE long_month_map[]
-        = { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
-            LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
-            LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
-            LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 };
-
-    month -= 1;
-    if (month < 0 || month > 11)
-    return QString();
+#ifndef QT_NO_SYSTEMLOCALE
+    Q_ASSERT(index <= locale_data_size);
+    if (index == locale_data_size)
+        return system_lp;
+#else
+    Q_ASSERT(index < locale_data_size);
+#endif
 
-    LCTYPE type = short_format ? short_month_map[month] : long_month_map[month];
-    return getWinLocaleInfo(type);
+    return &locale_data[index];
 }
 
-static QLocale::MeasurementSystem winSystemMeasurementSystem()
+static quint16 localePrivateIndex(const QLocalePrivate *p)
 {
-    LCID id = GetUserDefaultLCID();
-    wchar_t output[2];
-
-    if (GetLocaleInfo(id, LOCALE_IMEASURE, output, 2)) {
-        QString iMeasure = QString::fromWCharArray(output);
-        if (iMeasure == QLatin1String("1")) {
-            return QLocale::ImperialSystem;
-        }
-    }
+#ifndef QT_NO_SYSTEMLOCALE
+    Q_ASSERT((p >= locale_data && p - locale_data < locale_data_size)
+             || (p != 0 && p == system_lp));
+    quint16 index = p == system_lp ? locale_data_size : p - locale_data;
+#else
+    Q_ASSERT(p >= locale_data && p - locale_data < locale_data_size);
+    quint16 index = p - locale_data;
+#endif
 
-    return QLocale::MetricSystem;
+    return index;
 }
 
-static QString winSystemAMText()
-{
-    LCID id = GetUserDefaultLCID();
-    wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
+/*!
+    Constructs a QLocale object with the specified \a name,
+    which has the format
+    "language[_-country][.codeset][@modifier]" or "C", where:
 
-    if (GetLocaleInfo(id, LOCALE_S1159, output, 15)) {
-        return QString::fromWCharArray(output);
-    }
+    \list
+    \i language is a lowercase, two-letter, ISO 639 language code,
+    \i territory is an uppercase, two-letter, ISO 3166 country code,
+    \i and codeset and modifier are ignored.
+    \endlist
 
-    return QString();
-}
+    The separator can be either underscore or a minus sign.
 
-static QString winSystemPMText()
-{
-    LCID id = GetUserDefaultLCID();
-    wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
+    If the string violates the locale format, or language is not
+    a valid ISO 369 code, the "C" locale is used instead. If country
+    is not present, or is not a valid ISO 3166 code, the most
+    appropriate country is chosen for the specified language.
 
-    if (GetLocaleInfo(id, LOCALE_S2359, output, 15)) {
-        return QString::fromWCharArray(output);
-    }
+    The language and country codes are converted to their respective
+    \c Language and \c Country enums. After this conversion is
+    performed the constructor behaves exactly like QLocale(Country,
+    Language).
 
-    return QString();
-}
+    This constructor is much slower than QLocale(Country, Language).
 
-static quint8 winSystemFirstDayOfWeek()
+    \sa name()
+*/
+
+QLocale::QLocale(const QString &name)
+    : v(0)
 {
-    LCID id = GetUserDefaultLCID();
-    wchar_t output[4]; // maximum length including  terminating zero character for Win2003+
+    p.numberOptions = 0;
+    p.index = localePrivateIndex(findLocale(name));
+}
 
-    if (GetLocaleInfo(id, LOCALE_IFIRSTDAYOFWEEK, output, 4))
-        return QString::fromWCharArray(output).toUInt()+1;
+/*!
+    Constructs a QLocale object initialized with the default locale. If
+    no default locale was set using setDefaultLocale(), this locale will
+    be the same as the one returned by system().
 
-    return 1;
-}
+    \sa setDefault()
+*/
 
-QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
+QLocale::QLocale()
+    : v(0)
 {
-    LCID lcid = GetUserDefaultLCID();
-    wchar_t buf[13];
-    switch (format) {
-    case QLocale::CurrencySymbol:
-        if (GetLocaleInfo(lcid, LOCALE_SCURRENCY, buf, 13))
-            return QString::fromWCharArray(buf);
-        break;
-    case QLocale::CurrencyIsoCode:
-        if (GetLocaleInfo(lcid, LOCALE_SINTLSYMBOL, buf, 9))
-            return QString::fromWCharArray(buf);
-        break;
-    case QLocale::CurrencyDisplayName: {
-        QVarLengthArray<wchar_t, 64> buf(64);
-        if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size())) {
-            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-                break;
-            buf.resize(255); // should be large enough, right?
-            if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
-                break;
-        }
-        return QString::fromWCharArray(buf.data());
-    }
-    default:
-        break;
-    }
-    return QString();
+    p.numberOptions = default_number_options;
+    p.index = localePrivateIndex(defaultPrivate());
 }
 
-static QString winFormatCurrency(const QVariant &in)
-{
-    QString value;
-    switch (in.type()) {
-    case QVariant::Int:
-        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
-                                                 in.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
-        break;
-    case QVariant::UInt:
-        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
-                                                    in.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
-        break;
-    case QVariant::Double:
-        value = QLocalePrivate::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
-                                               QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
-                                               in.toDouble(), -1, QLocalePrivate::DFDecimal, -1, QLocale::OmitGroupSeparator);
-        break;
-    case QVariant::LongLong:
-        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
-                                                 in.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
-        break;
-    case QVariant::ULongLong:
-        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
-                                                    in.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
-        break;
-    default:
-        return QString();
-    }
+/*!
+    Constructs a QLocale object with the specified \a language and \a
+    country.
 
-    QVarLengthArray<wchar_t, 64> out(64);
-    LCID lcid = GetUserDefaultLCID();
-    int ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                                  NULL, out.data(), out.size());
-    if (ret == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
-        ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                                  NULL, out.data(), 0);
-        out.resize(ret);
-        ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                            NULL, out.data(), out.size());
-    }
+    \list
+    \i If the language/country pair is found in the database, it is used.
+    \i If the language is found but the country is not, or if the country
+       is \c AnyCountry, the language is used with the most
+       appropriate available country (for example, Germany for German),
+    \i If neither the language nor the country are found, QLocale
+       defaults to the default locale (see setDefault()).
+    \endlist
 
-    return QString::fromWCharArray(out.data());
-}
+    The language and country that are actually used can be queried
+    using language() and country().
+
+    \sa setDefault() language() country()
+*/
 
-QStringList winUILanguages()
+QLocale::QLocale(Language language, Country country)
+    : v(0)
 {
-    if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) {
-        typedef BOOL (*GetUserPreferredUILanguagesFunc) (
-                    DWORD dwFlags,
-                    PULONG pulNumLanguages,
-                    PWSTR pwszLanguagesBuffer,
-                    PULONG pcchLanguagesBuffer);
-        static GetUserPreferredUILanguagesFunc GetUserPreferredUILanguages_ptr = 0;
-        if (!GetUserPreferredUILanguages_ptr) {
-            QSystemLibrary lib(QLatin1String("kernel32"));
-            if (lib.load())
-                GetUserPreferredUILanguages_ptr = (GetUserPreferredUILanguagesFunc)lib.resolve("GetUserPreferredUILanguages");
-        }
-        if (GetUserPreferredUILanguages_ptr) {
-            unsigned long cnt = 0;
-            QVarLengthArray<wchar_t, 64> buf(64);
-            unsigned long size = buf.size();
-            if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size)) {
-                size = 0;
-                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
-                    GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
-                    buf.resize(size);
-                    if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
-                        return QStringList();
-                }
-            }
-            QStringList result;
-            result.reserve(cnt);
-            const wchar_t *str = buf.constData();
-            for (; cnt > 0; --cnt) {
-                QString s = QString::fromWCharArray(str);
-                if (s.isEmpty())
-                    break; // something is wrong
-                result.append(s);
-                str += s.size()+1;
-            }
-            return result;
-        }
-    }
+    const QLocalePrivate *d = findLocale(language, country);
 
-    // old Windows before Vista
-    return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
+    // If not found, should default to system
+    if (d->languageId() == QLocale::C && language != QLocale::C) {
+        p.numberOptions = default_number_options;
+        p.index = localePrivateIndex(defaultPrivate());
+    } else {
+        p.numberOptions = 0;
+        p.index = localePrivateIndex(d);
+    }
 }
 
 /*!
-    \since 4.6
-    Returns the fallback locale obtained from the system.
- */
-QLocale QSystemLocale::fallbackLocale() const
+    Constructs a QLocale object as a copy of \a other.
+*/
+
+QLocale::QLocale(const QLocale &other)
 {
-    return QLocale(QString::fromLatin1(getWinLocaleName()));
+    v = other.v;
 }
 
-QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+const QLocalePrivate *QLocale::d() const
 {
-    LCTYPE locale_info = 0;
-    bool format_string = false;
-
-    switch(type) {
-//     case Name:
-//         return getWinLocaleName();
-    case DecimalPoint:
-        locale_info = LOCALE_SDECIMAL;
-        break;
-    case GroupSeparator:
-        locale_info = LOCALE_STHOUSAND;
-        break;
-    case NegativeSign:
-        locale_info = LOCALE_SNEGATIVESIGN;
-        break;
-    case PositiveSign:
-        locale_info = LOCALE_SPOSITIVESIGN;
-        break;
-    case DateFormatLong:
-        locale_info = LOCALE_SLONGDATE;
-        format_string = true;
-        break;
-    case DateFormatShort:
-        locale_info = LOCALE_SSHORTDATE;
-        format_string = true;
-        break;
-    case TimeFormatLong:
-    case TimeFormatShort:
-        locale_info = LOCALE_STIMEFORMAT;
-        format_string = true;
-        break;
+    return dataPointerHelper(p.index);
+}
 
-    case DateTimeFormatLong:
-    case DateTimeFormatShort:
-        return QString(query(type == DateTimeFormatLong ? DateFormatLong : DateFormatShort).toString()
-            + QLatin1Char(' ') + query(type == DateTimeFormatLong ? TimeFormatLong : TimeFormatShort).toString());
-    case DayNameLong:
-    case DayNameShort:
-        return winDayName(in.toInt(), (type == DayNameShort));
-    case MonthNameLong:
-    case MonthNameShort:
-        return winMonthName(in.toInt(), (type == MonthNameShort));
-    case DateToStringShort:
-    case DateToStringLong:
-        return winDateToString(in.toDate(), type == DateToStringShort ? DATE_SHORTDATE : DATE_LONGDATE);
-    case TimeToStringShort:
-    case TimeToStringLong:
-        return winTimeToString(in.toTime());
-    case DateTimeToStringShort:
-    case DateTimeToStringLong: {
-        const QDateTime dt = in.toDateTime();
-        return QString(winDateToString(dt.date(), type == DateTimeToStringShort ? DATE_SHORTDATE : DATE_LONGDATE)
-            + QLatin1Char(' ') + winTimeToString(dt.time())); }
-
-    case ZeroDigit:
-        locale_info = LOCALE_SNATIVEDIGITS;
-        break;
+/*!
+    Assigns \a other to this QLocale object and returns a reference
+    to this QLocale object.
+*/
 
-    case LanguageId:
-    case CountryId: {
-        QString locale = QString::fromLatin1(getWinLocaleName());
-        QLocale::Language lang;
-        QLocale::Country cntry;
-        getLangAndCountry(locale, lang, cntry);
-        if (type == LanguageId)
-            return lang;
-        if (cntry == QLocale::AnyCountry)
-            return fallbackLocale().country();
-        return cntry;
-    }
+QLocale &QLocale::operator=(const QLocale &other)
+{
+    v = other.v;
+    return *this;
+}
 
-    case MeasurementSystem:
-        return QVariant(static_cast<int>(winSystemMeasurementSystem()));
+/*!
+    \since 4.2
 
-    case AMText:
-        return QVariant(winSystemAMText());
-    case PMText:
-        return QVariant(winSystemPMText());
-    case FirstDayOfWeek:
-        return QVariant(winSystemFirstDayOfWeek());
-    case CurrencySymbol:
-        return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
-    case FormatCurrency:
-        return QVariant(winFormatCurrency(in));
-    case UILanguages:
-        return QVariant(winUILanguages());
-    default:
-        break;
-    }
-    if (locale_info) {
-        QString result = getWinLocaleInfo(locale_info);
-        if (format_string)
-            result = winToQtFormat(result);
-        if (!result.isEmpty())
-            return result;
-    }
-    return QVariant();
+    Sets the \a options related to number conversions for this
+    QLocale instance.
+*/
+void QLocale::setNumberOptions(NumberOptions options)
+{
+    p.numberOptions = options;
 }
 
-struct WindowsToISOListElt {
-    ushort windows_code;
-    char iso_name[6];
-};
-
-/* NOTE: This array should be sorted by the first column! */
-static const WindowsToISOListElt windows_to_iso_list[] = {
-    { 0x0401, "ar_SA" },
-    { 0x0402, "bg\0  " },
-    { 0x0403, "ca\0  " },
-    { 0x0404, "zh_TW" },
-    { 0x0405, "cs\0  " },
-    { 0x0406, "da\0  " },
-    { 0x0407, "de\0  " },
-    { 0x0408, "el\0  " },
-    { 0x0409, "en_US" },
-    { 0x040a, "es\0  " },
-    { 0x040b, "fi\0  " },
-    { 0x040c, "fr\0  " },
-    { 0x040d, "he\0  " },
-    { 0x040e, "hu\0  " },
-    { 0x040f, "is\0  " },
-    { 0x0410, "it\0  " },
-    { 0x0411, "ja\0  " },
-    { 0x0412, "ko\0  " },
-    { 0x0413, "nl\0  " },
-    { 0x0414, "no\0  " },
-    { 0x0415, "pl\0  " },
-    { 0x0416, "pt_BR" },
-    { 0x0418, "ro\0  " },
-    { 0x0419, "ru\0  " },
-    { 0x041a, "hr\0  " },
-    { 0x041c, "sq\0  " },
-    { 0x041d, "sv\0  " },
-    { 0x041e, "th\0  " },
-    { 0x041f, "tr\0  " },
-    { 0x0420, "ur\0  " },
-    { 0x0421, "in\0  " },
-    { 0x0422, "uk\0  " },
-    { 0x0423, "be\0  " },
-    { 0x0425, "et\0  " },
-    { 0x0426, "lv\0  " },
-    { 0x0427, "lt\0  " },
-    { 0x0429, "fa\0  " },
-    { 0x042a, "vi\0  " },
-    { 0x042d, "eu\0  " },
-    { 0x042f, "mk\0  " },
-    { 0x0436, "af\0  " },
-    { 0x0438, "fo\0  " },
-    { 0x0439, "hi\0  " },
-    { 0x043e, "ms\0  " },
-    { 0x0458, "mt\0  " },
-    { 0x0801, "ar_IQ" },
-    { 0x0804, "zh_CN" },
-    { 0x0807, "de_CH" },
-    { 0x0809, "en_GB" },
-    { 0x080a, "es_MX" },
-    { 0x080c, "fr_BE" },
-    { 0x0810, "it_CH" },
-    { 0x0812, "ko\0  " },
-    { 0x0813, "nl_BE" },
-    { 0x0814, "no\0  " },
-    { 0x0816, "pt\0  " },
-    { 0x081a, "sr\0  " },
-    { 0x081d, "sv_FI" },
-    { 0x0c01, "ar_EG" },
-    { 0x0c04, "zh_HK" },
-    { 0x0c07, "de_AT" },
-    { 0x0c09, "en_AU" },
-    { 0x0c0a, "es\0  " },
-    { 0x0c0c, "fr_CA" },
-    { 0x0c1a, "sr\0  " },
-    { 0x1001, "ar_LY" },
-    { 0x1004, "zh_SG" },
-    { 0x1007, "de_LU" },
-    { 0x1009, "en_CA" },
-    { 0x100a, "es_GT" },
-    { 0x100c, "fr_CH" },
-    { 0x1401, "ar_DZ" },
-    { 0x1407, "de_LI" },
-    { 0x1409, "en_NZ" },
-    { 0x140a, "es_CR" },
-    { 0x140c, "fr_LU" },
-    { 0x1801, "ar_MA" },
-    { 0x1809, "en_IE" },
-    { 0x180a, "es_PA" },
-    { 0x1c01, "ar_TN" },
-    { 0x1c09, "en_ZA" },
-    { 0x1c0a, "es_DO" },
-    { 0x2001, "ar_OM" },
-    { 0x2009, "en_JM" },
-    { 0x200a, "es_VE" },
-    { 0x2401, "ar_YE" },
-    { 0x2409, "en\0  " },
-    { 0x240a, "es_CO" },
-    { 0x2801, "ar_SY" },
-    { 0x2809, "en_BZ" },
-    { 0x280a, "es_PE" },
-    { 0x2c01, "ar_JO" },
-    { 0x2c09, "en_TT" },
-    { 0x2c0a, "es_AR" },
-    { 0x3001, "ar_LB" },
-    { 0x300a, "es_EC" },
-    { 0x3401, "ar_KW" },
-    { 0x340a, "es_CL" },
-    { 0x3801, "ar_AE" },
-    { 0x380a, "es_UY" },
-    { 0x3c01, "ar_BH" },
-    { 0x3c0a, "es_PY" },
-    { 0x4001, "ar_QA" },
-    { 0x400a, "es_BO" },
-    { 0x440a, "es_SV" },
-    { 0x480a, "es_HN" },
-    { 0x4c0a, "es_NI" },
-    { 0x500a, "es_PR" }
-};
-
-static const int windows_to_iso_count
-    = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt);
-
-static const char *winLangCodeToIsoName(int code)
-{
-    int cmp = code - windows_to_iso_list[0].windows_code;
-    if (cmp < 0)
-        return 0;
+/*!
+    \since 4.2
 
-    if (cmp == 0)
-        return windows_to_iso_list[0].iso_name;
+    Returns the options related to number conversions for this
+    QLocale instance.
 
-    int begin = 0;
-    int end = windows_to_iso_count;
+    By default, no options are set for the standard locales.
+*/
+QLocale::NumberOptions QLocale::numberOptions() const
+{
+    return static_cast<NumberOption>(p.numberOptions);
+}
 
-    while (end - begin > 1) {
-        uint mid = (begin + end)/2;
+/*!
+    \since 4.8
 
-        const WindowsToISOListElt *elt = windows_to_iso_list + mid;
-        int cmp = code - elt->windows_code;
-        if (cmp < 0)
-            end = mid;
-        else if (cmp > 0)
-            begin = mid;
-        else
-            return elt->iso_name;
-    }
+    Returns \a str quoted according to the current locale.
 
-    return 0;
+    If \a AlternateQuotation is used for \a QuoatationStyle
+    but the locale does not provide an alternate quotation,
+    we will fallback to the parent locale.
+*/
+QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
+{
 
+    return quoteString(&str, qs);
 }
 
-static QString winIso639LangName(LCID id)
-{
-    QString result;
+/*!
+    \since 4.8
 
-    // Windows returns the wrong ISO639 for some languages, we need to detect them here using
-    // the language code
-    QString lang_code;
-    wchar_t out[256];
-    if (GetLocaleInfo(id, LOCALE_ILANGUAGE, out, 255))
-        lang_code = QString::fromWCharArray(out);
-
-    if (!lang_code.isEmpty()) {
-        const char *endptr;
-        bool ok;
-        QByteArray latin1_lang_code = lang_code.toLatin1();
-        int i = qstrtoull(latin1_lang_code, &endptr, 16, &ok);
-        if (ok && *endptr == '\0') {
-            switch (i) {
-                case 0x814:
-                    result = QLatin1String("nn"); // Nynorsk
-                    break;
-                default:
-                    break;
-            }
-        }
+    \overload
+*/
+QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant quotationBegin = systemLocale()->query(QSystemLocale::QuotationBegin, QVariant(qs));
+        QVariant quotationEnd = systemLocale()->query(QSystemLocale::QuotationEnd, QVariant(qs));
+        if (!quotationBegin.isNull() && !quotationEnd.isNull())
+            return quotationBegin.toString() % str % quotationEnd.toString();
     }
+#endif
 
-    if (!result.isEmpty())
-        return result;
-
-    // not one of the problematic languages - do the usual lookup
-    if (GetLocaleInfo(id, LOCALE_SISO639LANGNAME , out, 255))
-        result = QString::fromWCharArray(out);
-
-    return result;
+    if (qs == StandardQuotation)
+        return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
+    else
+        return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
 }
 
-static QString winIso3116CtryName(LCID id)
-{
-    QString result;
-
-    wchar_t out[256];
-    if (GetLocaleInfo(id, LOCALE_SISO3166CTRYNAME, out, 255))
-        result = QString::fromWCharArray(out);
+/*!
+    \nonreentrant
 
-    return result;
-}
+    Sets the global default locale to \a locale. These
+    values are used when a QLocale object is constructed with
+    no arguments. If this function is not called, the system's
+    locale is used.
 
+    \warning In a multithreaded application, the default locale
+    should be set at application startup, before any non-GUI threads
+    are created.
 
-#elif defined(Q_OS_MAC)
-/******************************************************************************
-** Wrappers for Mac locale system functions
+    \sa system() c()
 */
 
-static QByteArray getMacLocaleName()
+void QLocale::setDefault(const QLocale &locale)
 {
-    QByteArray result = envVarLocale();
-
-    QChar lang[3];
-    QChar cntry[3];
-    if (result.isEmpty() || result != "C"
-            && !splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) {
-        QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
-        CFStringRef locale = CFLocaleGetIdentifier(l);
-        result = QCFString::toQString(locale).toUtf8();
-    }
-    return result;
+    default_lp = locale.d();
+    default_number_options = locale.numberOptions();
 }
 
-static QString macMonthName(int month, bool short_format)
-{
-    month -= 1;
-    if (month < 0 || month > 11)
-        return QString();
+/*!
+    Returns the language of this locale.
 
-    QCFType<CFDateFormatterRef> formatter
-        = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
-                                kCFDateFormatterNoStyle,  kCFDateFormatterNoStyle);
-    QCFType<CFArrayRef> values
-        = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
-                                  short_format ? kCFDateFormatterShortMonthSymbols
-                                               : kCFDateFormatterMonthSymbols));
-    if (values != 0) {
-        CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, month));
-        return QCFString::toQString(cfstring);
-    }
-    return QString();
+    \sa country(), languageToString(), name()
+*/
+QLocale::Language QLocale::language() const
+{
+    return Language(d()->languageId());
 }
 
+/*!
+    Returns the country of this locale.
 
-static QString macDayName(int day, bool short_format)
+    \sa language(), countryToString(), name()
+*/
+QLocale::Country QLocale::country() const
 {
-    if (day < 1 || day > 7)
-        return QString();
-
-    QCFType<CFDateFormatterRef> formatter
-        = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
-                                kCFDateFormatterNoStyle,  kCFDateFormatterNoStyle);
-    QCFType<CFArrayRef> values = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
-                                            short_format ? kCFDateFormatterShortWeekdaySymbols
-                                                         : kCFDateFormatterWeekdaySymbols));
-    if (values != 0) {
-        CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, day % 7));
-        return QCFString::toQString(cfstring);
-    }
-    return QString();
+    return Country(d()->countryId());
 }
 
-static QString macDateToString(const QDate &date, bool short_format)
-{
-    CFGregorianDate macGDate;
-    macGDate.year = date.year();
-    macGDate.month = date.month();
-    macGDate.day = date.day();
-    macGDate.hour = 0;
-    macGDate.minute = 0;
-    macGDate.second = 0.0;
-    QCFType<CFDateRef> myDate
-        = CFDateCreate(0, CFGregorianDateGetAbsoluteTime(macGDate,
-                                                         QCFType<CFTimeZoneRef>(CFTimeZoneCopyDefault())));
-    QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
-    CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle : kCFDateFormatterLongStyle;
-    QCFType<CFDateFormatterRef> myFormatter
-        = CFDateFormatterCreate(kCFAllocatorDefault,
-                                mylocale, style,
-                                kCFDateFormatterNoStyle);
-    return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
-}
+/*!
+    Returns the language and country of this locale as a
+    string of the form "language_country", where
+    language is a lowercase, two-letter ISO 639 language code,
+    and country is an uppercase, two-letter ISO 3166 country code.
 
-static QString macTimeToString(const QTime &time, bool short_format)
-{
-    CFGregorianDate macGDate;
-    // Assume this is local time and the current date
-    QDate dt = QDate::currentDate();
-    macGDate.year = dt.year();
-    macGDate.month = dt.month();
-    macGDate.day = dt.day();
-    macGDate.hour = time.hour();
-    macGDate.minute = time.minute();
-    macGDate.second = time.second();
-    QCFType<CFDateRef> myDate
-        = CFDateCreate(0, CFGregorianDateGetAbsoluteTime(macGDate,
-                                                         QCFType<CFTimeZoneRef>(CFTimeZoneCopyDefault())));
-
-    QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
-    CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle :  kCFDateFormatterLongStyle;
-    QCFType<CFDateFormatterRef> myFormatter = CFDateFormatterCreate(kCFAllocatorDefault,
-                                                                    mylocale,
-                                                                    kCFDateFormatterNoStyle,
-                                                                    style);
-    return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
-}
+    \sa language(), country()
+*/
 
-static QString macToQtFormat(const QString &sys_fmt)
+QString QLocale::name() const
 {
-    QString result;
-    int i = 0;
+    Language l = language();
 
-    while (i < sys_fmt.size()) {
-        if (sys_fmt.at(i).unicode() == '\'') {
-            QString text = readEscapedFormatString(sys_fmt, &i);
-            if (text == QLatin1String("'"))
-                result += QLatin1String("''");
-            else
-                result += QLatin1Char('\'') + text + QLatin1Char('\'');
-            continue;
-        }
+    QString result = languageToCode(l);
 
-        QChar c = sys_fmt.at(i);
-        int repeat = repeatCount(sys_fmt, i);
-
-        switch (c.unicode()) {
-            case 'G': // Qt doesn't support these :(
-            case 'Y':
-            case 'D':
-            case 'F':
-            case 'w':
-            case 'W':
-            case 'g':
-                break;
+    if (l == C)
+        return result;
 
-            case 'u': // extended year - use 'y'
-                if (repeat < 4)
-                    result += QLatin1String("yy");
-                else
-                    result += QLatin1String("yyyy");
-                break;
-            case 'S': // fractional second
-                if (repeat < 3)
-                    result += QLatin1Char('z');
-                else
-                    result += QLatin1String("zzz");
-                break;
-            case 'E':
-                if (repeat <= 3)
-                    result += QLatin1String("ddd");
-                else
-                    result += QLatin1String("dddd");
-                break;
-            case 'e':
-                if (repeat >= 2)
-                    result += QLatin1String("dd");
-                else
-                    result += QLatin1Char('d');
-                break;
-            case 'a':
-                result += QLatin1String("AP");
-                break;
-            case 'k':
-                result += QString(repeat, QLatin1Char('H'));
-                break;
-            case 'K':
-                result += QString(repeat, QLatin1Char('h'));
-                break;
-            case 'z':
-            case 'Z':
-            case 'v':
-                result += QLatin1Char('t');
-                break;
-            default:
-                result += QString(repeat, c);
-                break;
-        }
+    Country c = country();
+    if (c == AnyCountry)
+        return result;
 
-        i += repeat;
-    }
+    result.append(QLatin1Char('_'));
+    result.append(countryToCode(c));
 
     return result;
 }
 
-QString getMacDateFormat(CFDateFormatterStyle style)
-{
-    QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
-    QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
-                                                                  l, style, kCFDateFormatterNoStyle);
-    return macToQtFormat(QCFString::toQString(CFDateFormatterGetFormat(formatter)));
-}
+/*!
+    Returns a QString containing the name of \a language.
 
-static QString getMacTimeFormat(CFDateFormatterStyle style)
-{
-    QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
-    QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
-                                                                  l, kCFDateFormatterNoStyle, style);
-    return macToQtFormat(QCFString::toQString(CFDateFormatterGetFormat(formatter)));
-}
+    \sa countryToString(), name()
+*/
 
-static QString getCFLocaleValue(CFStringRef key)
+QString QLocale::languageToString(Language language)
 {
-    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
-    CFTypeRef value = CFLocaleGetValue(locale, key);
-    return QCFString::toQString(CFStringRef(static_cast<CFTypeRef>(value)));
+    if (uint(language) > uint(QLocale::LastLanguage))
+        return QLatin1String("Unknown");
+    return QLatin1String(language_name_list + language_name_index[language]);
 }
 
-static QLocale::MeasurementSystem macMeasurementSystem()
-{
-    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
-    CFStringRef system = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleMeasurementSystem));
-    if (QCFString::toQString(system) == QLatin1String("Metric")) {
-        return QLocale::MetricSystem;
-    } else {
-        return QLocale::ImperialSystem;
-    }
-}
+/*!
+    Returns a QString containing the name of \a country.
 
-static quint8 macFirstDayOfWeek()
-{
-    QCFType<CFCalendarRef> calendar = CFCalendarCopyCurrent();
-    quint8 day = static_cast<quint8>(CFCalendarGetFirstWeekday(calendar))-1;
-    if (day == 0)
-        day = 7;
-    return day;
-}
+    \sa country(), name()
+*/
 
-static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
+QString QLocale::countryToString(Country country)
 {
-    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
-    switch (format) {
-    case QLocale::CurrencyIsoCode:
-        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode)));
-    case QLocale::CurrencySymbol:
-        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencySymbol)));
-    case QLocale::CurrencyDisplayName: {
-        CFStringRef code = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode));
-        QCFType<CFStringRef> value = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleCurrencyCode, code);
-        return QCFString::toQString(value);
-    }
-    default:
-        break;
-    }
-    return QString();
+    if (uint(country) > uint(QLocale::LastCountry))
+        return QLatin1String("Unknown");
+    return QLatin1String(country_name_list + country_name_index[country]);
 }
 
-static QString macFormatCurrency(const QVariant &in)
-{
-    QCFType<CFNumberRef> value;
-    switch (in.type()) {
-    case QVariant::Int:
-    case QVariant::UInt: {
-        int v = in.toInt();
-        value = CFNumberCreate(NULL, kCFNumberIntType, &v);
-        break;
-    }
-    case QVariant::Double: {
-        double v = in.toInt();
-        value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
-        break;
-    }
-    case QVariant::LongLong:
-    case QVariant::ULongLong: {
-        qint64 v = in.toLongLong();
-        value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
-        break;
-    }
-    default:
-        return QString();
-    }
+/*!
+    Returns the short int represented by the localized string \a s,
+    using base \a base. If \a base is 0 the base is determined
+    automatically using the following rules: If the string begins with
+    "0x", it is assumed to be hexadecimal; if it begins with "0", it
+    is assumed to be octal; otherwise it is assumed to be decimal.
 
-    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
-    QCFType<CFNumberFormatterRef> currencyFormatter =
-            CFNumberFormatterCreate(NULL, locale, kCFNumberFormatterCurrencyStyle);
-    QCFType<CFStringRef> result = CFNumberFormatterCreateStringWithNumber(NULL, currencyFormatter, value);
-    return QCFString::toQString(result);
-}
+    If the conversion fails the function returns 0.
 
-static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant &in)
-{
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
-    if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6)
-        return QVariant();
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
 
-    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
-    switch (type) {
-    case  QSystemLocale::QuotationBegin:
-        if (in.toInt() == QLocale::StandardQuotation)
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
-        else
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
-        break;
-    case QSystemLocale::QuotationEnd:
-        if (in.toInt() == QLocale::StandardQuotation)
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
-        else
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
-        break;
-     default:
-        break;
-    }
-#endif
-    return QVariant();
-}
+    This function ignores leading and trailing whitespace.
+
+    \sa toUShort(), toString()
+*/
 
-static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
+short QLocale::toShort(const QString &s, bool *ok, int base) const
 {
-    QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
-             CFSTR("AppleLanguages"),
-             kCFPreferencesAnyApplication,
-             kCFPreferencesCurrentUser,
-             kCFPreferencesAnyHost);
-    if (languages && CFArrayGetCount(languages) > 0) {
-        QCFType<CFLocaleRef> locale = CFLocaleCreate(kCFAllocatorDefault,
-                                                     CFStringRef(CFArrayGetValueAtIndex(languages, 0)));
-        if (language)
-            *language = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleLanguageCode)));
-        if (country)
-            *country = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleCountryCode)));
+    qlonglong i = toLongLong(s, ok, base);
+    if (i < SHRT_MIN || i > SHRT_MAX) {
+        if (ok != 0)
+            *ok = false;
+        return 0;
     }
+    return short(i);
 }
 
-QLocale QSystemLocale::fallbackLocale() const
-{
-    return QLocale(QString::fromUtf8(getMacLocaleName().constData()));
-}
+/*!
+    Returns the unsigned short int represented by the localized string
+    \a s, using base \a base. If \a base is 0 the base is determined
+    automatically using the following rules: If the string begins with
+    "0x", it is assumed to be hexadecimal; if it begins with "0", it
+    is assumed to be octal; otherwise it is assumed to be decimal.
 
-QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
-{
-    switch(type) {
-//     case Name:
-//         return getMacLocaleName();
-    case DecimalPoint: {
-        QString value = getCFLocaleValue(kCFLocaleDecimalSeparator);
-        return value.isEmpty() ? QVariant() : value;
-    }
-    case GroupSeparator: {
-        QString value = getCFLocaleValue(kCFLocaleGroupingSeparator);
-        return value.isEmpty() ? QVariant() : value;
-    }
-    case DateFormatLong:
-    case DateFormatShort:
-        return getMacDateFormat(type == DateFormatShort
-                                ? kCFDateFormatterShortStyle
-                                : kCFDateFormatterLongStyle);
-    case TimeFormatLong:
-    case TimeFormatShort:
-        return getMacTimeFormat(type == TimeFormatShort
-                                ? kCFDateFormatterShortStyle
-                                : kCFDateFormatterLongStyle);
-    case DayNameLong:
-    case DayNameShort:
-        return macDayName(in.toInt(), (type == DayNameShort));
-    case MonthNameLong:
-    case MonthNameShort:
-        return macMonthName(in.toInt(), (type == MonthNameShort));
-    case DateToStringShort:
-    case DateToStringLong:
-        return macDateToString(in.toDate(), (type == DateToStringShort));
-    case TimeToStringShort:
-    case TimeToStringLong:
-        return macTimeToString(in.toTime(), (type == TimeToStringShort));
-
-    case NegativeSign:
-    case PositiveSign:
-    case ZeroDigit:
-        break;
-    case LanguageId:
-    case CountryId: {
-        QString preferredLanguage;
-        QString preferredCountry(3, QChar()); // codeToCountry assumes QChar[3]
-        getMacPreferredLanguageAndCountry(&preferredLanguage, &preferredCountry);
-        QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : codeToLanguage(preferredLanguage.data()));
-        QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : codeToCountry(preferredCountry.data()));
-        const QLocalePrivate *d = findLocale(languageCode, countryCode);
-        if (type == LanguageId)
-            return (QLocale::Language)d->languageId();
-        return (QLocale::Country)d->countryId();
-    }
+    If the conversion fails the function returns 0.
 
-    case MeasurementSystem:
-        return QVariant(static_cast<int>(macMeasurementSystem()));
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
 
-    case AMText:
-    case PMText:
-        break;
-    case FirstDayOfWeek:
-        return QVariant(macFirstDayOfWeek());
-    case CurrencySymbol:
-        return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
-    case FormatCurrency:
-        return macFormatCurrency(in);
-    case UILanguages: {
-        QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
-                 CFSTR("AppleLanguages"),
-                 kCFPreferencesAnyApplication,
-                 kCFPreferencesCurrentUser,
-                 kCFPreferencesAnyHost);
-        const int cnt = CFArrayGetCount(languages);
-        QStringList result;
-        result.reserve(cnt);
-        for (int i = 0; i < cnt; ++i) {
-            const QString lang = QCFString::toQString(
-                        static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i)));
-            result.append(lang);
-        }
-        return QVariant(result);
-    }
-    case QuotationBegin:
-    case QuotationEnd:
-        return macQuotationSymbol(type,in);
-    default:
-        break;
-    }
-    return QVariant();
-}
+    This function ignores leading and trailing whitespace.
 
-#elif defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+    \sa toShort(), toString()
+*/
 
-static uint unixGetSystemMeasurementSystem()
+ushort QLocale::toUShort(const QString &s, bool *ok, int base) const
 {
-    QString meas_locale = QString::fromLocal8Bit(qgetenv("LC_ALL"));
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit(qgetenv("LC_MEASUREMENT"));
-    }
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit(qgetenv("LANG"));
-    }
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit("C");
-    }
-
-    if (meas_locale.compare(QString::fromLocal8Bit("Metric"), Qt::CaseInsensitive) == 0)
-        return 0;
-    if (meas_locale.compare(QString::fromLocal8Bit("Other"), Qt::CaseInsensitive) == 0)
+    qulonglong i = toULongLong(s, ok, base);
+    if (i > USHRT_MAX) {
+        if (ok != 0)
+            *ok = false;
         return 0;
-
-    const QLocalePrivate* locale = findLocale(meas_locale);
-    return locale->measurementSystem();
+    }
+    return ushort(i);
 }
 
 /*!
-    \internal
+    Returns the int represented by the localized string \a s, using
+    base \a base. If \a base is 0 the base is determined automatically
+    using the following rules: If the string begins with "0x", it is
+    assumed to be hexadecimal; if it begins with "0", it is assumed to
+    be octal; otherwise it is assumed to be decimal.
+
+    If the conversion fails the function returns 0.
+
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
+
+    This function ignores leading and trailing whitespace.
+
+    \sa toUInt(), toString()
 */
-QLocale QSystemLocale::fallbackLocale() const
+
+int QLocale::toInt(const QString &s, bool *ok, int base) const
 {
-    return QLocale(QLatin1String(envVarLocale()));
+    qlonglong i = toLongLong(s, ok, base);
+    if (i < INT_MIN || i > INT_MAX) {
+        if (ok != 0)
+            *ok = false;
+        return 0;
+    }
+    return int(i);
 }
 
 /*!
-    \internal
-*/
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
-{
-    QSystemLocaleData *d = QSystemLocale_globalSystemLocale();
-    const QLocale &lc_numeric = d->lc_numeric;
-    const QLocale &lc_time = d->lc_time;
-    const QLocale &lc_monetary = d->lc_monetary;
+    Returns the unsigned int represented by the localized string \a s,
+    using base \a base. If \a base is 0 the base is determined
+    automatically using the following rules: If the string begins with
+    "0x", it is assumed to be hexadecimal; if it begins with "0", it
+    is assumed to be octal; otherwise it is assumed to be decimal.
 
-    switch (type) {
-    case DecimalPoint:
-        return lc_numeric.decimalPoint();
-    case GroupSeparator:
-        return lc_numeric.groupSeparator();
-    case ZeroDigit:
-        return lc_numeric.zeroDigit();
-    case NegativeSign:
-        return lc_numeric.negativeSign();
-    case DateFormatLong:
-        return lc_time.dateFormat(QLocale::LongFormat);
-    case DateFormatShort:
-        return lc_time.dateFormat(QLocale::ShortFormat);
-    case TimeFormatLong:
-        return lc_time.timeFormat(QLocale::LongFormat);
-    case TimeFormatShort:
-        return lc_time.timeFormat(QLocale::ShortFormat);
-    case DayNameLong:
-        return lc_time.dayName(in.toInt(), QLocale::LongFormat);
-    case DayNameShort:
-        return lc_time.dayName(in.toInt(), QLocale::ShortFormat);
-    case MonthNameLong:
-        return lc_time.monthName(in.toInt(), QLocale::LongFormat);
-    case MonthNameShort:
-        return lc_time.monthName(in.toInt(), QLocale::ShortFormat);
-    case DateToStringLong:
-        return lc_time.toString(in.toDate(), QLocale::LongFormat);
-    case DateToStringShort:
-        return lc_time.toString(in.toDate(), QLocale::ShortFormat);
-    case TimeToStringLong:
-        return lc_time.toString(in.toTime(), QLocale::LongFormat);
-    case TimeToStringShort:
-        return lc_time.toString(in.toTime(), QLocale::ShortFormat);
-    case DateTimeFormatLong:
-        return lc_time.dateTimeFormat(QLocale::LongFormat);
-    case DateTimeFormatShort:
-        return lc_time.dateTimeFormat(QLocale::ShortFormat);
-    case DateTimeToStringLong:
-        return lc_time.toString(in.toDateTime(), QLocale::LongFormat);
-    case DateTimeToStringShort:
-        return lc_time.toString(in.toDateTime(), QLocale::ShortFormat);
-    case PositiveSign:
-        return lc_numeric.positiveSign();
-    case AMText:
-        return lc_time.amText();
-    case PMText:
-        return lc_time.pmText();
-    case FirstDayOfWeek:
-        return lc_time.firstDayOfWeek();
-    case CurrencySymbol:
-        return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
-    case FormatCurrency: {
-        switch (in.type()) {
-        case QVariant::Int:
-            return lc_monetary.toCurrencyString(in.toInt());
-        case QVariant::UInt:
-            return lc_monetary.toCurrencyString(in.toUInt());
-        case QVariant::Double:
-            return lc_monetary.toCurrencyString(in.toDouble());
-        case QVariant::LongLong:
-            return lc_monetary.toCurrencyString(in.toLongLong());
-        case QVariant::ULongLong:
-            return lc_monetary.toCurrencyString(in.toULongLong());
-        default:
-            break;
-        }
-        return QString();
-    }
-    case MeasurementSystem:
-        return QVariant(unixGetSystemMeasurementSystem());
-    case UILanguages: {
-        QString languages = QString::fromLocal8Bit(qgetenv("LANGUAGE"));
-        if (!languages.isEmpty()) {
-            QStringList lst = languages.split(QLatin1Char(':'));
-            for (int i = 0; i < lst.size();) {
-                const QString &name = lst.at(i);
-                QChar lang[3];
-                QChar cntry[3];
-                if (name.isEmpty() || !splitLocaleName(name, lang, cntry))
-                    lst.removeAt(i);
-                else
-                    ++i;
-            }
-            return lst;
-        }
-        QString name = QString::fromLocal8Bit(qgetenv("LC_ALL"));
-        if (name.isEmpty()) {
-            name = QString::fromLocal8Bit(qgetenv("LC_MESSAGES"));
-            if (name.isEmpty())
-                name = QString::fromLocal8Bit(qgetenv("LANG"));
-        }
-        if (!name.isEmpty()) {
-            QChar lang[3];
-            QChar cntry[3];
-            int lang_len, cntry_len;
-            if (splitLocaleName(name, lang, cntry, &lang_len, &cntry_len))
-                return QStringList(QString::fromRawData(lang, lang_len) % QLatin1Char('-') % QString::fromRawData(cntry, cntry_len));
-        }
-        return QVariant();
-    }
-    case QuotationBegin:
-    case QuotationEnd:
-        break; // TODO
-    default:
-        break;
-    }
-    return QVariant();
-}
+    If the conversion fails the function returns 0.
 
-#elif !defined(Q_OS_SYMBIAN)
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
 
-/*!
-    \since 4.6
+    This function ignores leading and trailing whitespace.
 
-    Returns a fallback locale, that will get used for everything that
-    is not explicitly overridden by the system locale.
+    \sa toInt(), toString()
 */
-QLocale QSystemLocale::fallbackLocale() const
+
+uint QLocale::toUInt(const QString &s, bool *ok, int base) const
 {
-    return QLocale(QLatin1String(envVarLocale()));
+    qulonglong i = toULongLong(s, ok, base);
+    if (i > UINT_MAX) {
+        if (ok != 0)
+            *ok = false;
+        return 0;
+    }
+    return uint(i);
 }
 
 /*!
-    Performs a query of the given \a type in the system locale for
-    customized values or conversion. If the method returns a null
-    QVariant, the conversion of the fallbackLocale() will be used.
+    Returns the long long int represented by the localized string \a
+    s, using base \a base. If \a base is 0 the base is determined
+    automatically using the following rules: If the string begins with
+    "0x", it is assumed to be hexadecimal; if it begins with "0", it
+    is assumed to be octal; otherwise it is assumed to be decimal.
+
+    If the conversion fails the function returns 0.
 
-    \a in is unused for some of the query types.
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
+
+    This function ignores leading and trailing whitespace.
 
-    \sa QSystemLocale::QueryType
+    \sa toInt(), toULongLong(), toDouble(), toString()
 */
-QVariant QSystemLocale::query(QueryType /* type */, QVariant /* in */) const
+
+
+qlonglong QLocale::toLongLong(const QString &s, bool *ok, int base) const
 {
-    return QVariant();
-}
+    QLocalePrivate::GroupSeparatorMode mode
+        = p.numberOptions & RejectGroupSeparator
+            ? QLocalePrivate::FailOnGroupSeparators
+            : QLocalePrivate::ParseGroupSeparators;
 
-#endif
+    return d()->stringToLongLong(s, base, ok, mode);
+}
 
-/******************************************************************************
-** Default system locale behavior
-*/
+// ### Qt5: make the return type for toULongLong() qulonglong.
 
 /*!
-    \class QSystemLocale
-    \brief The QSystemLocale class can be used to finetune the system locale
-    of the user.
-    \since 4.2
-
-    \ingroup i18n
+    Returns the unsigned long long int represented by the localized
+    string \a s, using base \a base. If \a base is 0 the base is
+    determined automatically using the following rules: If the string
+    begins with "0x", it is assumed to be hexadecimal; if it begins
+    with "0", it is assumed to be octal; otherwise it is assumed to be
+    decimal.
 
-    \warning This class is only useful in very rare cases. Usually QLocale offers
-    all the functionality required for application development.
+    If the conversion fails the function returns 0.
 
-    QSystemLocale allows to override the values provided by the system
-    locale (QLocale::system()).
+    If \a ok is not 0, failure is reported by setting *ok to false, and
+    success by setting *ok to true.
 
-    \sa QLocale
-*/
+    This function ignores leading and trailing whitespace.
 
-/*!
-  \enum QSystemLocale::QueryType
-
-  Specifies the type of information queried by query(). For each value
-  the type of information to return from the query() method is listed.
-
-  \value LanguageId a uint specifying the language.
-  \value CountryId a uint specifying the country.
-  \value DecimalPoint a QString specifying the decimal point.
-  \value GroupSeparator a QString specifying the group separator.
-  \value ZeroDigit a QString specifying the zero digit.
-  \value NegativeSign a QString specifying the minus sign.
-  \value PositiveSign a QString specifying the plus sign.
-  \value DateFormatLong a QString specifying the long date format
-  \value DateFormatShort a QString specifying the short date format
-  \value TimeFormatLong a QString specifying the long time format
-  \value TimeFormatShort a QString specifying the short time format
-  \value DayNameLong a QString specifying the name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
-  \value DayNameShort a QString specifying the short name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
-  \value MonthNameLong a QString specifying the name of a month. the in variant contains an integer between 1 and 12
-  \value MonthNameShort a QString specifying the short name of a month. the in variant contains an integer between 1 and 12
-  \value DateToStringLong converts the QDate stored in the in variant to a QString using the long date format
-  \value DateToStringShort converts the QDate stored in the in variant to a QString using the short date format
-  \value TimeToStringLong converts the QTime stored in the in variant to a QString using the long time format
-  \value TimeToStringShort converts the QTime stored in the in variant to a QString using the short time format
-  \value DateTimeFormatLong a QString specifying the long date time format
-  \value DateTimeFormatShort a QString specifying the short date time format
-  \value DateTimeToStringLong converts the QDateTime in the in variant to a QString using the long datetime format
-  \value DateTimeToStringShort converts the QDateTime in the in variant to a QString using the short datetime format
-  \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
-  \value AMText a string that represents the system AM designator associated with a 12-hour clock.
-  \value PMText a string that represents the system PM designator associated with a 12-hour clock.
-  \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
-  \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
-  \value FormatCurrency a localized string representation of a number with a currency symbol.
-  \value UILanguages a list of strings representing locale names that could be used for UI translation.
-  \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
-  \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
+    \sa toLongLong(), toInt(), toDouble(), toString()
 */
 
-/*!
-  Constructs a QSystemLocale object. The constructor will automatically
-  install this object as the system locale and remove any earlier installed
-  system locales.
-*/
-QSystemLocale::QSystemLocale()
+qlonglong QLocale::toULongLong(const QString &s, bool *ok, int base) const
 {
-    delete _systemLocale;
-    _systemLocale = this;
+    QLocalePrivate::GroupSeparatorMode mode
+        = p.numberOptions & RejectGroupSeparator
+            ? QLocalePrivate::FailOnGroupSeparators
+            : QLocalePrivate::ParseGroupSeparators;
 
-    if (system_lp)
-        system_lp->m_language_id = 0;
+    return d()->stringToUnsLongLong(s, base, ok, mode);
 }
 
-/*! \internal */
-QSystemLocale::QSystemLocale(bool)
-{ }
-
 /*!
-  Deletes the object.
+    Returns the float represented by the localized string \a s, or 0.0
+    if the conversion failed.
+
+    If \a ok is not 0, reports failure by setting
+    *ok to false and success by setting *ok to true.
+
+    This function ignores leading and trailing whitespace.
+
+    \sa toDouble(), toInt(), toString()
 */
-QSystemLocale::~QSystemLocale()
-{
-    if (_systemLocale == this) {
-        _systemLocale = 0;
 
-        if (system_lp)
-            system_lp->m_language_id = 0;
-    }
-}
+#define QT_MAX_FLOAT 3.4028234663852886e+38
 
-static const QSystemLocale *systemLocale()
+float QLocale::toFloat(const QString &s, bool *ok) const
 {
-    if (_systemLocale)
-        return _systemLocale;
-#if defined(Q_OS_SYMBIAN)
-    qt_symbianInitSystemLocale();
-#endif
-    return &QSystemLocale_globalSystemLocale()->locale;
+    bool myOk;
+    double d = toDouble(s, &myOk);
+    if (!myOk || d > QT_MAX_FLOAT || d < -QT_MAX_FLOAT) {
+        if (ok != 0)
+            *ok = false;
+        return 0.0;
+    }
+    if (ok != 0)
+        *ok = true;
+    return float(d);
 }
 
-void QLocalePrivate::updateSystemPrivate()
-{
-    const QSystemLocale *sys_locale = systemLocale();
-    if (!system_lp)
-        system_lp = globalLocalePrivate();
-    *system_lp = *sys_locale->fallbackLocale().d();
-
-#if defined(Q_OS_SYMBIAN)
-    qt_symbianUpdateSystemPrivate();
-#endif
-
-    QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
-    if (!res.isNull())
-        system_lp->m_language_id = res.toInt();
-    res = sys_locale->query(QSystemLocale::CountryId, QVariant());
-    if (!res.isNull())
-        system_lp->m_country_id = res.toInt();
-
-    res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
-    if (!res.isNull())
-        system_lp->m_decimal = res.toString().at(0).unicode();
+/*!
+    Returns the double represented by the localized string \a s, or
+    0.0 if the conversion failed.
 
-    res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
-    if (!res.isNull())
-        system_lp->m_group = res.toString().at(0).unicode();
+    If \a ok is not 0, reports failure by setting
+    *ok to false and success by setting *ok to true.
 
-    res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
-    if (!res.isNull())
-        system_lp->m_zero = res.toString().at(0).unicode();
+    Unlike QString::toDouble(), this function does not fall back to
+    the "C" locale if the string cannot be interpreted in this
+    locale.
 
-    res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
-    if (!res.isNull())
-        system_lp->m_minus = res.toString().at(0).unicode();
+    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 3
 
-    res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
-    if (!res.isNull())
-        system_lp->m_plus = res.toString().at(0).unicode();
-}
-#endif
+    Notice that the last conversion returns 1234.0, because '.' is the
+    thousands group separator in the German locale.
 
-static const QLocalePrivate *systemPrivate()
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    // copy over the information from the fallback locale and modify
-    if (!system_lp || system_lp->m_language_id == 0)
-        QLocalePrivate::updateSystemPrivate();
+    This function ignores leading and trailing whitespace.
 
-    return system_lp;
-#else
-    return locale_data;
-#endif
-}
+    \sa toFloat(), toInt(), toString()
+*/
 
-static const QLocalePrivate *defaultPrivate()
+double QLocale::toDouble(const QString &s, bool *ok) const
 {
-    if (!default_lp)
-        default_lp = systemPrivate();
-    return default_lp;
-}
+    QLocalePrivate::GroupSeparatorMode mode
+        = p.numberOptions & RejectGroupSeparator
+            ? QLocalePrivate::FailOnGroupSeparators
+            : QLocalePrivate::ParseGroupSeparators;
 
-static QString getLocaleListData(const ushort *data, int size, int index)
-{
-    static const ushort separator = ';';
-    while (index && size > 0) {
-        while (*data != separator)
-            ++data, --size;
-        --index;
-        ++data;
-        --size;
-    }
-    const ushort *end = data;
-    while (size > 0 && *end != separator)
-        ++end, --size;
-    if (end-data == 0)
-        return QString();
-    return QString::fromRawData(reinterpret_cast<const QChar*>(data), end-data);
+    return d()->stringToDouble(s, ok, mode);
 }
 
-static inline QString getLocaleData(const ushort *data, int size)
-{
-    return size ? QString::fromRawData(reinterpret_cast<const QChar*>(data), size) : QString();
-}
+/*!
+    Returns a localized string representation of \a i.
 
+    \sa toLongLong()
+*/
 
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator<<(QDataStream &ds, const QLocale &l)
+QString QLocale::toString(qlonglong i) const
 {
-    ds << l.name();
-    return ds;
-}
+    int flags = p.numberOptions & OmitGroupSeparator
+                    ? 0
+                    : QLocalePrivate::ThousandsGroup;
 
-QDataStream &operator>>(QDataStream &ds, QLocale &l)
-{
-    QString s;
-    ds >> s;
-    l = QLocale(s);
-    return ds;
+    return d()->longLongToString(i, -1, 10, -1, flags);
 }
-#endif // QT_NO_DATASTREAM
-
 
 /*!
-    \class QLocale
-    \brief The QLocale class converts between numbers and their
-    string representations in various languages.
-
-    \reentrant
-    \ingroup i18n
-    \ingroup string-processing
-    \ingroup shared
-
-
-    QLocale is initialized with a language/country pair in its
-    constructor and offers number-to-string and string-to-number
-    conversion functions similar to those in QString.
-
-    Example:
-
-    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 0
-
-    QLocale supports the concept of a default locale, which is
-    determined from the system's locale settings at application
-    startup. The default locale can be changed by calling the
-    static member setDefault(). Setting the default locale has the
-    following effects:
-
-    \list
-    \i If a QLocale object is constructed with the default constructor,
-       it will use the default locale's settings.
-    \i QString::toInt(), QString::toDouble(), etc., interpret the
-       string according to the default locale. If this fails, it
-       falls back on the "C" locale.
-    \i QString::arg() uses the default locale to format a number when
-       its position specifier in the format string contains an 'L',
-       e.g. "%L1".
-    \endlist
-
-    The following example illustrates how to use QLocale directly:
-
-    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 1
-
-    When a language/country pair is specified in the constructor, one
-    of three things can happen:
-
-    \list
-    \i If the language/country pair is found in the database, it is used.
-    \i If the language is found but the country is not, or if the country
-       is \c AnyCountry, the language is used with the most
-       appropriate available country (for example, Germany for German),
-    \i If neither the language nor the country are found, QLocale
-       defaults to the default locale (see setDefault()).
-    \endlist
-
-    Use language() and country() to determine the actual language and
-    country values used.
-
-    An alternative method for constructing a QLocale object is by
-    specifying the locale name.
-
-    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 2
-
-    This constructor converts the locale name to a language/country
-    pair; it does not use the system locale database.
-
-    QLocale's data is based on Common Locale Data Repository v1.8.1.
-
-    The double-to-string and string-to-double conversion functions are
-    covered by the following licenses:
-
-    \legalese
-    Copyright (c) 1991 by AT&T.
-
-    Permission to use, copy, modify, and distribute this software for any
-    purpose without fee is hereby granted, provided that this entire notice
-    is included in all copies of any software which is or includes a copy
-    or modification of this software and in all copies of the supporting
-    documentation for such software.
+    \overload
 
-    THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
-    WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
-    REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
-    OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+    \sa toULongLong()
+*/
 
-    This product includes software developed by the University of
-    California, Berkeley and its contributors.
+QString QLocale::toString(qulonglong i) const
+{
+    int flags = p.numberOptions & OmitGroupSeparator
+                    ? 0
+                    : QLocalePrivate::ThousandsGroup;
 
-    \sa QString::arg(), QString::toInt(), QString::toDouble()
-*/
+    return d()->unsLongLongToString(i, -1, 10, -1, flags);
+}
 
 /*!
-    \enum QLocale::Language
-
-    This enumerated type is used to specify a language.
-
-    \value C The "C" locale is identical in behavior to English/UnitedStates.
-    \value Abkhazian
-    \value Afan
-    \value Afar
-    \value Afrikaans
-    \value Albanian
-    \value Amharic
-    \value Arabic
-    \value Armenian
-    \value Assamese
-    \value Aymara
-    \value Azerbaijani
-    \value Bashkir
-    \value Basque
-    \value Bengali
-    \value Bhutani
-    \value Bihari
-    \value Bislama
-    \value Bosnian
-    \value Breton
-    \value Bulgarian
-    \value Burmese
-    \value Byelorussian
-    \value Cambodian
-    \value Catalan
-    \value Chinese
-    \value Cornish
-    \value Corsican
-    \value Croatian
-    \value Czech
-    \value Danish
-    \value Divehi
-    \value Dutch
-    \value English
-    \value Esperanto
-    \value Estonian
-    \value Faroese
-    \value FijiLanguage
-    \value Finnish
-    \value French
-    \value Frisian
-    \value Gaelic
-    \value Galician
-    \value Georgian
-    \value German
-    \value Greek
-    \value Greenlandic
-    \value Guarani
-    \value Gujarati
-    \value Hausa
-    \value Hebrew
-    \value Hindi
-    \value Hungarian
-    \value Icelandic
-    \value Indonesian
-    \value Interlingua
-    \value Interlingue
-    \value Inuktitut
-    \value Inupiak
-    \value Irish
-    \value Italian
-    \value Japanese
-    \value Javanese
-    \value Kannada
-    \value Kashmiri
-    \value Kazakh
-    \value Kinyarwanda
-    \value Kirghiz
-    \value Korean
-    \value Kurdish
-    \value Kurundi
-    \value Laothian
-    \value Latin
-    \value Latvian
-    \value Lingala
-    \value Lithuanian
-    \value Macedonian
-    \value Malagasy
-    \value Malay
-    \value Malayalam
-    \value Maltese
-    \value Manx
-    \value Maori
-    \value Marathi
-    \value Moldavian
-    \value Mongolian
-    \value NauruLanguage
-    \value Nepali
-    \value Norwegian
-    \value NorwegianBokmal
-    \value Nynorsk Obsolete, please use NorwegianNynorsk
-    \value NorwegianNynorsk
-    \value Occitan
-    \value Oriya
-    \value Pashto
-    \value Persian
-    \value Polish
-    \value Portuguese
-    \value Punjabi
-    \value Quechua
-    \value RhaetoRomance
-    \value Romanian
-    \value Russian
-    \value Samoan
-    \value Sangho
-    \value Sanskrit
-    \value Serbian
-    \value SerboCroatian
-    \value Sesotho
-    \value Setswana
-    \value Shona
-    \value Sindhi
-    \value Singhalese
-    \value Siswati
-    \value Slovak
-    \value Slovenian
-    \value Somali
-    \value Spanish
-    \value Sundanese
-    \value Swahili
-    \value Swedish
-    \value Tagalog
-    \value Tajik
-    \value Tamil
-    \value Tatar
-    \value Telugu
-    \value Thai
-    \value Tibetan
-    \value Tigrinya
-    \value TongaLanguage
-    \value Tsonga
-    \value Turkish
-    \value Turkmen
-    \value Twi
-    \value Uigur
-    \value Ukrainian
-    \value Urdu
-    \value Uzbek
-    \value Vietnamese
-    \value Volapuk
-    \value Welsh
-    \value Wolof
-    \value Xhosa
-    \value Yiddish
-    \value Yoruba
-    \value Zhuang
-    \value Zulu
-    \value Bosnian
-    \value Divehi
-    \value Manx
-    \value Cornish
-    \value Akan
-    \value Konkani
-    \value Ga
-    \value Igbo
-    \value Kamba
-    \value Syriac
-    \value Blin
-    \value Geez
-    \value Koro
-    \value Sidamo
-    \value Atsam
-    \value Tigre
-    \value Jju
-    \value Friulian
-    \value Venda
-    \value Ewe
-    \value Walamo
-    \value Hawaiian
-    \value Tyap
-    \value Chewa
-    \value Filipino
-    \value SwissGerman
-    \value SichuanYi
-    \value Kpelle
-    \value LowGerman
-    \value SouthNdebele
-    \value NorthernSotho
-    \value NorthernSami
-    \value Taroko
-    \value Gusii
-    \value Taita
-    \value Fulah
-    \value Kikuyu
-    \value Samburu
-    \value Sena
-    \value NorthNdebele
-    \value Rombo
-    \value Tachelhit
-    \value Kabyle
-    \value Nyankole
-    \value Bena
-    \value Vunjo
-    \value Bambara
-    \value Embu
-    \value Cherokee
-    \value Morisyen
-    \value Makonde
-    \value Langi
-    \value Ganda
-    \value Bemba
-    \value Kabuverdianu
-    \value Meru
-    \value Kalenjin
-    \value Nama
-    \value Machame
-    \value Colognian
-    \value Masai
-    \value Soga
-    \value Luyia
-    \value Asu
-    \value Teso
-    \value Saho
-    \value KoyraChiini
-    \value Rwa
-    \value Luo
-    \value Chiga
-    \value CentralMoroccoTamazight
-    \value KoyraboroSenni
-    \value Shambala
-    \omitvalue LastLanguage
-
-    \sa language()
+    Returns a localized string representation of the given \a date in the
+    specified \a format.
+    If \a format is an empty string, an empty string is returned.
 */
 
-/*!
-    \enum QLocale::Country
-
-    This enumerated type is used to specify a country.
-
-    \value AnyCountry
-    \value Afghanistan
-    \value Albania
-    \value Algeria
-    \value AmericanSamoa
-    \value Andorra
-    \value Angola
-    \value Anguilla
-    \value Antarctica
-    \value AntiguaAndBarbuda
-    \value Argentina
-    \value Armenia
-    \value Aruba
-    \value Australia
-    \value Austria
-    \value Azerbaijan
-    \value Bahamas
-    \value Bahrain
-    \value Bangladesh
-    \value Barbados
-    \value Belarus
-    \value Belgium
-    \value Belize
-    \value Benin
-    \value Bermuda
-    \value Bhutan
-    \value Bolivia
-    \value BosniaAndHerzegowina
-    \value Botswana
-    \value BouvetIsland
-    \value Brazil
-    \value BritishIndianOceanTerritory
-    \value BruneiDarussalam
-    \value Bulgaria
-    \value BurkinaFaso
-    \value Burundi
-    \value Cambodia
-    \value Cameroon
-    \value Canada
-    \value CapeVerde
-    \value CaymanIslands
-    \value CentralAfricanRepublic
-    \value Chad
-    \value Chile
-    \value China
-    \value ChristmasIsland
-    \value CocosIslands
-    \value Colombia
-    \value Comoros
-    \value DemocraticRepublicOfCongo
-    \value PeoplesRepublicOfCongo
-    \value CookIslands
-    \value CostaRica
-    \value IvoryCoast
-    \value Croatia
-    \value Cuba
-    \value Cyprus
-    \value CzechRepublic
-    \value Denmark
-    \value Djibouti
-    \value Dominica
-    \value DominicanRepublic
-    \value EastTimor
-    \value Ecuador
-    \value Egypt
-    \value ElSalvador
-    \value EquatorialGuinea
-    \value Eritrea
-    \value Estonia
-    \value Ethiopia
-    \value FalklandIslands
-    \value FaroeIslands
-    \value FijiCountry
-    \value Finland
-    \value France
-    \value MetropolitanFrance
-    \value FrenchGuiana
-    \value FrenchPolynesia
-    \value FrenchSouthernTerritories
-    \value Gabon
-    \value Gambia
-    \value Georgia
-    \value Germany
-    \value Ghana
-    \value Gibraltar
-    \value Greece
-    \value Greenland
-    \value Grenada
-    \value Guadeloupe
-    \value Guam
-    \value Guatemala
-    \value Guinea
-    \value GuineaBissau
-    \value Guyana
-    \value Haiti
-    \value HeardAndMcDonaldIslands
-    \value Honduras
-    \value HongKong
-    \value Hungary
-    \value Iceland
-    \value India
-    \value Indonesia
-    \value Iran
-    \value Iraq
-    \value Ireland
-    \value Israel
-    \value Italy
-    \value Jamaica
-    \value Japan
-    \value Jordan
-    \value Kazakhstan
-    \value Kenya
-    \value Kiribati
-    \value DemocraticRepublicOfKorea
-    \value RepublicOfKorea
-    \value Kuwait
-    \value Kyrgyzstan
-    \value Lao
-    \value Latvia
-    \value Lebanon
-    \value Lesotho
-    \value Liberia
-    \value LibyanArabJamahiriya
-    \value Liechtenstein
-    \value Lithuania
-    \value Luxembourg
-    \value Macau
-    \value Macedonia
-    \value Madagascar
-    \value Malawi
-    \value Malaysia
-    \value Maldives
-    \value Mali
-    \value Malta
-    \value MarshallIslands
-    \value Martinique
-    \value Mauritania
-    \value Mauritius
-    \value Mayotte
-    \value Mexico
-    \value Micronesia
-    \value Moldova
-    \value Monaco
-    \value Mongolia
-    \value Montserrat
-    \value Morocco
-    \value Mozambique
-    \value Myanmar
-    \value Namibia
-    \value NauruCountry
-    \value Nepal
-    \value Netherlands
-    \value NetherlandsAntilles
-    \value NewCaledonia
-    \value NewZealand
-    \value Nicaragua
-    \value Niger
-    \value Nigeria
-    \value Niue
-    \value NorfolkIsland
-    \value NorthernMarianaIslands
-    \value Norway
-    \value Oman
-    \value Pakistan
-    \value Palau
-    \value PalestinianTerritory
-    \value Panama
-    \value PapuaNewGuinea
-    \value Paraguay
-    \value Peru
-    \value Philippines
-    \value Pitcairn
-    \value Poland
-    \value Portugal
-    \value PuertoRico
-    \value Qatar
-    \value Reunion
-    \value Romania
-    \value RussianFederation
-    \value Rwanda
-    \value SaintKittsAndNevis
-    \value StLucia
-    \value StVincentAndTheGrenadines
-    \value Samoa
-    \value SanMarino
-    \value SaoTomeAndPrincipe
-    \value SaudiArabia
-    \value Senegal
-    \value SerbiaAndMontenegro
-    \value Seychelles
-    \value SierraLeone
-    \value Singapore
-    \value Slovakia
-    \value Slovenia
-    \value SolomonIslands
-    \value Somalia
-    \value SouthAfrica
-    \value SouthGeorgiaAndTheSouthSandwichIslands
-    \value Spain
-    \value SriLanka
-    \value StHelena
-    \value StPierreAndMiquelon
-    \value Sudan
-    \value Suriname
-    \value SvalbardAndJanMayenIslands
-    \value Swaziland
-    \value Sweden
-    \value Switzerland
-    \value SyrianArabRepublic
-    \value Taiwan
-    \value Tajikistan
-    \value Tanzania
-    \value Thailand
-    \value Togo
-    \value Tokelau
-    \value TongaCountry
-    \value TrinidadAndTobago
-    \value Tunisia
-    \value Turkey
-    \value Turkmenistan
-    \value TurksAndCaicosIslands
-    \value Tuvalu
-    \value Uganda
-    \value Ukraine
-    \value UnitedArabEmirates
-    \value UnitedKingdom
-    \value UnitedStates
-    \value UnitedStatesMinorOutlyingIslands
-    \value Uruguay
-    \value Uzbekistan
-    \value Vanuatu
-    \value VaticanCityState
-    \value Venezuela
-    \value VietNam
-    \value BritishVirginIslands
-    \value USVirginIslands
-    \value WallisAndFutunaIslands
-    \value WesternSahara
-    \value Yemen
-    \value Yugoslavia
-    \value Zambia
-    \value Zimbabwe
-    \value SerbiaAndMontenegro
-    \value Montenegro
-    \value Serbia
-    \value SaintBarthelemy
-    \value SaintMartin
-    \value LatinAmericaAndTheCaribbean
-    \omitvalue LastCountry
-
-    \sa country()
-*/
+QString QLocale::toString(const QDate &date, const QString &format) const
+{
+    return d()->dateTimeToString(format, &date, 0, this);
+}
 
 /*!
-    \enum QLocale::FormatType
-
-    This enum describes the types of format that can be used when
-    converting QDate and QTime objects to strings.
-
-    \value LongFormat The long version of day and month names; for
-    example, returning "January" as a month name.
-
-    \value ShortFormat The short version of day and month names; for
-    example, returning "Jan" as a month name.
-
-    \value NarrowFormat A special version of day and month names for
-    use when space is limited; for example, returning "J" as a month
-    name. Note that the narrow format might contain the same text for
-    different months and days or it can even be an empty string if the
-    locale doesn't support narrow names, so you should avoid using it
-    for date formatting. Also, for the system locale this format is
-    the same as ShortFormat.
+    Returns a localized string representation of the given \a date according
+    to the specified \a format.
 */
 
-/*!
-    \enum QLocale::NumberOption
-
-    This enum defines a set of options for number-to-string and string-to-number
-    conversions. They can be retrieved with numberOptions() and set with
-    setNumberOptions().
-
-    \value OmitGroupSeparator If this option is set, the number-to-string functions
-            will not insert group separators in their return values. The default
-            is to insert group separators.
-    \value RejectGroupSeparator If this option is set, the string-to-number functions
-            will fail if they encounter group separators in their input. The default
-            is to accept numbers containing correctly placed group separators.
+QString QLocale::toString(const QDate &date, FormatType format) const
+{
+    if (!date.isValid())
+        return QString();
 
-    \sa setNumberOptions() numberOptions()
-*/
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::DateToStringLong : QSystemLocale::DateToStringShort,
+                                             date);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
 
-/*!
-    \enum QLocale::MeasurementSystem
+    QString format_str = dateFormat(format);
+    return toString(date, format_str);
+}
 
-    This enum defines which units are used for measurement.
+static bool timeFormatContainsAP(const QString &format)
+{
+    int i = 0;
+    while (i < format.size()) {
+        if (format.at(i).unicode() == '\'') {
+            readEscapedFormatString(format, &i);
+            continue;
+        }
 
-    \value MetricSystem This value indicates metric units, such as meters,
-            centimeters and millimeters.
-    \value ImperialSystem This value indicates imperial units, such as inches and
-            miles. There are several distinct imperial systems in the world; this
-            value stands for the official United States imperial units.
+        if (format.at(i).toLower().unicode() == 'a')
+            return true;
 
-    \since 4.4
-*/
+        ++i;
+    }
+    return false;
+}
 
+static QString timeZone()
+{
+#if defined(Q_OS_WINCE)
+    TIME_ZONE_INFORMATION info;
+    DWORD res = GetTimeZoneInformation(&info);
+    if (res == TIME_ZONE_ID_UNKNOWN)
+        return QString();
+    return QString::fromWCharArray(info.StandardName);
+#elif defined(Q_OS_WIN)
+    _tzset();
+# if defined(_MSC_VER) && _MSC_VER >= 1400
+    size_t returnSize = 0;
+    char timeZoneName[512];
+    if (_get_tzname(&returnSize, timeZoneName, 512, 1))
+        return QString();
+    return QString::fromLocal8Bit(timeZoneName);
+# else
+    return QString::fromLocal8Bit(_tzname[1]);
+# endif
+#elif defined(Q_OS_VXWORKS)
+    return QString();
+#else
+    tzset();
+    return QString::fromLocal8Bit(tzname[1]);
+#endif
+}
 
 /*!
-    \fn bool QLocale::operator==(const QLocale &other) const
-
-    Returns true if the QLocale object is the same as the \a other
-    locale specified; otherwise returns false.
+    Returns a localized string representation of the given \a time according
+    to the specified \a format.
+    If \a format is an empty string, an empty string is returned.
 */
+QString QLocale::toString(const QTime &time, const QString &format) const
+{
+    return d()->dateTimeToString(format, 0, &time, this);
+}
 
 /*!
-    \fn bool QLocale::operator!=(const QLocale &other) const
+    \since 4.4
 
-    Returns true if the QLocale object is not the same as the \a other
-    locale specified; otherwise returns false.
+    Returns a localized string representation of the given \a dateTime according
+    to the specified \a format.
+    If \a format is an empty string, an empty string is returned.
 */
 
-/*!
-    \enum QLocale::QuotationStyle
-
-    This enum defines a set of possible styles for locale specific quotation.
-
-    \value StandardQuotation If this option is set, the standard quotation marks
-            will be used to quote strings.
-    \value AlternateQuotation If this option is set, the alternate quotation marks
-            will be used to quote strings.
+QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
+{
+    const QDate dt = dateTime.date();
+    const QTime tm = dateTime.time();
+    return d()->dateTimeToString(format, &dt, &tm, this);
+}
 
-    \since 4.8
+/*!
+    \since 4.4
 
-    \sa quoteString()
+    Returns a localized string representation of the given \a dateTime according
+    to the specified \a format.
 */
 
-static const int locale_data_size = sizeof(locale_data)/sizeof(QLocalePrivate) - 1;
-
-static const QLocalePrivate *dataPointerHelper(quint16 index)
+QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
 {
+    if (!dateTime.isValid())
+        return QString();
+
 #ifndef QT_NO_SYSTEMLOCALE
-    Q_ASSERT(index <= locale_data_size);
-    if (index == locale_data_size)
-        return system_lp;
-#else
-    Q_ASSERT(index < locale_data_size);
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::DateTimeToStringLong
+                                             : QSystemLocale::DateTimeToStringShort,
+                                             dateTime);
+        if (!res.isNull())
+            return res.toString();
+    }
 #endif
 
-    return &locale_data[index];
+    const QString format_str = dateTimeFormat(format);
+    return toString(dateTime, format_str);
 }
 
-static quint16 localePrivateIndex(const QLocalePrivate *p)
+
+/*!
+    Returns a localized string representation of the given \a time in the
+    specified \a format.
+*/
+
+QString QLocale::toString(const QTime &time, FormatType format) const
 {
+    if (!time.isValid())
+        return QString();
+
 #ifndef QT_NO_SYSTEMLOCALE
-    Q_ASSERT((p >= locale_data && p - locale_data < locale_data_size)
-             || (p != 0 && p == system_lp));
-    quint16 index = p == system_lp ? locale_data_size : p - locale_data;
-#else
-    Q_ASSERT(p >= locale_data && p - locale_data < locale_data_size);
-    quint16 index = p - locale_data;
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::TimeToStringLong : QSystemLocale::TimeToStringShort,
+                                             time);
+        if (!res.isNull())
+            return res.toString();
+    }
 #endif
 
-    return index;
+    QString format_str = timeFormat(format);
+    return toString(time, format_str);
 }
 
 /*!
-    Constructs a QLocale object with the specified \a name,
-    which has the format
-    "language[_-country][.codeset][@modifier]" or "C", where:
-
-    \list
-    \i language is a lowercase, two-letter, ISO 639 language code,
-    \i territory is an uppercase, two-letter, ISO 3166 country code,
-    \i and codeset and modifier are ignored.
-    \endlist
-
-    The separator can be either underscore or a minus sign.
-
-    If the string violates the locale format, or language is not
-    a valid ISO 369 code, the "C" locale is used instead. If country
-    is not present, or is not a valid ISO 3166 code, the most
-    appropriate country is chosen for the specified language.
+    \since 4.1
 
-    The language and country codes are converted to their respective
-    \c Language and \c Country enums. After this conversion is
-    performed the constructor behaves exactly like QLocale(Country,
-    Language).
+    Returns the date format used for the current locale.
 
-    This constructor is much slower than QLocale(Country, Language).
+    If \a format is LongFormat the format will be a long version.
+    Otherwise it uses a shorter version.
 
-    \sa name()
+    \sa QDate::toString(), QDate::fromString()
 */
 
-QLocale::QLocale(const QString &name)
-    : v(0)
+QString QLocale::dateFormat(FormatType format) const
 {
-    p.numberOptions = 0;
-    p.index = localePrivateIndex(findLocale(name));
-}
-
-/*!
-    Constructs a QLocale object initialized with the default locale. If
-    no default locale was set using setDefaultLocale(), this locale will
-    be the same as the one returned by system().
-
-    \sa setDefault()
-*/
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::DateFormatLong : QSystemLocale::DateFormatShort,
+                                             QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
 
-QLocale::QLocale()
-    : v(0)
-{
-    p.numberOptions = default_number_options;
-    p.index = localePrivateIndex(defaultPrivate());
+    quint32 idx, size;
+    switch (format) {
+    case LongFormat:
+        idx = d()->m_long_date_format_idx;
+        size = d()->m_long_date_format_size;
+        break;
+    default:
+        idx = d()->m_short_date_format_idx;
+        size = d()->m_short_date_format_size;
+        break;
+    }
+    return getLocaleData(date_format_data + idx, size);
 }
 
 /*!
-    Constructs a QLocale object with the specified \a language and \a
-    country.
+    \since 4.1
 
-    \list
-    \i If the language/country pair is found in the database, it is used.
-    \i If the language is found but the country is not, or if the country
-       is \c AnyCountry, the language is used with the most
-       appropriate available country (for example, Germany for German),
-    \i If neither the language nor the country are found, QLocale
-       defaults to the default locale (see setDefault()).
-    \endlist
+    Returns the time format used for the current locale.
 
-    The language and country that are actually used can be queried
-    using language() and country().
+    If \a format is LongFormat the format will be a long version.
+    Otherwise it uses a shorter version.
 
-    \sa setDefault() language() country()
+    \sa QTime::toString(), QTime::fromString()
 */
 
-QLocale::QLocale(Language language, Country country)
-    : v(0)
+QString QLocale::timeFormat(FormatType format) const
 {
-    const QLocalePrivate *d = findLocale(language, country);
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::TimeFormatLong : QSystemLocale::TimeFormatShort,
+                                             QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
 
-    // If not found, should default to system
-    if (d->languageId() == QLocale::C && language != QLocale::C) {
-        p.numberOptions = default_number_options;
-        p.index = localePrivateIndex(defaultPrivate());
-    } else {
-        p.numberOptions = 0;
-        p.index = localePrivateIndex(d);
+    quint32 idx, size;
+    switch (format) {
+    case LongFormat:
+        idx = d()->m_long_time_format_idx;
+        size = d()->m_long_time_format_size;
+        break;
+    default:
+        idx = d()->m_short_time_format_idx;
+        size = d()->m_short_time_format_size;
+        break;
     }
+    return getLocaleData(time_format_data + idx, size);
 }
 
 /*!
-    Constructs a QLocale object as a copy of \a other.
-*/
+    \since 4.4
 
-QLocale::QLocale(const QLocale &other)
-{
-    v = other.v;
-}
+    Returns the date time format used for the current locale.
 
-const QLocalePrivate *QLocale::d() const
-{
-    return dataPointerHelper(p.index);
-}
+    If \a format is ShortFormat the format will be a short version.
+    Otherwise it uses a longer version.
 
-/*!
-    Assigns \a other to this QLocale object and returns a reference
-    to this QLocale object.
+    \sa QDateTime::toString(), QDateTime::fromString()
 */
 
-QLocale &QLocale::operator=(const QLocale &other)
+QString QLocale::dateTimeFormat(FormatType format) const
 {
-    v = other.v;
-    return *this;
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(format == LongFormat
+                                             ? QSystemLocale::DateTimeFormatLong
+                                             : QSystemLocale::DateTimeFormatShort,
+                                             QVariant());
+        if (!res.isNull()) {
+            return res.toString();
+        }
+    }
+#endif
+    return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
 }
 
 /*!
-    \since 4.2
+    \since 4.4
 
-    Sets the \a options related to number conversions for this
-    QLocale instance.
+    Parses the time string given in \a string and returns the
+    time. The format of the time string is chosen according to the
+    \a format parameter (see timeFormat()).
+
+    If the time could not be parsed, returns an invalid time.
+
+    \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
 */
-void QLocale::setNumberOptions(NumberOptions options)
+#ifndef QT_NO_DATESTRING
+QTime QLocale::toTime(const QString &string, FormatType format) const
 {
-    p.numberOptions = options;
+    return toTime(string, timeFormat(format));
 }
+#endif
 
 /*!
-    \since 4.2
+    \since 4.4
 
-    Returns the options related to number conversions for this
-    QLocale instance.
+    Parses the date string given in \a string and returns the
+    date. The format of the date string is chosen according to the
+    \a format parameter (see dateFormat()).
 
-    By default, no options are set for the standard locales.
+    If the date could not be parsed, returns an invalid date.
+
+    \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
 */
-QLocale::NumberOptions QLocale::numberOptions() const
+#ifndef QT_NO_DATESTRING
+QDate QLocale::toDate(const QString &string, FormatType format) const
 {
-    return static_cast<NumberOption>(p.numberOptions);
+    return toDate(string, dateFormat(format));
 }
+#endif
 
 /*!
-    \since 4.8
+    \since 4.4
 
-    Returns \a str quoted according to the current locale.
+    Parses the date/time string given in \a string and returns the
+    time. The format of the date/time string is chosen according to the
+    \a format parameter (see dateTimeFormat()).
 
-    If \a AlternateQuotation is used for \a QuoatationStyle
-    but the locale does not provide an alternate quotation,
-    we will fallback to the parent locale.
+    If the string could not be parsed, returns an invalid QDateTime.
+
+    \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
 */
-QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
-{
 
-    return quoteString(&str, qs);
+#ifndef QT_NO_DATESTRING
+QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
+{
+    return toDateTime(string, dateTimeFormat(format));
 }
+#endif
 
 /*!
-    \since 4.8
+    \since 4.4
 
-    \overload
-*/
-QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant quotationBegin = systemLocale()->query(QSystemLocale::QuotationBegin, QVariant(qs));
-        QVariant quotationEnd = systemLocale()->query(QSystemLocale::QuotationEnd, QVariant(qs));
-        if (!quotationBegin.isNull() && !quotationEnd.isNull())
-            return quotationBegin.toString() % str % quotationEnd.toString();
-    }
-#endif
+    Parses the time string given in \a string and returns the
+    time. See QTime::fromString() for information on what is a valid
+    format string.
 
-    if (qs == StandardQuotation)
-        return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
-    else
-        return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
+    If the time could not be parsed, returns an invalid time.
+
+    \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
+*/
+#ifndef QT_NO_DATESTRING
+QTime QLocale::toTime(const QString &string, const QString &format) const
+{
+    QTime time;
+#ifndef QT_BOOTSTRAPPED
+    QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString);
+    dt.defaultLocale = *this;
+    if (dt.parseFormat(format))
+        dt.fromString(string, 0, &time);
+#else
+    Q_UNUSED(string);
+    Q_UNUSED(format);
+#endif
+    return time;
 }
+#endif
 
 /*!
-    \nonreentrant
+    \since 4.4
 
-    Sets the global default locale to \a locale. These
-    values are used when a QLocale object is constructed with
-    no arguments. If this function is not called, the system's
-    locale is used.
+    Parses the date string given in \a string and returns the
+    date. See QDate::fromString() for information on the expressions
+    that can be used with this function.
 
-    \warning In a multithreaded application, the default locale
-    should be set at application startup, before any non-GUI threads
-    are created.
+    This function searches month names and the names of the days of
+    the week in the current locale.
 
-    \sa system() c()
-*/
+    If the date could not be parsed, returns an invalid date.
 
-void QLocale::setDefault(const QLocale &locale)
+    \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
+*/
+#ifndef QT_NO_DATESTRING
+QDate QLocale::toDate(const QString &string, const QString &format) const
 {
-    default_lp = locale.d();
-    default_number_options = locale.numberOptions();
+    QDate date;
+#ifndef QT_BOOTSTRAPPED
+    QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString);
+    dt.defaultLocale = *this;
+    if (dt.parseFormat(format))
+        dt.fromString(string, &date, 0);
+#else
+    Q_UNUSED(string);
+    Q_UNUSED(format);
+#endif
+    return date;
 }
+#endif
 
 /*!
-    Returns the language of this locale.
+    \since 4.4
 
-    \sa country(), languageToString(), name()
+    Parses the date/time string given in \a string and returns the
+    time.  See QDateTime::fromString() for information on the expressions
+    that can be used with this function.
+
+    \note The month and day names used must be given in the user's local
+    language.
+
+    If the string could not be parsed, returns an invalid QDateTime.
+
+    \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
 */
-QLocale::Language QLocale::language() const
+#ifndef QT_NO_DATESTRING
+QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
 {
-    return Language(d()->languageId());
+#ifndef QT_BOOTSTRAPPED
+    QTime time;
+    QDate date;
+
+    QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString);
+    dt.defaultLocale = *this;
+    if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
+        return QDateTime(date, time);
+#else
+    Q_UNUSED(string);
+    Q_UNUSED(format);
+#endif
+    return QDateTime(QDate(), QTime(-1, -1, -1));
 }
+#endif
+
 
 /*!
-    Returns the country of this locale.
+    \since 4.1
 
-    \sa language(), countryToString(), name()
+    Returns the decimal point character of this locale.
 */
-QLocale::Country QLocale::country() const
+QChar QLocale::decimalPoint() const
 {
-    return Country(d()->countryId());
+    return d()->decimal();
 }
 
 /*!
-    Returns the language and country of this locale as a
-    string of the form "language_country", where
-    language is a lowercase, two-letter ISO 639 language code,
-    and country is an uppercase, two-letter ISO 3166 country code.
+    \since 4.1
 
-    \sa language(), country()
+    Returns the group separator character of this locale.
 */
-
-QString QLocale::name() const
+QChar QLocale::groupSeparator() const
 {
-    Language l = language();
-
-    QString result = languageToCode(l);
-
-    if (l == C)
-        return result;
-
-    Country c = country();
-    if (c == AnyCountry)
-        return result;
-
-    result.append(QLatin1Char('_'));
-    result.append(countryToCode(c));
-
-    return result;
+    return d()->group();
 }
 
 /*!
-    Returns a QString containing the name of \a language.
+    \since 4.1
 
-    \sa countryToString(), name()
+    Returns the percent character of this locale.
 */
-
-QString QLocale::languageToString(Language language)
+QChar QLocale::percent() const
 {
-    if (uint(language) > uint(QLocale::LastLanguage))
-        return QLatin1String("Unknown");
-    return QLatin1String(language_name_list + language_name_index[language]);
+    return d()->percent();
 }
 
 /*!
-    Returns a QString containing the name of \a country.
+    \since 4.1
 
-    \sa country(), name()
+    Returns the zero digit character of this locale.
 */
-
-QString QLocale::countryToString(Country country)
+QChar QLocale::zeroDigit() const
 {
-    if (uint(country) > uint(QLocale::LastCountry))
-        return QLatin1String("Unknown");
-    return QLatin1String(country_name_list + country_name_index[country]);
+    return d()->zero();
 }
 
 /*!
-    Returns the short int represented by the localized string \a s,
-    using base \a base. If \a base is 0 the base is determined
-    automatically using the following rules: If the string begins with
-    "0x", it is assumed to be hexadecimal; if it begins with "0", it
-    is assumed to be octal; otherwise it is assumed to be decimal.
-
-    If the conversion fails the function returns 0.
-
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
-
-    This function ignores leading and trailing whitespace.
+    \since 4.1
 
-    \sa toUShort(), toString()
+    Returns the negative sign character of this locale.
 */
-
-short QLocale::toShort(const QString &s, bool *ok, int base) const
+QChar QLocale::negativeSign() const
 {
-    qlonglong i = toLongLong(s, ok, base);
-    if (i < SHRT_MIN || i > SHRT_MAX) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-    return short(i);
+    return d()->minus();
 }
 
 /*!
-    Returns the unsigned short int represented by the localized string
-    \a s, using base \a base. If \a base is 0 the base is determined
-    automatically using the following rules: If the string begins with
-    "0x", it is assumed to be hexadecimal; if it begins with "0", it
-    is assumed to be octal; otherwise it is assumed to be decimal.
-
-    If the conversion fails the function returns 0.
-
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
-
-    This function ignores leading and trailing whitespace.
+    \since 4.5
 
-    \sa toShort(), toString()
+    Returns the positive sign character of this locale.
 */
-
-ushort QLocale::toUShort(const QString &s, bool *ok, int base) const
+QChar QLocale::positiveSign() const
 {
-    qulonglong i = toULongLong(s, ok, base);
-    if (i > USHRT_MAX) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-    return ushort(i);
+    return d()->plus();
 }
 
 /*!
-    Returns the int represented by the localized string \a s, using
-    base \a base. If \a base is 0 the base is determined automatically
-    using the following rules: If the string begins with "0x", it is
-    assumed to be hexadecimal; if it begins with "0", it is assumed to
-    be octal; otherwise it is assumed to be decimal.
-
-    If the conversion fails the function returns 0.
-
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
-
-    This function ignores leading and trailing whitespace.
+    \since 4.1
 
-    \sa toUInt(), toString()
+    Returns the exponential character of this locale.
 */
+QChar QLocale::exponential() const
+{
+    return d()->exponential();
+}
 
-int QLocale::toInt(const QString &s, bool *ok, int base) const
+static bool qIsUpper(char c)
 {
-    qlonglong i = toLongLong(s, ok, base);
-    if (i < INT_MIN || i > INT_MAX) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-    return int(i);
+    return c >= 'A' && c <= 'Z';
+}
+
+static char qToLower(char c)
+{
+    if (c >= 'A' && c <= 'Z')
+        return c - 'A' + 'a';
+    else
+        return c;
 }
 
 /*!
-    Returns the unsigned int represented by the localized string \a s,
-    using base \a base. If \a base is 0 the base is determined
-    automatically using the following rules: If the string begins with
-    "0x", it is assumed to be hexadecimal; if it begins with "0", it
-    is assumed to be octal; otherwise it is assumed to be decimal.
+    \overload
 
-    If the conversion fails the function returns 0.
+    \a f and \a prec have the same meaning as in QString::number(double, char, int).
 
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
-
-    This function ignores leading and trailing whitespace.
-
-    \sa toInt(), toString()
+    \sa toDouble()
 */
 
-uint QLocale::toUInt(const QString &s, bool *ok, int base) const
+QString QLocale::toString(double i, char f, int prec) const
 {
-    qulonglong i = toULongLong(s, ok, base);
-    if (i > UINT_MAX) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-    return uint(i);
-}
-
-/*!
-    Returns the long long int represented by the localized string \a
-    s, using base \a base. If \a base is 0 the base is determined
-    automatically using the following rules: If the string begins with
-    "0x", it is assumed to be hexadecimal; if it begins with "0", it
-    is assumed to be octal; otherwise it is assumed to be decimal.
-
-    If the conversion fails the function returns 0.
-
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
-
-    This function ignores leading and trailing whitespace.
-
-    \sa toInt(), toULongLong(), toDouble(), toString()
-*/
+    QLocalePrivate::DoubleForm form = QLocalePrivate::DFDecimal;
+    uint flags = 0;
 
+    if (qIsUpper(f))
+        flags = QLocalePrivate::CapitalEorX;
+    f = qToLower(f);
 
-qlonglong QLocale::toLongLong(const QString &s, bool *ok, int base) const
-{
-    QLocalePrivate::GroupSeparatorMode mode
-        = p.numberOptions & RejectGroupSeparator
-            ? QLocalePrivate::FailOnGroupSeparators
-            : QLocalePrivate::ParseGroupSeparators;
+    switch (f) {
+        case 'f':
+            form = QLocalePrivate::DFDecimal;
+            break;
+        case 'e':
+            form = QLocalePrivate::DFExponent;
+            break;
+        case 'g':
+            form = QLocalePrivate::DFSignificantDigits;
+            break;
+        default:
+            break;
+    }
 
-    return d()->stringToLongLong(s, base, ok, mode);
+    if (!(p.numberOptions & OmitGroupSeparator))
+        flags |= QLocalePrivate::ThousandsGroup;
+    return d()->doubleToString(i, prec, form, -1, flags);
 }
 
-// ### Qt5: make the return type for toULongLong() qulonglong.
-
 /*!
-    Returns the unsigned long long int represented by the localized
-    string \a s, using base \a base. If \a base is 0 the base is
-    determined automatically using the following rules: If the string
-    begins with "0x", it is assumed to be hexadecimal; if it begins
-    with "0", it is assumed to be octal; otherwise it is assumed to be
-    decimal.
-
-    If the conversion fails the function returns 0.
-
-    If \a ok is not 0, failure is reported by setting *ok to false, and
-    success by setting *ok to true.
+    \fn QLocale QLocale::c()
 
-    This function ignores leading and trailing whitespace.
+    Returns a QLocale object initialized to the "C" locale.
 
-    \sa toLongLong(), toInt(), toDouble(), toString()
+    \sa system()
 */
 
-qlonglong QLocale::toULongLong(const QString &s, bool *ok, int base) const
-{
-    QLocalePrivate::GroupSeparatorMode mode
-        = p.numberOptions & RejectGroupSeparator
-            ? QLocalePrivate::FailOnGroupSeparators
-            : QLocalePrivate::ParseGroupSeparators;
-
-    return d()->stringToUnsLongLong(s, base, ok, mode);
-}
-
 /*!
-    Returns the float represented by the localized string \a s, or 0.0
-    if the conversion failed.
-
-    If \a ok is not 0, reports failure by setting
-    *ok to false and success by setting *ok to true.
+    Returns a QLocale object initialized to the system locale.
 
-    This function ignores leading and trailing whitespace.
+    On Windows and Mac, this locale will use the decimal/grouping characters and date/time
+    formats specified in the system configuration panel.
 
-    \sa toDouble(), toInt(), toString()
+    \sa c()
 */
 
-#define QT_MAX_FLOAT 3.4028234663852886e+38
-
-float QLocale::toFloat(const QString &s, bool *ok) const
+QLocale QLocale::system()
 {
-    bool myOk;
-    double d = toDouble(s, &myOk);
-    if (!myOk || d > QT_MAX_FLOAT || d < -QT_MAX_FLOAT) {
-        if (ok != 0)
-            *ok = false;
-        return 0.0;
-    }
-    if (ok != 0)
-        *ok = true;
-    return float(d);
+    QLocale result(C);
+    result.p.index = localePrivateIndex(systemPrivate());
+    return result;
 }
 
 /*!
-    Returns the double represented by the localized string \a s, or
-    0.0 if the conversion failed.
-
-    If \a ok is not 0, reports failure by setting
-    *ok to false and success by setting *ok to true.
-
-    Unlike QString::toDouble(), this function does not fall back to
-    the "C" locale if the string cannot be interpreted in this
-    locale.
-
-    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 3
-
-    Notice that the last conversion returns 1234.0, because '.' is the
-    thousands group separator in the German locale.
-
-    This function ignores leading and trailing whitespace.
+    \since 4.3
 
-    \sa toFloat(), toInt(), toString()
+    Returns the list of countries that have entires for \a language in Qt's locale
+    database. If the result is an empty list, then \a language is not represented in
+    Qt's locale database.
 */
-
-double QLocale::toDouble(const QString &s, bool *ok) const
+QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
 {
-    QLocalePrivate::GroupSeparatorMode mode
-        = p.numberOptions & RejectGroupSeparator
-            ? QLocalePrivate::FailOnGroupSeparators
-            : QLocalePrivate::ParseGroupSeparators;
+    QList<Country> result;
 
-    return d()->stringToDouble(s, ok, mode);
-}
+    unsigned language_id = language;
+    uint idx = locale_index[language_id];
 
-/*!
-    Returns a localized string representation of \a i.
+    if (language == C) {
+        result << AnyCountry;
+        return result;
+    }
 
-    \sa toLongLong()
-*/
+    const QLocalePrivate *d = locale_data + idx;
 
-QString QLocale::toString(qlonglong i) const
-{
-    int flags = p.numberOptions & OmitGroupSeparator
-                    ? 0
-                    : QLocalePrivate::ThousandsGroup;
+    while (d->languageId() == language_id) {
+        result << static_cast<Country>(d->countryId());
+        ++d;
+    }
 
-    return d()->longLongToString(i, -1, 10, -1, flags);
+    return result;
 }
 
 /*!
-    \overload
+    \since 4.2
 
-    \sa toULongLong()
-*/
+    Returns the localized name of \a month, in the format specified
+    by \a type.
 
-QString QLocale::toString(qulonglong i) const
+    \sa dayName(), standaloneMonthName()
+*/
+QString QLocale::monthName(int month, FormatType type) const
 {
-    int flags = p.numberOptions & OmitGroupSeparator
-                    ? 0
-                    : QLocalePrivate::ThousandsGroup;
+    if (month < 1 || month > 12)
+        return QString();
 
-    return d()->unsLongLongToString(i, -1, 10, -1, flags);
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(type == LongFormat
+                                             ? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
+                                             month);
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+
+    quint32 idx, size;
+    switch (type) {
+    case QLocale::LongFormat:
+        idx = d()->m_long_month_names_idx;
+        size = d()->m_long_month_names_size;
+        break;
+    case QLocale::ShortFormat:
+        idx = d()->m_short_month_names_idx;
+        size = d()->m_short_month_names_size;
+        break;
+    case QLocale::NarrowFormat:
+        idx = d()->m_narrow_month_names_idx;
+        size = d()->m_narrow_month_names_size;
+        break;
+    default:
+        return QString();
+    }
+    return getLocaleListData(months_data + idx, size, month - 1);
 }
 
 /*!
-    Returns a localized string representation of the given \a date in the
-    specified \a format.
-    If \a format is an empty string, an empty string is returned.
-*/
+    \since 4.5
 
-QString QLocale::toString(const QDate &date, const QString &format) const
-{
-    return d()->dateTimeToString(format, &date, 0, this);
-}
+    Returns the localized name of \a month that is used as a
+    standalone text, in the format specified by \a type.
 
-/*!
-    Returns a localized string representation of the given \a date according
-    to the specified \a format.
-*/
+    If the locale information doesn't specify the standalone month
+    name then return value is the same as in monthName().
 
-QString QLocale::toString(const QDate &date, FormatType format) const
+    \sa monthName(), standaloneDayName()
+*/
+QString QLocale::standaloneMonthName(int month, FormatType type) const
 {
-    if (!date.isValid())
+    if (month < 1 || month > 12)
         return QString();
 
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::DateToStringLong : QSystemLocale::DateToStringShort,
-                                             date);
+        QVariant res = systemLocale()->query(type == LongFormat
+                                             ? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
+                                             month);
         if (!res.isNull())
             return res.toString();
     }
 #endif
 
-    QString format_str = dateFormat(format);
-    return toString(date, format_str);
-}
-
-static bool timeFormatContainsAP(const QString &format)
-{
-    int i = 0;
-    while (i < format.size()) {
-        if (format.at(i).unicode() == '\'') {
-            readEscapedFormatString(format, &i);
-            continue;
-        }
-
-        if (format.at(i).toLower().unicode() == 'a')
-            return true;
-
-        ++i;
-    }
-    return false;
-}
-
-static QString timeZone()
-{
-#if defined(Q_OS_WINCE)
-    TIME_ZONE_INFORMATION info;
-    DWORD res = GetTimeZoneInformation(&info);
-    if (res == TIME_ZONE_ID_UNKNOWN)
-        return QString();
-    return QString::fromWCharArray(info.StandardName);
-#elif defined(Q_OS_WIN)
-    _tzset();
-# if defined(_MSC_VER) && _MSC_VER >= 1400
-    size_t returnSize = 0;
-    char timeZoneName[512];
-    if (_get_tzname(&returnSize, timeZoneName, 512, 1))
+    quint32 idx, size;
+    switch (type) {
+    case QLocale::LongFormat:
+        idx = d()->m_standalone_long_month_names_idx;
+        size = d()->m_standalone_long_month_names_size;
+        break;
+    case QLocale::ShortFormat:
+        idx = d()->m_standalone_short_month_names_idx;
+        size = d()->m_standalone_short_month_names_size;
+        break;
+    case QLocale::NarrowFormat:
+        idx = d()->m_standalone_narrow_month_names_idx;
+        size = d()->m_standalone_narrow_month_names_size;
+        break;
+    default:
         return QString();
-    return QString::fromLocal8Bit(timeZoneName);
-# else
-    return QString::fromLocal8Bit(_tzname[1]);
-# endif
-#elif defined(Q_OS_VXWORKS)
-    return QString();
-#else
-    tzset();
-    return QString::fromLocal8Bit(tzname[1]);
-#endif
-}
-
-/*!
-    Returns a localized string representation of the given \a time according
-    to the specified \a format.
-    If \a format is an empty string, an empty string is returned.
-*/
-QString QLocale::toString(const QTime &time, const QString &format) const
-{
-    return d()->dateTimeToString(format, 0, &time, this);
+    }
+    QString name = getLocaleListData(standalone_months_data + idx, size, month - 1);
+    if (name.isEmpty())
+        return monthName(month, type);
+    return name;
 }
 
 /*!
-    \since 4.4
-
-    Returns a localized string representation of the given \a dateTime according
-    to the specified \a format.
-    If \a format is an empty string, an empty string is returned.
-*/
-
-QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
-{
-    const QDate dt = dateTime.date();
-    const QTime tm = dateTime.time();
-    return d()->dateTimeToString(format, &dt, &tm, this);
-}
+    \since 4.2
 
-/*!
-    \since 4.4
+    Returns the localized name of the \a day (where 1 represents
+    Monday, 2 represents Tuesday and so on), in the format specified
+    by \a type.
 
-    Returns a localized string representation of the given \a dateTime according
-    to the specified \a format.
+    \sa monthName(), standaloneDayName()
 */
-
-QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
+QString QLocale::dayName(int day, FormatType type) const
 {
-    if (!dateTime.isValid())
+    if (day < 1 || day > 7)
         return QString();
 
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::DateTimeToStringLong
-                                             : QSystemLocale::DateTimeToStringShort,
-                                             dateTime);
+        QVariant res = systemLocale()->query(type == LongFormat
+                                             ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
+                                             day);
         if (!res.isNull())
             return res.toString();
     }
 #endif
+    if (day == 7)
+        day = 0;
 
-    const QString format_str = dateTimeFormat(format);
-    return toString(dateTime, format_str);
-}
-
-
-/*!
-    Returns a localized string representation of the given \a time in the
-    specified \a format.
-*/
-
-QString QLocale::toString(const QTime &time, FormatType format) const
-{
-    if (!time.isValid())
+    quint32 idx, size;
+    switch (type) {
+    case QLocale::LongFormat:
+        idx = d()->m_long_day_names_idx;
+        size = d()->m_long_day_names_size;
+        break;
+    case QLocale::ShortFormat:
+        idx = d()->m_short_day_names_idx;
+        size = d()->m_short_day_names_size;
+        break;
+    case QLocale::NarrowFormat:
+        idx = d()->m_narrow_day_names_idx;
+        size = d()->m_narrow_day_names_size;
+        break;
+    default:
         return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::TimeToStringLong : QSystemLocale::TimeToStringShort,
-                                             time);
-        if (!res.isNull())
-            return res.toString();
     }
-#endif
-
-    QString format_str = timeFormat(format);
-    return toString(time, format_str);
+    return getLocaleListData(days_data + idx, size, day);
 }
 
 /*!
-    \since 4.1
+    \since 4.5
 
-    Returns the date format used for the current locale.
+    Returns the localized name of the \a day (where 1 represents
+    Monday, 2 represents Tuesday and so on) that is used as a
+    standalone text, in the format specified by \a type.
 
-    If \a format is LongFormat the format will be a long version.
-    Otherwise it uses a shorter version.
+    If the locale information does not specify the standalone day
+    name then return value is the same as in dayName().
 
-    \sa QDate::toString(), QDate::fromString()
+    \sa dayName(), standaloneMonthName()
 */
-
-QString QLocale::dateFormat(FormatType format) const
+QString QLocale::standaloneDayName(int day, FormatType type) const
 {
+    if (day < 1 || day > 7)
+        return QString();
+
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::DateFormatLong : QSystemLocale::DateFormatShort,
-                                             QVariant());
+        QVariant res = systemLocale()->query(type == LongFormat
+                                             ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
+                                             day);
         if (!res.isNull())
             return res.toString();
     }
 #endif
+    if (day == 7)
+        day = 0;
 
     quint32 idx, size;
-    switch (format) {
-    case LongFormat:
-        idx = d()->m_long_date_format_idx;
-        size = d()->m_long_date_format_size;
+    switch (type) {
+    case QLocale::LongFormat:
+        idx = d()->m_standalone_long_day_names_idx;
+        size = d()->m_standalone_long_day_names_size;
         break;
-    default:
-        idx = d()->m_short_date_format_idx;
-        size = d()->m_short_date_format_size;
+    case QLocale::ShortFormat:
+        idx = d()->m_standalone_short_day_names_idx;
+        size = d()->m_standalone_short_day_names_size;
+        break;
+    case QLocale::NarrowFormat:
+        idx = d()->m_standalone_narrow_day_names_idx;
+        size = d()->m_standalone_narrow_day_names_size;
         break;
+    default:
+        return QString();
     }
-    return getLocaleData(date_format_data + idx, size);
+    QString name = getLocaleListData(days_data + idx, size, day);
+    if (name.isEmpty())
+        return dayName(day == 0 ? 7 : day, type);
+    return name;
 }
 
 /*!
-    \since 4.1
-
-    Returns the time format used for the current locale.
-
-    If \a format is LongFormat the format will be a long version.
-    Otherwise it uses a shorter version.
+    \since 4.8
 
-    \sa QTime::toString(), QTime::fromString()
+    Returns the first day of the week according to the current locale.
 */
-
-QString QLocale::timeFormat(FormatType format) const
+Qt::DayOfWeek QLocale::firstDayOfWeek() const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::TimeFormatLong : QSystemLocale::TimeFormatShort,
-                                             QVariant());
+        QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
         if (!res.isNull())
-            return res.toString();
+            return static_cast<Qt::DayOfWeek>(res.toUInt());
     }
 #endif
-
-    quint32 idx, size;
-    switch (format) {
-    case LongFormat:
-        idx = d()->m_long_time_format_idx;
-        size = d()->m_long_time_format_size;
-        break;
-    default:
-        idx = d()->m_short_time_format_idx;
-        size = d()->m_short_time_format_size;
-        break;
-    }
-    return getLocaleData(time_format_data + idx, size);
+    return static_cast<Qt::DayOfWeek>(d()->m_first_day_of_week);
 }
 
 /*!
     \since 4.4
 
-    Returns the date time format used for the current locale.
-
-    If \a format is ShortFormat the format will be a short version.
-    Otherwise it uses a longer version.
-
-    \sa QDateTime::toString(), QDateTime::fromString()
+    Returns the measurement system for the locale.
 */
-
-QString QLocale::dateTimeFormat(FormatType format) const
+QLocale::MeasurementSystem QLocale::measurementSystem() const
 {
+    MeasurementSystem meas = MetricSystem;
+    bool found = false;
+
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(format == LongFormat
-                                             ? QSystemLocale::DateTimeFormatLong
-                                             : QSystemLocale::DateTimeFormatShort,
-                                             QVariant());
+        QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
         if (!res.isNull()) {
-            return res.toString();
+            meas = MeasurementSystem(res.toInt());
+            found = true;
         }
     }
 #endif
-    return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
+
+    if (!found) {
+        meas = d()->measurementSystem();
+        found = true;
+    }
+
+    return meas;
 }
 
 /*!
-    \since 4.4
+  \since 4.7
 
-    Parses the time string given in \a string and returns the
-    time. The format of the time string is chosen according to the
-    \a format parameter (see timeFormat()).
-
-    If the time could not be parsed, returns an invalid time.
-
-    \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
+  Returns the text direction of the language.
 */
-#ifndef QT_NO_DATESTRING
-QTime QLocale::toTime(const QString &string, FormatType format) const
+Qt::LayoutDirection QLocale::textDirection() const
 {
-    return toTime(string, timeFormat(format));
-}
-#endif
-
-/*!
-    \since 4.4
-
-    Parses the date string given in \a string and returns the
-    date. The format of the date string is chosen according to the
-    \a format parameter (see dateFormat()).
-
-    If the date could not be parsed, returns an invalid date.
+    Language lang = language();
+    if (lang == QLocale::Arabic ||
+        lang == QLocale::Hebrew ||
+        lang == QLocale::Persian ||
+        lang == QLocale::Urdu ||
+        lang == QLocale::Syriac)
+        return Qt::RightToLeft;
 
-    \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
-*/
-#ifndef QT_NO_DATESTRING
-QDate QLocale::toDate(const QString &string, FormatType format) const
-{
-    return toDate(string, dateFormat(format));
+    return Qt::LeftToRight;
 }
-#endif
-
-/*!
-    \since 4.4
-
-    Parses the date/time string given in \a string and returns the
-    time. The format of the date/time string is chosen according to the
-    \a format parameter (see dateTimeFormat()).
-
-    If the string could not be parsed, returns an invalid QDateTime.
 
-    \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
-*/
-
-#ifndef QT_NO_DATESTRING
-QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
-{
-    return toDateTime(string, dateTimeFormat(format));
-}
-#endif
 
 /*!
-    \since 4.4
-
-    Parses the time string given in \a string and returns the
-    time. See QTime::fromString() for information on what is a valid
-    format string.
+    \since 4.5
 
-    If the time could not be parsed, returns an invalid time.
+    Returns the localized name of the "AM" suffix for times specified using
+    the conventions of the 12-hour clock.
 
-    \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
+    \sa pmText()
 */
-#ifndef QT_NO_DATESTRING
-QTime QLocale::toTime(const QString &string, const QString &format) const
+QString QLocale::amText() const
 {
-    QTime time;
-#ifndef QT_BOOTSTRAPPED
-    QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString);
-    dt.defaultLocale = *this;
-    if (dt.parseFormat(format))
-        dt.fromString(string, 0, &time);
-#else
-    Q_UNUSED(string);
-    Q_UNUSED(format);
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::AMText, QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
 #endif
-    return time;
+    return getLocaleData(am_data + d()->m_am_idx, d()->m_am_size);
 }
-#endif
 
 /*!
-    \since 4.4
-
-    Parses the date string given in \a string and returns the
-    date. See QDate::fromString() for information on the expressions
-    that can be used with this function.
-
-    This function searches month names and the names of the days of
-    the week in the current locale.
+    \since 4.5
 
-    If the date could not be parsed, returns an invalid date.
+    Returns the localized name of the "PM" suffix for times specified using
+    the conventions of the 12-hour clock.
 
-    \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
+    \sa amText()
 */
-#ifndef QT_NO_DATESTRING
-QDate QLocale::toDate(const QString &string, const QString &format) const
+QString QLocale::pmText() const
 {
-    QDate date;
-#ifndef QT_BOOTSTRAPPED
-    QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString);
-    dt.defaultLocale = *this;
-    if (dt.parseFormat(format))
-        dt.fromString(string, &date, 0);
-#else
-    Q_UNUSED(string);
-    Q_UNUSED(format);
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::PMText, QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
 #endif
-    return date;
+    return getLocaleData(pm_data + d()->m_pm_idx, d()->m_pm_size);
 }
-#endif
-
-/*!
-    \since 4.4
-
-    Parses the date/time string given in \a string and returns the
-    time.  See QDateTime::fromString() for information on the expressions
-    that can be used with this function.
-
-    \note The month and day names used must be given in the user's local
-    language.
 
-    If the string could not be parsed, returns an invalid QDateTime.
 
-    \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
-*/
-#ifndef QT_NO_DATESTRING
-QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
+QString QLocalePrivate::dateTimeToString(const QString &format, const QDate *date, const QTime *time,
+                                         const QLocale *q) const
 {
-#ifndef QT_BOOTSTRAPPED
-    QTime time;
-    QDate date;
+    Q_ASSERT(date || time);
+    if ((date && !date->isValid()) || (time && !time->isValid()))
+        return QString();
+    const bool format_am_pm = time && timeFormatContainsAP(format);
 
-    QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString);
-    dt.defaultLocale = *this;
-    if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
-        return QDateTime(date, time);
-#else
-    Q_UNUSED(string);
-    Q_UNUSED(format);
-#endif
-    return QDateTime(QDate(), QTime(-1, -1, -1));
-}
-#endif
+    enum { AM, PM } am_pm = AM;
+    int hour12 = time ? time->hour() : -1;
+    if (time) {
+        if (hour12 == 0) {
+            am_pm = AM;
+            hour12 = 12;
+        } else if (hour12 < 12) {
+            am_pm = AM;
+        } else if (hour12 == 12) {
+            am_pm = PM;
+        } else {
+            am_pm = PM;
+            hour12 -= 12;
+        }
+    }
 
+    QString result;
 
-/*!
-    \since 4.1
+    int i = 0;
+    while (i < format.size()) {
+        if (format.at(i).unicode() == '\'') {
+            result.append(readEscapedFormatString(format, &i));
+            continue;
+        }
 
-    Returns the decimal point character of this locale.
-*/
-QChar QLocale::decimalPoint() const
-{
-    return d()->decimal();
-}
+        const QChar c = format.at(i);
+        int repeat = repeatCount(format, i);
+        bool used = false;
+        if (date) {
+            switch (c.unicode()) {
+            case 'y':
+                used = true;
+                if (repeat >= 4)
+                    repeat = 4;
+                else if (repeat >= 2)
+                    repeat = 2;
 
-/*!
-    \since 4.1
+                switch (repeat) {
+                case 4:
+                    result.append(longLongToString(date->year()));
+                    break;
+                case 2:
+                    result.append(longLongToString(date->year() % 100, -1, 10, 2,
+                                                   QLocalePrivate::ZeroPadded));
+                    break;
+                default:
+                    repeat = 1;
+                    result.append(c);
+                    break;
+                }
+                break;
 
-    Returns the group separator character of this locale.
-*/
-QChar QLocale::groupSeparator() const
-{
-    return d()->group();
-}
+            case 'M':
+                used = true;
+                repeat = qMin(repeat, 4);
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(date->month()));
+                    break;
+                case 2:
+                    result.append(longLongToString(date->month(), -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                case 3:
+                    result.append(q->monthName(date->month(), QLocale::ShortFormat));
+                    break;
+                case 4:
+                    result.append(q->monthName(date->month(), QLocale::LongFormat));
+                    break;
+                }
+                break;
 
-/*!
-    \since 4.1
+            case 'd':
+                used = true;
+                repeat = qMin(repeat, 4);
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(date->day()));
+                    break;
+                case 2:
+                    result.append(longLongToString(date->day(), -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                case 3:
+                    result.append(q->dayName(date->dayOfWeek(), QLocale::ShortFormat));
+                    break;
+                case 4:
+                    result.append(q->dayName(date->dayOfWeek(), QLocale::LongFormat));
+                    break;
+                }
+                break;
 
-    Returns the percent character of this locale.
-*/
-QChar QLocale::percent() const
-{
-    return d()->percent();
-}
-
-/*!
-    \since 4.1
+            default:
+                break;
+            }
+        }
+        if (!used && time) {
+            switch (c.unicode()) {
+            case 'h': {
+                used = true;
+                repeat = qMin(repeat, 2);
+                const int hour = format_am_pm ? hour12 : time->hour();
 
-    Returns the zero digit character of this locale.
-*/
-QChar QLocale::zeroDigit() const
-{
-    return d()->zero();
-}
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(hour));
+                    break;
+                case 2:
+                    result.append(longLongToString(hour, -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                }
+                break;
+            }
+            case 'H':
+                used = true;
+                repeat = qMin(repeat, 2);
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(time->hour()));
+                    break;
+                case 2:
+                    result.append(longLongToString(time->hour(), -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                }
+                break;
 
-/*!
-    \since 4.1
+            case 'm':
+                used = true;
+                repeat = qMin(repeat, 2);
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(time->minute()));
+                    break;
+                case 2:
+                    result.append(longLongToString(time->minute(), -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                }
+                break;
 
-    Returns the negative sign character of this locale.
-*/
-QChar QLocale::negativeSign() const
-{
-    return d()->minus();
-}
+            case 's':
+                used = true;
+                repeat = qMin(repeat, 2);
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(time->second()));
+                    break;
+                case 2:
+                    result.append(longLongToString(time->second(), -1, 10, 2, QLocalePrivate::ZeroPadded));
+                    break;
+                }
+                break;
 
-/*!
-    \since 4.5
+            case 'a':
+                used = true;
+                if (i + 1 < format.length() && format.at(i + 1).unicode() == 'p') {
+                    repeat = 2;
+                } else {
+                    repeat = 1;
+                }
+                result.append(am_pm == AM ? QLatin1String("am") : QLatin1String("pm"));
+                break;
 
-    Returns the positive sign character of this locale.
-*/
-QChar QLocale::positiveSign() const
-{
-    return d()->plus();
-}
+            case 'A':
+                used = true;
+                if (i + 1 < format.length() && format.at(i + 1).unicode() == 'P') {
+                    repeat = 2;
+                } else {
+                    repeat = 1;
+                }
+                result.append(am_pm == AM ? QLatin1String("AM") : QLatin1String("PM"));
+                break;
 
-/*!
-    \since 4.1
+            case 'z':
+                used = true;
+                if (repeat >= 3) {
+                    repeat = 3;
+                } else {
+                    repeat = 1;
+                }
+                switch (repeat) {
+                case 1:
+                    result.append(longLongToString(time->msec()));
+                    break;
+                case 3:
+                    result.append(longLongToString(time->msec(), -1, 10, 3, QLocalePrivate::ZeroPadded));
+                    break;
+                }
+                break;
 
-    Returns the exponential character of this locale.
-*/
-QChar QLocale::exponential() const
-{
-    return d()->exponential();
-}
+            case 't':
+                used = true;
+                repeat = 1;
+                result.append(timeZone());
+                break;
+            default:
+                break;
+            }
+        }
+        if (!used) {
+            result.append(QString(repeat, c));
+        }
+        i += repeat;
+    }
 
-static bool qIsUpper(char c)
-{
-    return c >= 'A' && c <= 'Z';
+    return result;
 }
 
-static char qToLower(char c)
+QString QLocalePrivate::doubleToString(double d,
+                                       int precision,
+                                       DoubleForm form,
+                                       int width,
+                                       unsigned flags) const
 {
-    if (c >= 'A' && c <= 'Z')
-        return c - 'A' + 'a';
-    else
-        return c;
+    return QLocalePrivate::doubleToString(zero(), plus(), minus(), exponential(),
+                                          group(), decimal(),
+                                          d, precision, form, width, flags);
 }
 
-/*!
-    \overload
-
-    \a f and \a prec have the same meaning as in QString::number(double, char, int).
-
-    \sa toDouble()
-*/
-
-QString QLocale::toString(double i, char f, int prec) const
+QString QLocalePrivate::doubleToString(const QChar _zero, const QChar plus, const QChar minus,
+                                       const QChar exponential, const QChar group, const QChar decimal,
+                                       double d,
+                                       int precision,
+                                       DoubleForm form,
+                                       int width,
+                                       unsigned flags)
 {
-    QLocalePrivate::DoubleForm form = QLocalePrivate::DFDecimal;
-    uint flags = 0;
+    if (precision == -1)
+        precision = 6;
+    if (width == -1)
+        width = 0;
 
-    if (qIsUpper(f))
-        flags = QLocalePrivate::CapitalEorX;
-    f = qToLower(f);
+    bool negative = false;
+    bool special_number = false; // nan, +/-inf
+    QString num_str;
 
-    switch (f) {
-        case 'f':
-            form = QLocalePrivate::DFDecimal;
-            break;
-        case 'e':
-            form = QLocalePrivate::DFExponent;
-            break;
-        case 'g':
-            form = QLocalePrivate::DFSignificantDigits;
-            break;
-        default:
-            break;
+    // Detect special numbers (nan, +/-inf)
+    if (qt_is_inf(d)) {
+        num_str = QString::fromLatin1("inf");
+        special_number = true;
+        negative = d < 0;
+    } else if (qt_is_nan(d)) {
+        num_str = QString::fromLatin1("nan");
+        special_number = true;
     }
 
-    if (!(p.numberOptions & OmitGroupSeparator))
-        flags |= QLocalePrivate::ThousandsGroup;
-    return d()->doubleToString(i, prec, form, -1, flags);
-}
-
-/*!
-    \fn QLocale QLocale::c()
-
-    Returns a QLocale object initialized to the "C" locale.
+    // Handle normal numbers
+    if (!special_number) {
+        int decpt, sign;
+        QString digits;
 
-    \sa system()
-*/
+#ifdef QT_QLOCALE_USES_FCVT
+        // NOT thread safe!
+        if (form == DFDecimal) {
+            digits = QLatin1String(fcvt(d, precision, &decpt, &sign));
+        } else {
+            int pr = precision;
+            if (form == DFExponent)
+                ++pr;
+            else if (form == DFSignificantDigits && pr == 0)
+                pr = 1;
+            digits = QLatin1String(ecvt(d, pr, &decpt, &sign));
 
-/*!
-    Returns a QLocale object initialized to the system locale.
+            // Chop trailing zeros
+            if (digits.length() > 0) {
+                int last_nonzero_idx = digits.length() - 1;
+                while (last_nonzero_idx > 0
+                       && digits.unicode()[last_nonzero_idx] == QLatin1Char('0'))
+                    --last_nonzero_idx;
+                digits.truncate(last_nonzero_idx + 1);
+            }
 
-    On Windows and Mac, this locale will use the decimal/grouping characters and date/time
-    formats specified in the system configuration panel.
+        }
 
-    \sa c()
-*/
+#else
+        int mode;
+        if (form == DFDecimal)
+            mode = 3;
+        else
+            mode = 2;
 
-QLocale QLocale::system()
-{
-    QLocale result(C);
-    result.p.index = localePrivateIndex(systemPrivate());
-    return result;
-}
-
-/*!
-    \since 4.3
-
-    Returns the list of countries that have entires for \a language in Qt's locale
-    database. If the result is an empty list, then \a language is not represented in
-    Qt's locale database.
-*/
-QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
-{
-    QList<Country> result;
-
-    unsigned language_id = language;
-    uint idx = locale_index[language_id];
-
-    if (language == C) {
-        result << AnyCountry;
-        return result;
-    }
-
-    const QLocalePrivate *d = locale_data + idx;
-
-    while (d->languageId() == language_id) {
-        result << static_cast<Country>(d->countryId());
-        ++d;
-    }
-
-    return result;
-}
-
-/*!
-    \since 4.2
-
-    Returns the localized name of \a month, in the format specified
-    by \a type.
-
-    \sa dayName(), standaloneMonthName()
-*/
-QString QLocale::monthName(int month, FormatType type) const
-{
-    if (month < 1 || month > 12)
-        return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(type == LongFormat
-                                             ? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
-                                             month);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-
-    quint32 idx, size;
-    switch (type) {
-    case QLocale::LongFormat:
-        idx = d()->m_long_month_names_idx;
-        size = d()->m_long_month_names_size;
-        break;
-    case QLocale::ShortFormat:
-        idx = d()->m_short_month_names_idx;
-        size = d()->m_short_month_names_size;
-        break;
-    case QLocale::NarrowFormat:
-        idx = d()->m_narrow_month_names_idx;
-        size = d()->m_narrow_month_names_size;
-        break;
-    default:
-        return QString();
-    }
-    return getLocaleListData(months_data + idx, size, month - 1);
-}
-
-/*!
-    \since 4.5
-
-    Returns the localized name of \a month that is used as a
-    standalone text, in the format specified by \a type.
-
-    If the locale information doesn't specify the standalone month
-    name then return value is the same as in monthName().
-
-    \sa monthName(), standaloneDayName()
-*/
-QString QLocale::standaloneMonthName(int month, FormatType type) const
-{
-    if (month < 1 || month > 12)
-        return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(type == LongFormat
-                                             ? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
-                                             month);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-
-    quint32 idx, size;
-    switch (type) {
-    case QLocale::LongFormat:
-        idx = d()->m_standalone_long_month_names_idx;
-        size = d()->m_standalone_long_month_names_size;
-        break;
-    case QLocale::ShortFormat:
-        idx = d()->m_standalone_short_month_names_idx;
-        size = d()->m_standalone_short_month_names_size;
-        break;
-    case QLocale::NarrowFormat:
-        idx = d()->m_standalone_narrow_month_names_idx;
-        size = d()->m_standalone_narrow_month_names_size;
-        break;
-    default:
-        return QString();
-    }
-    QString name = getLocaleListData(standalone_months_data + idx, size, month - 1);
-    if (name.isEmpty())
-        return monthName(month, type);
-    return name;
-}
-
-/*!
-    \since 4.2
-
-    Returns the localized name of the \a day (where 1 represents
-    Monday, 2 represents Tuesday and so on), in the format specified
-    by \a type.
-
-    \sa monthName(), standaloneDayName()
-*/
-QString QLocale::dayName(int day, FormatType type) const
-{
-    if (day < 1 || day > 7)
-        return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(type == LongFormat
-                                             ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
-                                             day);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    if (day == 7)
-        day = 0;
-
-    quint32 idx, size;
-    switch (type) {
-    case QLocale::LongFormat:
-        idx = d()->m_long_day_names_idx;
-        size = d()->m_long_day_names_size;
-        break;
-    case QLocale::ShortFormat:
-        idx = d()->m_short_day_names_idx;
-        size = d()->m_short_day_names_size;
-        break;
-    case QLocale::NarrowFormat:
-        idx = d()->m_narrow_day_names_idx;
-        size = d()->m_narrow_day_names_size;
-        break;
-    default:
-        return QString();
-    }
-    return getLocaleListData(days_data + idx, size, day);
-}
-
-/*!
-    \since 4.5
-
-    Returns the localized name of the \a day (where 1 represents
-    Monday, 2 represents Tuesday and so on) that is used as a
-    standalone text, in the format specified by \a type.
-
-    If the locale information does not specify the standalone day
-    name then return value is the same as in dayName().
-
-    \sa dayName(), standaloneMonthName()
-*/
-QString QLocale::standaloneDayName(int day, FormatType type) const
-{
-    if (day < 1 || day > 7)
-        return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(type == LongFormat
-                                             ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
-                                             day);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    if (day == 7)
-        day = 0;
-
-    quint32 idx, size;
-    switch (type) {
-    case QLocale::LongFormat:
-        idx = d()->m_standalone_long_day_names_idx;
-        size = d()->m_standalone_long_day_names_size;
-        break;
-    case QLocale::ShortFormat:
-        idx = d()->m_standalone_short_day_names_idx;
-        size = d()->m_standalone_short_day_names_size;
-        break;
-    case QLocale::NarrowFormat:
-        idx = d()->m_standalone_narrow_day_names_idx;
-        size = d()->m_standalone_narrow_day_names_size;
-        break;
-    default:
-        return QString();
-    }
-    QString name = getLocaleListData(days_data + idx, size, day);
-    if (name.isEmpty())
-        return dayName(day == 0 ? 7 : day, type);
-    return name;
-}
-
-/*!
-    \since 4.8
-
-    Returns the first day of the week according to the current locale.
-*/
-Qt::DayOfWeek QLocale::firstDayOfWeek() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
-        if (!res.isNull())
-            return static_cast<Qt::DayOfWeek>(res.toUInt());
-    }
-#endif
-    return static_cast<Qt::DayOfWeek>(d()->m_first_day_of_week);
-}
-
-/*!
-    \since 4.4
-
-    Returns the measurement system for the locale.
-*/
-QLocale::MeasurementSystem QLocale::measurementSystem() const
-{
-    MeasurementSystem meas = MetricSystem;
-    bool found = false;
-
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
-        if (!res.isNull()) {
-            meas = MeasurementSystem(res.toInt());
-            found = true;
-        }
-    }
-#endif
-
-    if (!found) {
-        meas = d()->measurementSystem();
-        found = true;
-    }
-
-    return meas;
-}
-
-/*!
-  \since 4.7
-
-  Returns the text direction of the language.
-*/
-Qt::LayoutDirection QLocale::textDirection() const
-{
-    Language lang = language();
-    if (lang == QLocale::Arabic ||
-        lang == QLocale::Hebrew ||
-        lang == QLocale::Persian ||
-        lang == QLocale::Urdu ||
-        lang == QLocale::Syriac)
-        return Qt::RightToLeft;
-
-    return Qt::LeftToRight;
-}
-
-
-/*!
-    \since 4.5
-
-    Returns the localized name of the "AM" suffix for times specified using
-    the conventions of the 12-hour clock.
-
-    \sa pmText()
-*/
-QString QLocale::amText() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::AMText, QVariant());
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    return getLocaleData(am_data + d()->m_am_idx, d()->m_am_size);
-}
-
-/*!
-    \since 4.5
-
-    Returns the localized name of the "PM" suffix for times specified using
-    the conventions of the 12-hour clock.
-
-    \sa amText()
-*/
-QString QLocale::pmText() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::PMText, QVariant());
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    return getLocaleData(pm_data + d()->m_pm_idx, d()->m_pm_size);
-}
-
-
-/*!
-\fn QString QLocale::toString(short i) const
-
-\overload
-
-\sa toShort()
-*/
-
-/*!
-\fn QString QLocale::toString(ushort i) const
-
-\overload
-
-\sa toUShort()
-*/
-
-/*!
-\fn QString QLocale::toString(int i) const
-
-\overload
-
-\sa toInt()
-*/
-
-/*!
-\fn QString QLocale::toString(uint i) const
-
-\overload
-
-\sa toUInt()
-*/
-
-/*
-\fn QString QLocale::toString(long i) const
-
-\overload
-
-\sa  toLong()
-*/
-
-/*
-\fn QString QLocale::toString(ulong i) const
-
-\overload
-
-\sa toULong()
-*/
-
-/*!
-\fn QString QLocale::toString(float i, char f = 'g', int prec = 6) const
-
-\overload
-
-\a f and \a prec have the same meaning as in QString::number(double, char, int).
-
-\sa toDouble()
-*/
-
-
-static QString qulltoa(qulonglong l, int base, const QChar _zero)
-{
-    ushort buff[65]; // length of MAX_ULLONG in base 2
-    ushort *p = buff + 65;
-
-    if (base != 10 || _zero.unicode() == '0') {
-        while (l != 0) {
-            int c = l % base;
-
-            --p;
-
-            if (c < 10)
-                *p = '0' + c;
-            else
-                *p = c - 10 + 'a';
-
-            l /= base;
-        }
-    }
-    else {
-        while (l != 0) {
-            int c = l % base;
-
-            *(--p) = _zero.unicode() + c;
-
-            l /= base;
-        }
-    }
-
-    return QString(reinterpret_cast<QChar *>(p), 65 - (p - buff));
-}
-
-static QString qlltoa(qlonglong l, int base, const QChar zero)
-{
-    return qulltoa(l < 0 ? -l : l, base, zero);
-}
-
-enum PrecisionMode {
-    PMDecimalDigits =             0x01,
-    PMSignificantDigits =   0x02,
-    PMChopTrailingZeros =   0x03
-};
-
-static QString &decimalForm(QChar zero, QChar decimal, QChar group,
-                            QString &digits, int decpt, uint precision,
-                            PrecisionMode pm,
-                            bool always_show_decpt,
-                            bool thousands_group)
-{
-    if (decpt < 0) {
-        for (int i = 0; i < -decpt; ++i)
-            digits.prepend(zero);
-        decpt = 0;
-    }
-    else if (decpt > digits.length()) {
-        for (int i = digits.length(); i < decpt; ++i)
-            digits.append(zero);
-    }
-
-    if (pm == PMDecimalDigits) {
-        uint decimal_digits = digits.length() - decpt;
-        for (uint i = decimal_digits; i < precision; ++i)
-            digits.append(zero);
-    }
-    else if (pm == PMSignificantDigits) {
-        for (uint i = digits.length(); i < precision; ++i)
-            digits.append(zero);
-    }
-    else { // pm == PMChopTrailingZeros
-    }
-
-    if (always_show_decpt || decpt < digits.length())
-        digits.insert(decpt, decimal);
-
-    if (thousands_group) {
-        for (int i = decpt - 3; i > 0; i -= 3)
-            digits.insert(i, group);
-    }
-
-    if (decpt == 0)
-        digits.prepend(zero);
-
-    return digits;
-}
-
-static QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
-                             QChar group, QChar plus, QChar minus,
-                             QString &digits, int decpt, uint precision,
-                             PrecisionMode pm,
-                             bool always_show_decpt)
-{
-    int exp = decpt - 1;
-
-    if (pm == PMDecimalDigits) {
-        for (uint i = digits.length(); i < precision + 1; ++i)
-            digits.append(zero);
-    }
-    else if (pm == PMSignificantDigits) {
-        for (uint i = digits.length(); i < precision; ++i)
-            digits.append(zero);
-    }
-    else { // pm == PMChopTrailingZeros
-    }
-
-    if (always_show_decpt || digits.length() > 1)
-        digits.insert(1, decimal);
-
-    digits.append(exponential);
-    digits.append(QLocalePrivate::longLongToString(zero, group, plus, minus,
-                   exp, 2, 10, -1, QLocalePrivate::AlwaysShowSign));
-
-    return digits;
-}
-
-static bool isZero(double d)
-{
-    uchar *ch = (uchar *)&d;
-#ifdef QT_ARMFPA
-        return !(ch[3] & 0x7F || ch[2] || ch[1] || ch[0] || ch[7] || ch[6] || ch[5] || ch[4]);
-#else
-    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
-        return !(ch[0] & 0x7F || ch[1] || ch[2] || ch[3] || ch[4] || ch[5] || ch[6] || ch[7]);
-    } else {
-        return !(ch[7] & 0x7F || ch[6] || ch[5] || ch[4] || ch[3] || ch[2] || ch[1] || ch[0]);
-    }
-#endif
-}
-
-QString QLocalePrivate::dateTimeToString(const QString &format, const QDate *date, const QTime *time,
-                                         const QLocale *q) const
-{
-    Q_ASSERT(date || time);
-    if ((date && !date->isValid()) || (time && !time->isValid()))
-        return QString();
-    const bool format_am_pm = time && timeFormatContainsAP(format);
-
-    enum { AM, PM } am_pm = AM;
-    int hour12 = time ? time->hour() : -1;
-    if (time) {
-        if (hour12 == 0) {
-            am_pm = AM;
-            hour12 = 12;
-        } else if (hour12 < 12) {
-            am_pm = AM;
-        } else if (hour12 == 12) {
-            am_pm = PM;
-        } else {
-            am_pm = PM;
-            hour12 -= 12;
-        }
-    }
-
-    QString result;
-
-    int i = 0;
-    while (i < format.size()) {
-        if (format.at(i).unicode() == '\'') {
-            result.append(readEscapedFormatString(format, &i));
-            continue;
-        }
-
-        const QChar c = format.at(i);
-        int repeat = repeatCount(format, i);
-        bool used = false;
-        if (date) {
-            switch (c.unicode()) {
-            case 'y':
-                used = true;
-                if (repeat >= 4)
-                    repeat = 4;
-                else if (repeat >= 2)
-                    repeat = 2;
-
-                switch (repeat) {
-                case 4:
-                    result.append(longLongToString(date->year()));
-                    break;
-                case 2:
-                    result.append(longLongToString(date->year() % 100, -1, 10, 2,
-                                                   QLocalePrivate::ZeroPadded));
-                    break;
-                default:
-                    repeat = 1;
-                    result.append(c);
-                    break;
-                }
-                break;
-
-            case 'M':
-                used = true;
-                repeat = qMin(repeat, 4);
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(date->month()));
-                    break;
-                case 2:
-                    result.append(longLongToString(date->month(), -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                case 3:
-                    result.append(q->monthName(date->month(), QLocale::ShortFormat));
-                    break;
-                case 4:
-                    result.append(q->monthName(date->month(), QLocale::LongFormat));
-                    break;
-                }
-                break;
-
-            case 'd':
-                used = true;
-                repeat = qMin(repeat, 4);
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(date->day()));
-                    break;
-                case 2:
-                    result.append(longLongToString(date->day(), -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                case 3:
-                    result.append(q->dayName(date->dayOfWeek(), QLocale::ShortFormat));
-                    break;
-                case 4:
-                    result.append(q->dayName(date->dayOfWeek(), QLocale::LongFormat));
-                    break;
-                }
-                break;
-
-            default:
-                break;
-            }
-        }
-        if (!used && time) {
-            switch (c.unicode()) {
-            case 'h': {
-                used = true;
-                repeat = qMin(repeat, 2);
-                const int hour = format_am_pm ? hour12 : time->hour();
-
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(hour));
-                    break;
-                case 2:
-                    result.append(longLongToString(hour, -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                }
-                break;
-            }
-            case 'H':
-                used = true;
-                repeat = qMin(repeat, 2);
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(time->hour()));
-                    break;
-                case 2:
-                    result.append(longLongToString(time->hour(), -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                }
-                break;
-
-            case 'm':
-                used = true;
-                repeat = qMin(repeat, 2);
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(time->minute()));
-                    break;
-                case 2:
-                    result.append(longLongToString(time->minute(), -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                }
-                break;
-
-            case 's':
-                used = true;
-                repeat = qMin(repeat, 2);
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(time->second()));
-                    break;
-                case 2:
-                    result.append(longLongToString(time->second(), -1, 10, 2, QLocalePrivate::ZeroPadded));
-                    break;
-                }
-                break;
-
-            case 'a':
-                used = true;
-                if (i + 1 < format.length() && format.at(i + 1).unicode() == 'p') {
-                    repeat = 2;
-                } else {
-                    repeat = 1;
-                }
-                result.append(am_pm == AM ? QLatin1String("am") : QLatin1String("pm"));
-                break;
-
-            case 'A':
-                used = true;
-                if (i + 1 < format.length() && format.at(i + 1).unicode() == 'P') {
-                    repeat = 2;
-                } else {
-                    repeat = 1;
-                }
-                result.append(am_pm == AM ? QLatin1String("AM") : QLatin1String("PM"));
-                break;
-
-            case 'z':
-                used = true;
-                if (repeat >= 3) {
-                    repeat = 3;
-                } else {
-                    repeat = 1;
-                }
-                switch (repeat) {
-                case 1:
-                    result.append(longLongToString(time->msec()));
-                    break;
-                case 3:
-                    result.append(longLongToString(time->msec(), -1, 10, 3, QLocalePrivate::ZeroPadded));
-                    break;
-                }
-                break;
-
-            case 't':
-                used = true;
-                repeat = 1;
-                result.append(timeZone());
-                break;
-            default:
-                break;
-            }
-        }
-        if (!used) {
-            result.append(QString(repeat, c));
-        }
-        i += repeat;
-    }
-
-    return result;
-}
-
-QString QLocalePrivate::doubleToString(double d,
-                                       int precision,
-                                       DoubleForm form,
-                                       int width,
-                                       unsigned flags) const
-{
-    return QLocalePrivate::doubleToString(zero(), plus(), minus(), exponential(),
-                                          group(), decimal(),
-                                          d, precision, form, width, flags);
-}
-
-QString QLocalePrivate::doubleToString(const QChar _zero, const QChar plus, const QChar minus,
-                                       const QChar exponential, const QChar group, const QChar decimal,
-                                       double d,
-                                       int precision,
-                                       DoubleForm form,
-                                       int width,
-                                       unsigned flags)
-{
-    if (precision == -1)
-        precision = 6;
-    if (width == -1)
-        width = 0;
-
-    bool negative = false;
-    bool special_number = false; // nan, +/-inf
-    QString num_str;
-
-    // Detect special numbers (nan, +/-inf)
-    if (qt_is_inf(d)) {
-        num_str = QString::fromLatin1("inf");
-        special_number = true;
-        negative = d < 0;
-    } else if (qt_is_nan(d)) {
-        num_str = QString::fromLatin1("nan");
-        special_number = true;
-    }
-
-    // Handle normal numbers
-    if (!special_number) {
-        int decpt, sign;
-        QString digits;
-
-#ifdef QT_QLOCALE_USES_FCVT
-        // NOT thread safe!
-        if (form == DFDecimal) {
-            digits = QLatin1String(fcvt(d, precision, &decpt, &sign));
-        } else {
-            int pr = precision;
-            if (form == DFExponent)
-                ++pr;
-            else if (form == DFSignificantDigits && pr == 0)
-                pr = 1;
-            digits = QLatin1String(ecvt(d, pr, &decpt, &sign));
-
-            // Chop trailing zeros
-            if (digits.length() > 0) {
-                int last_nonzero_idx = digits.length() - 1;
-                while (last_nonzero_idx > 0
-                       && digits.unicode()[last_nonzero_idx] == QLatin1Char('0'))
-                    --last_nonzero_idx;
-                digits.truncate(last_nonzero_idx + 1);
-            }
-
-        }
-
-#else
-        int mode;
-        if (form == DFDecimal)
-            mode = 3;
-        else
-            mode = 2;
-
-        /* This next bit is a bit quirky. In DFExponent form, the precision
-           is the number of digits after decpt. So that would suggest using
-           mode=3 for qdtoa. But qdtoa behaves strangely when mode=3 and
-           precision=0. So we get around this by using mode=2 and reasoning
-           that we want precision+1 significant digits, since the decimal
-           point in this mode is always after the first digit. */
-        int pr = precision;
-        if (form == DFExponent)
-            ++pr;
-
-        char *rve = 0;
-        char *buff = 0;
-        QT_TRY {
-            digits = QLatin1String(qdtoa(d, mode, pr, &decpt, &sign, &rve, &buff));
-        } QT_CATCH(...) {
-            if (buff != 0)
-                free(buff);
-            QT_RETHROW;
-        }
-        if (buff != 0)
-            free(buff);
-#endif // QT_QLOCALE_USES_FCVT
-
-        if (_zero.unicode() != '0') {
-            ushort z = _zero.unicode() - '0';
-            for (int i = 0; i < digits.length(); ++i)
-                reinterpret_cast<ushort *>(digits.data())[i] += z;
-        }
-
-        bool always_show_decpt = (flags & Alternate || flags & ForcePoint);
-        switch (form) {
-            case DFExponent: {
-                num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
-                                       digits, decpt, precision, PMDecimalDigits,
-                                       always_show_decpt);
-                break;
-            }
-            case DFDecimal: {
-                num_str = decimalForm(_zero, decimal, group,
-                                      digits, decpt, precision, PMDecimalDigits,
-                                      always_show_decpt, flags & ThousandsGroup);
-                break;
-            }
-            case DFSignificantDigits: {
-                PrecisionMode mode = (flags & Alternate) ?
-                            PMSignificantDigits : PMChopTrailingZeros;
-
-                if (decpt != digits.length() && (decpt <= -4 || decpt > precision))
-                    num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
-                                           digits, decpt, precision, mode,
-                                           always_show_decpt);
-                else
-                    num_str = decimalForm(_zero, decimal, group,
-                                          digits, decpt, precision, mode,
-                                          always_show_decpt, flags & ThousandsGroup);
-                break;
-            }
-        }
-
-        negative = sign != 0 && !isZero(d);
-    }
-
-    // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
-    // pad special numbers
-    if (flags & QLocalePrivate::ZeroPadded
-            && !(flags & QLocalePrivate::LeftAdjusted)
-            && !special_number) {
-        int num_pad_chars = width - num_str.length();
-        // leave space for the sign
-        if (negative
-                || flags & QLocalePrivate::AlwaysShowSign
-                || flags & QLocalePrivate::BlankBeforePositive)
-            --num_pad_chars;
-
-        for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(_zero);
-    }
-
-    // add sign
-    if (negative)
-        num_str.prepend(minus);
-    else if (flags & QLocalePrivate::AlwaysShowSign)
-        num_str.prepend(plus);
-    else if (flags & QLocalePrivate::BlankBeforePositive)
-        num_str.prepend(QLatin1Char(' '));
-
-    if (flags & QLocalePrivate::CapitalEorX)
-        num_str = num_str.toUpper();
-
-    return num_str;
-}
-
-QString QLocalePrivate::longLongToString(qlonglong l, int precision,
-                                            int base, int width,
-                                            unsigned flags) const
-{
-    return QLocalePrivate::longLongToString(zero(), group(), plus(), minus(),
-                                            l, precision, base, width, flags);
-}
-
-QString QLocalePrivate::longLongToString(const QChar zero, const QChar group,
-                                         const QChar plus, const QChar minus,
-                                         qlonglong l, int precision,
-                                         int base, int width,
-                                         unsigned flags)
-{
-    bool precision_not_specified = false;
-    if (precision == -1) {
-        precision_not_specified = true;
-        precision = 1;
-    }
-
-    bool negative = l < 0;
-    if (base != 10) {
-        // these are not supported by sprintf for octal and hex
-        flags &= ~AlwaysShowSign;
-        flags &= ~BlankBeforePositive;
-        negative = false; // neither are negative numbers
-    }
-
-    QString num_str;
-    if (base == 10)
-        num_str = qlltoa(l, base, zero);
-    else
-        num_str = qulltoa(l, base, zero);
-
-    uint cnt_thousand_sep = 0;
-    if (flags & ThousandsGroup && base == 10) {
-        for (int i = num_str.length() - 3; i > 0; i -= 3) {
-            num_str.insert(i, group);
-            ++cnt_thousand_sep;
-        }
-    }
-
-    for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
-        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
-
-    if ((flags & Alternate || flags & ShowBase)
-            && base == 8
-            && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
-        num_str.prepend(QLatin1Char('0'));
-
-    // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
-    // when precision is not specified in the format string
-    bool zero_padded = flags & ZeroPadded
-                        && !(flags & LeftAdjusted)
-                        && precision_not_specified;
-
-    if (zero_padded) {
-        int num_pad_chars = width - num_str.length();
-
-        // leave space for the sign
-        if (negative
-                || flags & AlwaysShowSign
-                || flags & BlankBeforePositive)
-            --num_pad_chars;
-
-        // leave space for optional '0x' in hex form
-        if (base == 16 && (flags & Alternate || flags & ShowBase))
-            num_pad_chars -= 2;
-        // leave space for optional '0b' in binary form
-        else if (base == 2 && (flags & Alternate || flags & ShowBase))
-            num_pad_chars -= 2;
-
-        for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
-    }
-
-    if (flags & CapitalEorX)
-        num_str = num_str.toUpper();
-
-    if (base == 16 && (flags & Alternate || flags & ShowBase))
-        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
-    if (base == 2 && (flags & Alternate || flags & ShowBase))
-        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
-
-    // add sign
-    if (negative)
-        num_str.prepend(minus);
-    else if (flags & AlwaysShowSign)
-        num_str.prepend(plus);
-    else if (flags & BlankBeforePositive)
-        num_str.prepend(QLatin1Char(' '));
-
-    return num_str;
-}
-
-QString QLocalePrivate::unsLongLongToString(qulonglong l, int precision,
-                                            int base, int width,
-                                            unsigned flags) const
-{
-    return QLocalePrivate::unsLongLongToString(zero(), group(), plus(),
-                                               l, precision, base, width, flags);
-}
-
-QString QLocalePrivate::unsLongLongToString(const QChar zero, const QChar group,
-                                            const QChar plus,
-                                            qulonglong l, int precision,
-                                            int base, int width,
-                                            unsigned flags)
-{
-    bool precision_not_specified = false;
-    if (precision == -1) {
-        precision_not_specified = true;
-        precision = 1;
-    }
-
-    QString num_str = qulltoa(l, base, zero);
-
-    uint cnt_thousand_sep = 0;
-    if (flags & ThousandsGroup && base == 10) {
-        for (int i = num_str.length() - 3; i > 0; i -=3) {
-            num_str.insert(i, group);
-            ++cnt_thousand_sep;
-        }
-    }
-
-    for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
-        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
-
-    if ((flags & Alternate || flags & ShowBase)
-            && base == 8
-            && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
-        num_str.prepend(QLatin1Char('0'));
-
-    // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
-    // when precision is not specified in the format string
-    bool zero_padded = flags & ZeroPadded
-                        && !(flags & LeftAdjusted)
-                        && precision_not_specified;
-
-    if (zero_padded) {
-        int num_pad_chars = width - num_str.length();
-
-        // leave space for optional '0x' in hex form
-        if (base == 16 && flags & Alternate)
-            num_pad_chars -= 2;
-        // leave space for optional '0b' in binary form
-        else if (base == 2 && flags & Alternate)
-            num_pad_chars -= 2;
-
-        for (int i = 0; i < num_pad_chars; ++i)
-            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
-    }
-
-    if (flags & CapitalEorX)
-        num_str = num_str.toUpper();
-
-    if (base == 16 && (flags & Alternate || flags & ShowBase))
-        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
-    else if (base == 2 && (flags & Alternate || flags & ShowBase))
-        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
-
-    // add sign
-    if (flags & AlwaysShowSign)
-        num_str.prepend(plus);
-    else if (flags & BlankBeforePositive)
-        num_str.prepend(QLatin1Char(' '));
-
-    return num_str;
-}
-
-// Removes thousand-group separators in "C" locale.
-static bool removeGroupSeparators(QLocalePrivate::CharBuff *num)
-{
-    int group_cnt = 0; // counts number of group chars
-    int decpt_idx = -1;
-
-    char *data = num->data();
-    int l = qstrlen(data);
-
-    // Find the decimal point and check if there are any group chars
-    int i = 0;
-    for (; i < l; ++i) {
-        char c = data[i];
-
-        if (c == ',') {
-            if (i == 0 || data[i - 1] < '0' || data[i - 1] > '9')
-                return false;
-            if (i == l - 1 || data[i + 1] < '0' || data[i + 1] > '9')
-                return false;
-            ++group_cnt;
-        }
-        else if (c == '.') {
-            // Fail if more than one decimal points
-            if (decpt_idx != -1)
-                return false;
-            decpt_idx = i;
-        } else if (c == 'e' || c == 'E') {
-            // an 'e' or 'E' - if we have not encountered a decimal
-            // point, this is where it "is".
-            if (decpt_idx == -1)
-                decpt_idx = i;
-        }
-    }
-
-    // If no group chars, we're done
-    if (group_cnt == 0)
-        return true;
-
-    // No decimal point means that it "is" at the end of the string
-    if (decpt_idx == -1)
-        decpt_idx = l;
-
-    i = 0;
-    while (i < l && group_cnt > 0) {
-        char c = data[i];
-
-        if (c == ',') {
-            // Don't allow group chars after the decimal point
-            if (i > decpt_idx)
-                return false;
-
-            // Check that it is placed correctly relative to the decpt
-            if ((decpt_idx - i) % 4 != 0)
-                return false;
-
-            // Remove it
-            memmove(data + i, data + i + 1, l - i - 1);
-            data[--l] = '\0';
-
-            --group_cnt;
-            --decpt_idx;
-        } else {
-            // Check that we are not missing a separator
-            if (i < decpt_idx
-                    && (decpt_idx - i) % 4 == 0
-                    && !(i == 0 && c == '-')) // check for negative sign at start of string
-                return false;
-            ++i;
-        }
-    }
-
-    return true;
-}
-
-/*
-    Converts a number in locale to its representation in the C locale.
-    Only has to guarantee that a string that is a correct representation of
-    a number will be converted. If junk is passed in, junk will be passed
-    out and the error will be detected during the actual conversion to a
-    number. We can't detect junk here, since we don't even know the base
-    of the number.
-*/
-bool QLocalePrivate::numberToCLocale(const QString &num,
-                                            GroupSeparatorMode group_sep_mode,
-                                            CharBuff *result) const
-{
-    const QChar *uc = num.unicode();
-    int l = num.length();
-    int idx = 0;
-
-    // Skip whitespace
-    while (idx < l && uc[idx].isSpace())
-        ++idx;
-    if (idx == l)
-        return false;
-
-    const QChar _group = group();
-
-    while (idx < l) {
-        const QChar &in = uc[idx];
-
-        char out = digitToCLocale(in);
-        if (out == 0) {
-            if (in == list())
-                out = ';';
-            else if (in == percent())
-                out = '%';
-            // for handling base-x numbers
-            else if (in.unicode() >= 'A' && in.unicode() <= 'Z')
-                out = in.toLower().toLatin1();
-            else if (in.unicode() >= 'a' && in.unicode() <= 'z')
-                out = in.toLatin1();
-            else
-                break;
-        }
-
-        result->append(out);
-
-        ++idx;
-    }
-
-    // Check trailing whitespace
-    for (; idx < l; ++idx) {
-        if (!uc[idx].isSpace())
-            return false;
-    }
-
-    result->append('\0');
-
-    // Check separators
-    if (group_sep_mode == ParseGroupSeparators
-            && !removeGroupSeparators(result))
-        return false;
-
-
-    return true;
-}
-
-bool QLocalePrivate::validateChars(const QString &str, NumberMode numMode, QByteArray *buff,
-                                    int decDigits) const
-{
-    buff->clear();
-    buff->reserve(str.length());
-
-    const bool scientific = numMode == DoubleScientificMode;
-    bool lastWasE = false;
-    bool lastWasDigit = false;
-    int eCnt = 0;
-    int decPointCnt = 0;
-    bool dec = false;
-    int decDigitCnt = 0;
-
-    for (int i = 0; i < str.length(); ++i) {
-        char c = digitToCLocale(str.at(i));
-
-        if (c >= '0' && c <= '9') {
-            if (numMode != IntegerMode) {
-                // If a double has too many digits after decpt, it shall be Invalid.
-                if (dec && decDigits != -1 && decDigits < ++decDigitCnt)
-                    return false;
-            }
-            lastWasDigit = true;
-        } else {
-            switch (c) {
-                case '.':
-                    if (numMode == IntegerMode) {
-                        // If an integer has a decimal point, it shall be Invalid.
-                        return false;
-                    } else {
-                        // If a double has more than one decimal point, it shall be Invalid.
-                        if (++decPointCnt > 1)
-                            return false;
-#if 0
-                        // If a double with no decimal digits has a decimal point, it shall be
-                        // Invalid.
-                        if (decDigits == 0)
-                            return false;
-#endif                  // On second thoughts, it shall be Valid.
-
-                        dec = true;
-                    }
-                    break;
-
-                case '+':
-                case '-':
-                    if (scientific) {
-                        // If a scientific has a sign that's not at the beginning or after
-                        // an 'e', it shall be Invalid.
-                        if (i != 0 && !lastWasE)
-                            return false;
-                    } else {
-                        // If a non-scientific has a sign that's not at the beginning,
-                        // it shall be Invalid.
-                        if (i != 0)
-                            return false;
-                    }
-                    break;
-
-                case ',':
-                    //it can only be placed after a digit which is before the decimal point
-                    if (!lastWasDigit || decPointCnt > 0)
-                        return false;
-                    break;
-
-                case 'e':
-                    if (scientific) {
-                        // If a scientific has more than one 'e', it shall be Invalid.
-                        if (++eCnt > 1)
-                            return false;
-                        dec = false;
-                    } else {
-                        // If a non-scientific has an 'e', it shall be Invalid.
-                        return false;
-                    }
-                    break;
-
-                default:
-                    // If it's not a valid digit, it shall be Invalid.
-                    return false;
-            }
-            lastWasDigit = false;
-        }
-
-        lastWasE = c == 'e';
-        if (c != ',')
-            buff->append(c);
-    }
-
-    return true;
-}
-
-double QLocalePrivate::stringToDouble(const QString &number, bool *ok,
-                                        GroupSeparatorMode group_sep_mode) const
-{
-    CharBuff buff;
-    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
-                         group_sep_mode, &buff)) {
-        if (ok != 0)
-            *ok = false;
-        return 0.0;
-    }
-    return bytearrayToDouble(buff.constData(), ok);
-}
-
-qlonglong QLocalePrivate::stringToLongLong(const QString &number, int base,
-                                           bool *ok, GroupSeparatorMode group_sep_mode) const
-{
-    CharBuff buff;
-    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
-                         group_sep_mode, &buff)) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-
-    return bytearrayToLongLong(buff.constData(), base, ok);
-}
-
-qulonglong QLocalePrivate::stringToUnsLongLong(const QString &number, int base,
-                                               bool *ok, GroupSeparatorMode group_sep_mode) const
-{
-    CharBuff buff;
-    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
-                         group_sep_mode, &buff)) {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-
-    return bytearrayToUnsLongLong(buff.constData(), base, ok);
-}
-
-
-double QLocalePrivate::bytearrayToDouble(const char *num, bool *ok, bool *overflow)
-{
-    if (ok != 0)
-        *ok = true;
-    if (overflow != 0)
-        *overflow = false;
-
-    if (*num == '\0') {
-        if (ok != 0)
-            *ok = false;
-        return 0.0;
-    }
-
-    if (qstrcmp(num, "nan") == 0)
-        return qt_snan();
-
-    if (qstrcmp(num, "+inf") == 0 || qstrcmp(num, "inf") == 0)
-        return qt_inf();
-
-    if (qstrcmp(num, "-inf") == 0)
-        return -qt_inf();
-
-    bool _ok;
-    const char *endptr;
-    double d = qstrtod(num, &endptr, &_ok);
-
-    if (!_ok) {
-        // the only way strtod can fail with *endptr != '\0' on a non-empty
-        // input string is overflow
-        if (ok != 0)
-            *ok = false;
-        if (overflow != 0)
-            *overflow = *endptr != '\0';
-        return 0.0;
-    }
-
-    if (*endptr != '\0') {
-        // we stopped at a non-digit character after converting some digits
-        if (ok != 0)
-            *ok = false;
-        if (overflow != 0)
-            *overflow = false;
-        return 0.0;
-    }
-
-    if (ok != 0)
-        *ok = true;
-    if (overflow != 0)
-        *overflow = false;
-    return d;
-}
-
-qlonglong QLocalePrivate::bytearrayToLongLong(const char *num, int base, bool *ok, bool *overflow)
-{
-    bool _ok;
-    const char *endptr;
-
-    if (*num == '\0') {
-        if (ok != 0)
-            *ok = false;
-        if (overflow != 0)
-            *overflow = false;
-        return 0;
-    }
-
-    qlonglong l = qstrtoll(num, &endptr, base, &_ok);
+        /* This next bit is a bit quirky. In DFExponent form, the precision
+           is the number of digits after decpt. So that would suggest using
+           mode=3 for qdtoa. But qdtoa behaves strangely when mode=3 and
+           precision=0. So we get around this by using mode=2 and reasoning
+           that we want precision+1 significant digits, since the decimal
+           point in this mode is always after the first digit. */
+        int pr = precision;
+        if (form == DFExponent)
+            ++pr;
 
-    if (!_ok) {
-        if (ok != 0)
-            *ok = false;
-        if (overflow != 0) {
-            // the only way qstrtoll can fail with *endptr != '\0' on a non-empty
-            // input string is overflow
-            *overflow = *endptr != '\0';
+        char *rve = 0;
+        char *buff = 0;
+        QT_TRY {
+            digits = QLatin1String(qdtoa(d, mode, pr, &decpt, &sign, &rve, &buff));
+        } QT_CATCH(...) {
+            if (buff != 0)
+                free(buff);
+            QT_RETHROW;
         }
-        return 0;
-    }
-
-    if (*endptr != '\0') {
-        // we stopped at a non-digit character after converting some digits
-        if (ok != 0)
-            *ok = false;
-        if (overflow != 0)
-            *overflow = false;
-        return 0;
-    }
-
-    if (ok != 0)
-        *ok = true;
-    if (overflow != 0)
-        *overflow = false;
-    return l;
-}
-
-qulonglong QLocalePrivate::bytearrayToUnsLongLong(const char *num, int base, bool *ok)
-{
-    bool _ok;
-    const char *endptr;
-    qulonglong l = qstrtoull(num, &endptr, base, &_ok);
-
-    if (!_ok || *endptr != '\0') {
-        if (ok != 0)
-            *ok = false;
-        return 0;
-    }
-
-    if (ok != 0)
-        *ok = true;
-    return l;
-}
-
-/*!
-    \since 4.8
-
-    \enum QLocale::CurrencyFormat
-
-    Specifies the format of the currency symbol.
+        if (buff != 0)
+            free(buff);
+#endif // QT_QLOCALE_USES_FCVT
 
-    \value CurrencyIsoCode a ISO-4217 code of the currency.
-    \value CurrencySymbol a currency symbol.
-    \value CurrencyDisplayName a user readable name of the currency.
-*/
+        if (_zero.unicode() != '0') {
+            ushort z = _zero.unicode() - '0';
+            for (int i = 0; i < digits.length(); ++i)
+                reinterpret_cast<ushort *>(digits.data())[i] += z;
+        }
 
-/*!
-    \since 4.8
-    Returns a currency symbol according to the \a format.
-*/
-QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    quint32 idx, size;
-    switch (format) {
-    case CurrencySymbol:
-        idx = d()->m_currency_symbol_idx;
-        size = d()->m_currency_symbol_size;
-        return getLocaleData(currency_symbol_data + idx, size);
-    case CurrencyDisplayName:
-        idx = d()->m_currency_display_name_idx;
-        size = d()->m_currency_display_name_size;
-        return getLocaleListData(currency_display_name_data + idx, size, 0);
-    case CurrencyIsoCode: {
-        int len = 0;
-        const QLocalePrivate *d = this->d();
-        for (; len < 3; ++len)
-            if (!d->m_currency_iso_code[len])
+        bool always_show_decpt = (flags & Alternate || flags & ForcePoint);
+        switch (form) {
+            case DFExponent: {
+                num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+                                       digits, decpt, precision, PMDecimalDigits,
+                                       always_show_decpt);
                 break;
-        return len ? QString::fromLatin1(d->m_currency_iso_code, len) : QString();
-    }
-    }
-    return QString();
-}
-
-/*!
-    \fn QString QLocale::toCurrencyString(short) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(ushort) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(int) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(uint) const
-    \since 4.8
-    \overload
-*/
-/*!
-    \fn QString QLocale::toCurrencyString(float) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \since 4.8
-
-    Returns a localized string representation of \a value as a currency.
-*/
-QString QLocale::toCurrencyString(qlonglong value) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    const QLocalePrivate *d = this->d();
-    quint8 idx = d->m_currency_format_idx;
-    quint8 size = d->m_currency_format_size;
-    if (d->m_currency_negative_format_size && value < 0) {
-        idx = d->m_currency_negative_format_idx;
-        size = d->m_currency_negative_format_size;
-        value = -value;
-    }
-    QString str = d->longLongToString(value);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
-    QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
-}
-
-/*!
-    \since 4.8
-    \overload
-*/
-QString QLocale::toCurrencyString(qulonglong value) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    const QLocalePrivate *d = this->d();
-    quint8 idx = d->m_currency_format_idx;
-    quint8 size = d->m_currency_format_size;
-    QString str = d->unsLongLongToString(value);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
-    QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
-}
-
-QString QLocale::toCurrencyString(double value) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
-        if (!res.isNull())
-            return res.toString();
-    }
-#endif
-    const QLocalePrivate *d = this->d();
-    quint8 idx = d->m_currency_format_idx;
-    quint8 size = d->m_currency_format_size;
-    if (d->m_currency_negative_format_size && value < 0) {
-        idx = d->m_currency_negative_format_idx;
-        size = d->m_currency_negative_format_size;
-        value = -value;
-    }
-    QString str = d->doubleToString(value, d->m_currency_digits,
-                                    QLocalePrivate::DFDecimal);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
-    QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
-}
-
-/*!
-    \since 4.8
-
-    Returns a sorted list of locale names that could be used for translation
-    of messages presented to the user.
+            }
+            case DFDecimal: {
+                num_str = decimalForm(_zero, decimal, group,
+                                      digits, decpt, precision, PMDecimalDigits,
+                                      always_show_decpt, flags & ThousandsGroup);
+                break;
+            }
+            case DFSignificantDigits: {
+                PrecisionMode mode = (flags & Alternate) ?
+                            PMSignificantDigits : PMChopTrailingZeros;
 
-    \sa QTranslator
-*/
-QStringList QLocale::uiLanguages() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
-        if (!res.isNull()) {
-            QStringList result = res.toStringList();
-            if (!result.isEmpty())
-                return result;
+                if (decpt != digits.length() && (decpt <= -4 || decpt > precision))
+                    num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+                                           digits, decpt, precision, mode,
+                                           always_show_decpt);
+                else
+                    num_str = decimalForm(_zero, decimal, group,
+                                          digits, decpt, precision, mode,
+                                          always_show_decpt, flags & ThousandsGroup);
+                break;
+            }
         }
-    }
-#endif
-    return QStringList(name());
-}
-
-/*-
- * Copyright (c) 1992, 1993
- *        The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgment:
- *        This product includes software developed by the University of
- *        California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-// static char sccsid[] = "@(#)strtouq.c        8.1 (Berkeley) 6/4/93";
-//  "$FreeBSD: src/lib/libc/stdlib/strtoull.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $";
 
-/*
- * Convert a string to an unsigned long long integer.
- *
- * Ignores `locale' stuff.  Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-static qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok)
-{
-    register const char *s = nptr;
-    register qulonglong acc;
-    register unsigned char c;
-    register qulonglong qbase, cutoff;
-    register int any, cutlim;
+        negative = sign != 0 && !isZero(d);
+    }
 
-    if (ok != 0)
-        *ok = true;
+    // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
+    // pad special numbers
+    if (flags & QLocalePrivate::ZeroPadded
+            && !(flags & QLocalePrivate::LeftAdjusted)
+            && !special_number) {
+        int num_pad_chars = width - num_str.length();
+        // leave space for the sign
+        if (negative
+                || flags & QLocalePrivate::AlwaysShowSign
+                || flags & QLocalePrivate::BlankBeforePositive)
+            --num_pad_chars;
 
-    /*
-     * See strtoq for comments as to the logic used.
-     */
-    s = nptr;
-    do {
-        c = *s++;
-    } while (isspace(c));
-    if (c == '-') {
-        if (ok != 0)
-            *ok = false;
-        if (endptr != 0)
-            *endptr = s - 1;
-        return 0;
-    } else {
-        if (c == '+')
-            c = *s++;
-    }
-    if ((base == 0 || base == 16) &&
-        c == '0' && (*s == 'x' || *s == 'X')) {
-        c = s[1];
-        s += 2;
-        base = 16;
-    }
-    if (base == 0)
-        base = c == '0' ? 8 : 10;
-    qbase = unsigned(base);
-    cutoff = qulonglong(ULLONG_MAX) / qbase;
-    cutlim = qulonglong(ULLONG_MAX) % qbase;
-    for (acc = 0, any = 0;; c = *s++) {
-        if (!isascii(c))
-            break;
-        if (isdigit(c))
-            c -= '0';
-        else if (isalpha(c))
-            c -= isupper(c) ? 'A' - 10 : 'a' - 10;
-        else
-            break;
-        if (c >= base)
-            break;
-        if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
-            any = -1;
-        else {
-            any = 1;
-            acc *= qbase;
-            acc += c;
-        }
-    }
-    if (any == 0) {
-        if (ok != 0)
-            *ok = false;
-    } else if (any < 0) {
-        acc = ULLONG_MAX;
-        if (ok != 0)
-            *ok = false;
+        for (int i = 0; i < num_pad_chars; ++i)
+            num_str.prepend(_zero);
     }
-    if (endptr != 0)
-        *endptr = (any ? s - 1 : nptr);
-    return acc;
-}
 
+    // add sign
+    if (negative)
+        num_str.prepend(minus);
+    else if (flags & QLocalePrivate::AlwaysShowSign)
+        num_str.prepend(plus);
+    else if (flags & QLocalePrivate::BlankBeforePositive)
+        num_str.prepend(QLatin1Char(' '));
 
-//  "$FreeBSD: src/lib/libc/stdlib/strtoll.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $";
+    if (flags & QLocalePrivate::CapitalEorX)
+        num_str = num_str.toUpper();
 
+    return num_str;
+}
 
-/*
- * Convert a string to a long long integer.
- *
- * Ignores `locale' stuff.  Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-static qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok)
+QString QLocalePrivate::longLongToString(qlonglong l, int precision,
+                                            int base, int width,
+                                            unsigned flags) const
 {
-    register const char *s;
-    register qulonglong acc;
-    register unsigned char c;
-    register qulonglong qbase, cutoff;
-    register int neg, any, cutlim;
-
-    /*
-     * Skip white space and pick up leading +/- sign if any.
-     * If base is 0, allow 0x for hex and 0 for octal, else
-     * assume decimal; if base is already 16, allow 0x.
-     */
-    s = nptr;
-    do {
-        c = *s++;
-    } while (isspace(c));
-    if (c == '-') {
-        neg = 1;
-        c = *s++;
-    } else {
-        neg = 0;
-        if (c == '+')
-            c = *s++;
-    }
-    if ((base == 0 || base == 16) &&
-        c == '0' && (*s == 'x' || *s == 'X')) {
-        c = s[1];
-        s += 2;
-        base = 16;
-    }
-    if (base == 0)
-        base = c == '0' ? 8 : 10;
-
-    /*
-     * Compute the cutoff value between legal numbers and illegal
-     * numbers.  That is the largest legal value, divided by the
-     * base.  An input number that is greater than this value, if
-     * followed by a legal input character, is too big.  One that
-     * is equal to this value may be valid or not; the limit
-     * between valid and invalid numbers is then based on the last
-     * digit.  For instance, if the range for quads is
-     * [-9223372036854775808..9223372036854775807] and the input base
-     * is 10, cutoff will be set to 922337203685477580 and cutlim to
-     * either 7 (neg==0) or 8 (neg==1), meaning that if we have
-     * accumulated a value > 922337203685477580, or equal but the
-     * next digit is > 7 (or 8), the number is too big, and we will
-     * return a range error.
-     *
-     * Set any if any `digits' consumed; make it negative to indicate
-     * overflow.
-     */
-    qbase = unsigned(base);
-    cutoff = neg ? qulonglong(0-(LLONG_MIN + LLONG_MAX)) + LLONG_MAX : LLONG_MAX;
-    cutlim = cutoff % qbase;
-    cutoff /= qbase;
-    for (acc = 0, any = 0;; c = *s++) {
-        if (!isascii(c))
-            break;
-        if (isdigit(c))
-            c -= '0';
-        else if (isalpha(c))
-            c -= isupper(c) ? 'A' - 10 : 'a' - 10;
-        else
-            break;
-        if (c >= base)
-            break;
-        if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
-            any = -1;
-        else {
-            any = 1;
-            acc *= qbase;
-            acc += c;
-        }
-    }
-    if (any < 0) {
-        acc = neg ? LLONG_MIN : LLONG_MAX;
-        if (ok != 0)
-            *ok = false;
-    } else if (neg) {
-        acc = (~acc) + 1;
-    }
-    if (endptr != 0)
-        *endptr = (any >= 0 ? s - 1 : nptr);
-
-    if (ok != 0)
-        *ok = any > 0;
-
-    return acc;
+    return QLocalePrivate::longLongToString(zero(), group(), plus(), minus(),
+                                            l, precision, base, width, flags);
 }
 
-#ifndef QT_QLOCALE_USES_FCVT
-
-/*        From: NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp */
-/* $FreeBSD: src/lib/libc/stdlib/netbsd_strtod.c,v 1.2.2.2 2001/03/02 17:14:15 tegge Exp $        */
-
-/* Please send bug reports to
-        David M. Gay
-        AT&T Bell Laboratories, Room 2C-463
-        600 Mountain Avenue
-        Murray Hill, NJ 07974-2070
-        U.S.A.
-        dmg@research.att.com or research!dmg
- */
-
-/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
- *
- * This strtod returns a nearest machine number to the input decimal
- * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
- * broken by the IEEE round-even rule.  Otherwise ties are broken by
- * biased rounding (add half and chop).
- *
- * Inspired loosely by William D. Clinger's paper "How to Read Floating
- * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- *
- *        1. We only require IEEE, IBM, or VAX double-precision
- *                arithmetic (not IEEE double-extended).
- *        2. We get by with floating-point arithmetic in a case that
- *                Clinger missed -- when we're computing d * 10^n
- *                for a small integer d and the integer n is not too
- *                much larger than 22 (the maximum integer k for which
- *                we can represent 10^k exactly), we may be able to
- *                compute (d*10^k) * 10^(e-k) with just one roundoff.
- *        3. Rather than a bit-at-a-time adjustment of the binary
- *                result in the hard case, we use floating-point
- *                arithmetic to determine the adjustment to within
- *                one bit; only in really hard cases do we need to
- *                compute a second residual.
- *        4. Because of 3., we don't need a large table of powers of 10
- *                for ten-to-e (just some small tables, e.g. of 10^k
- *                for 0 <= k <= 22).
- */
-
-/*
- * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least
- *        significant byte has the lowest address.
- * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most
- *        significant byte has the lowest address.
- * #define Long int on machines with 32-bit ints and 64-bit longs.
- * #define Sudden_Underflow for IEEE-format machines without gradual
- *        underflow (i.e., that flush to zero on underflow).
- * #define IBM for IBM mainframe-style floating-point arithmetic.
- * #define VAX for VAX-style floating-point arithmetic.
- * #define Unsigned_Shifts if >> does treats its left operand as unsigned.
- * #define No_leftright to omit left-right logic in fast floating-point
- *        computation of dtoa.
- * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
- * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
- *        that use extended-precision instructions to compute rounded
- *        products and quotients) with IBM.
- * #define ROUND_BIASED for IEEE-format with biased rounding.
- * #define Inaccurate_Divide for IEEE-format with correctly rounded
- *        products but inaccurate quotients, e.g., for Intel i860.
- * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision
- *        integer arithmetic.  Whether this speeds things up or slows things
- *        down depends on the machine and the number being converted.
- * #define KR_headers for old-style C function headers.
- * #define Bad_float_h if your system lacks a float.h or if it does not
- *        define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
- *        FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
- * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
- *        if memory is available and otherwise does something you deem
- *        appropriate.  If MALLOC is undefined, malloc will be invoked
- *        directly -- and assumed always to succeed.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-/*
-#if defined(__m68k__)    || defined(__sparc__) || defined(__i386__) || \
-     defined(__mips__)    || defined(__ns32k__) || defined(__alpha__) || \
-     defined(__powerpc__) || defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_MAC) || \
-     defined(mips) || defined(Q_OS_AIX) || defined(Q_OS_SOLARIS)
-#           define IEEE_BIG_OR_LITTLE_ENDIAN 1
-#endif
-*/
-
-// *All* of our architectures have IEEE arithmetic, don't they?
-#define IEEE_BIG_OR_LITTLE_ENDIAN 1
+QString QLocalePrivate::longLongToString(const QChar zero, const QChar group,
+                                         const QChar plus, const QChar minus,
+                                         qlonglong l, int precision,
+                                         int base, int width,
+                                         unsigned flags)
+{
+    bool precision_not_specified = false;
+    if (precision == -1) {
+        precision_not_specified = true;
+        precision = 1;
+    }
 
-#ifdef __arm32__
-/*
- * Although the CPU is little endian the FP has different
- * byte and word endianness. The byte order is still little endian
- * but the word order is big endian.
- */
-#define IEEE_BIG_OR_LITTLE_ENDIAN
-#endif
+    bool negative = l < 0;
+    if (base != 10) {
+        // these are not supported by sprintf for octal and hex
+        flags &= ~AlwaysShowSign;
+        flags &= ~BlankBeforePositive;
+        negative = false; // neither are negative numbers
+    }
 
-#ifdef vax
-#define VAX
-#endif
+    QString num_str;
+    if (base == 10)
+        num_str = qlltoa(l, base, zero);
+    else
+        num_str = qulltoa(l, base, zero);
 
-#define Long        qint32
-#define ULong        quint32
+    uint cnt_thousand_sep = 0;
+    if (flags & ThousandsGroup && base == 10) {
+        for (int i = num_str.length() - 3; i > 0; i -= 3) {
+            num_str.insert(i, group);
+            ++cnt_thousand_sep;
+        }
+    }
 
-#define MALLOC malloc
+    for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
+        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
 
-#ifdef BSD_QDTOA_DEBUG
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <stdio.h>
-QT_END_INCLUDE_NAMESPACE
+    if ((flags & Alternate || flags & ShowBase)
+            && base == 8
+            && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
+        num_str.prepend(QLatin1Char('0'));
 
-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
-#endif
+    // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
+    // when precision is not specified in the format string
+    bool zero_padded = flags & ZeroPadded
+                        && !(flags & LeftAdjusted)
+                        && precision_not_specified;
 
-#ifdef Unsigned_Shifts
-#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000;
-#else
-#define Sign_Extend(a,b) /*no-op*/
-#endif
+    if (zero_padded) {
+        int num_pad_chars = width - num_str.length();
 
-#if (defined(IEEE_BIG_OR_LITTLE_ENDIAN) + defined(VAX) + defined(IBM)) != 1
-#error Exactly one of IEEE_BIG_OR_LITTLE_ENDIAN, VAX, or IBM should be defined.
-#endif
+        // leave space for the sign
+        if (negative
+                || flags & AlwaysShowSign
+                || flags & BlankBeforePositive)
+            --num_pad_chars;
 
-static inline ULong _getWord0(const NEEDS_VOLATILE double x)
-{
-    const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
-    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
-        return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
-    } else {
-        return (ptr[7]<<24) + (ptr[6]<<16) + (ptr[5]<<8) + ptr[4];
-    }
-}
+        // leave space for optional '0x' in hex form
+        if (base == 16 && (flags & Alternate || flags & ShowBase))
+            num_pad_chars -= 2;
+        // leave space for optional '0b' in binary form
+        else if (base == 2 && (flags & Alternate || flags & ShowBase))
+            num_pad_chars -= 2;
 
-static inline void _setWord0(NEEDS_VOLATILE double *x, ULong l)
-{
-    NEEDS_VOLATILE uchar *ptr = reinterpret_cast<NEEDS_VOLATILE uchar *>(x);
-    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
-        ptr[0] = uchar(l>>24);
-        ptr[1] = uchar(l>>16);
-        ptr[2] = uchar(l>>8);
-        ptr[3] = uchar(l);
-    } else {
-        ptr[7] = uchar(l>>24);
-        ptr[6] = uchar(l>>16);
-        ptr[5] = uchar(l>>8);
-        ptr[4] = uchar(l);
+        for (int i = 0; i < num_pad_chars; ++i)
+            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
     }
-}
 
-static inline ULong _getWord1(const NEEDS_VOLATILE double x)
-{
-    const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
-    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
-        return (ptr[4]<<24) + (ptr[5]<<16) + (ptr[6]<<8) + ptr[7];
-    } else {
-        return (ptr[3]<<24) + (ptr[2]<<16) + (ptr[1]<<8) + ptr[0];
-    }
-}
-static inline void _setWord1(NEEDS_VOLATILE double *x, ULong l)
-{
-    NEEDS_VOLATILE uchar *ptr = reinterpret_cast<uchar NEEDS_VOLATILE *>(x);
-    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
-        ptr[4] = uchar(l>>24);
-        ptr[5] = uchar(l>>16);
-        ptr[6] = uchar(l>>8);
-        ptr[7] = uchar(l);
-    } else {
-        ptr[3] = uchar(l>>24);
-        ptr[2] = uchar(l>>16);
-        ptr[1] = uchar(l>>8);
-        ptr[0] = uchar(l);
-    }
-}
+    if (flags & CapitalEorX)
+        num_str = num_str.toUpper();
 
-static inline ULong getWord0(const NEEDS_VOLATILE double x)
-{
-#ifdef QT_ARMFPA
-    return _getWord1(x);
-#else
-    return _getWord0(x);
-#endif
-}
+    if (base == 16 && (flags & Alternate || flags & ShowBase))
+        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
+    if (base == 2 && (flags & Alternate || flags & ShowBase))
+        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
 
-static inline void setWord0(NEEDS_VOLATILE double *x, ULong l)
-{
-#ifdef QT_ARMFPA
-    _setWord1(x, l);
-#else
-    _setWord0(x, l);
-#endif
-}
+    // add sign
+    if (negative)
+        num_str.prepend(minus);
+    else if (flags & AlwaysShowSign)
+        num_str.prepend(plus);
+    else if (flags & BlankBeforePositive)
+        num_str.prepend(QLatin1Char(' '));
 
-static inline ULong getWord1(const NEEDS_VOLATILE double x)
-{
-#ifdef QT_ARMFPA
-    return _getWord0(x);
-#else
-    return _getWord1(x);
-#endif
+    return num_str;
 }
 
-static inline void setWord1(NEEDS_VOLATILE double *x, ULong l)
+QString QLocalePrivate::unsLongLongToString(qulonglong l, int precision,
+                                            int base, int width,
+                                            unsigned flags) const
 {
-#ifdef QT_ARMFPA
-    _setWord0(x, l);
-#else
-    _setWord1(x, l);
-#endif
+    return QLocalePrivate::unsLongLongToString(zero(), group(), plus(),
+                                               l, precision, base, width, flags);
 }
 
-static inline void Storeinc(ULong *&a, const ULong &b, const ULong &c)
+QString QLocalePrivate::unsLongLongToString(const QChar zero, const QChar group,
+                                            const QChar plus,
+                                            qulonglong l, int precision,
+                                            int base, int width,
+                                            unsigned flags)
 {
+    bool precision_not_specified = false;
+    if (precision == -1) {
+        precision_not_specified = true;
+        precision = 1;
+    }
 
-    *a = (ushort(b) << 16) | ushort(c);
-    ++a;
-}
-
-/* #define P DBL_MANT_DIG */
-/* Ten_pmax = floor(P*log(2)/log(5)) */
-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-
-#if defined(IEEE_BIG_OR_LITTLE_ENDIAN)
-#define Exp_shift  20
-#define Exp_shift1 20
-#define Exp_msk1    0x100000
-#define Exp_msk11   0x100000
-#define Exp_mask  0x7ff00000
-#define P 53
-#define Bias 1023
-#define IEEE_Arith
-#define Emin (-1022)
-#define Exp_1  0x3ff00000
-#define Exp_11 0x3ff00000
-#define Ebits 11
-#define Frac_mask  0xfffff
-#define Frac_mask1 0xfffff
-#define Ten_pmax 22
-#define Bletch 0x10
-#define Bndry_mask  0xfffff
-#define Bndry_mask1 0xfffff
-#if defined(LSB) && defined(Q_OS_VXWORKS)
-#undef LSB
-#endif
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 14
-#define Int_max 14
-#define Infinite(x) (getWord0(x) == 0x7ff00000) /* sufficient test for here */
-#else
-#undef  Sudden_Underflow
-#define Sudden_Underflow
-#ifdef IBM
-#define Exp_shift  24
-#define Exp_shift1 24
-#define Exp_msk1   0x1000000
-#define Exp_msk11  0x1000000
-#define Exp_mask  0x7f000000
-#define P 14
-#define Bias 65
-#define Exp_1  0x41000000
-#define Exp_11 0x41000000
-#define Ebits 8        /* exponent has 7 bits, but 8 is the right value in b2d */
-#define Frac_mask  0xffffff
-#define Frac_mask1 0xffffff
-#define Bletch 4
-#define Ten_pmax 22
-#define Bndry_mask  0xefffff
-#define Bndry_mask1 0xffffff
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 4
-#define Tiny0 0x100000
-#define Tiny1 0
-#define Quick_max 14
-#define Int_max 15
-#else /* VAX */
-#define Exp_shift  23
-#define Exp_shift1 7
-#define Exp_msk1    0x80
-#define Exp_msk11   0x800000
-#define Exp_mask  0x7f80
-#define P 56
-#define Bias 129
-#define Exp_1  0x40800000
-#define Exp_11 0x4080
-#define Ebits 8
-#define Frac_mask  0x7fffff
-#define Frac_mask1 0xffff007f
-#define Ten_pmax 24
-#define Bletch 2
-#define Bndry_mask  0xffff007f
-#define Bndry_mask1 0xffff007f
-#define LSB 0x10000
-#define Sign_bit 0x8000
-#define Log2P 1
-#define Tiny0 0x80
-#define Tiny1 0
-#define Quick_max 15
-#define Int_max 15
-#endif
-#endif
-
-#ifndef IEEE_Arith
-#define ROUND_BIASED
-#endif
-
-#ifdef RND_PRODQUOT
-#define rounded_product(a,b) a = rnd_prod(a, b)
-#define rounded_quotient(a,b) a = rnd_quot(a, b)
-extern double rnd_prod(double, double), rnd_quot(double, double);
-#else
-#define rounded_product(a,b) a *= b
-#define rounded_quotient(a,b) a /= b
-#endif
-
-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
-#define Big1 0xffffffff
-
-#ifndef Just_16
-/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
- * This makes some inner loops simpler and sometimes saves work
- * during multiplications, but it often seems to make things slightly
- * slower.  Hence the default is now to store 32 bits per Long.
- */
-#ifndef Pack_32
-#define Pack_32
-#endif
-#endif
+    QString num_str = qulltoa(l, base, zero);
 
-#define Kmax 15
+    uint cnt_thousand_sep = 0;
+    if (flags & ThousandsGroup && base == 10) {
+        for (int i = num_str.length() - 3; i > 0; i -=3) {
+            num_str.insert(i, group);
+            ++cnt_thousand_sep;
+        }
+    }
 
-struct
-Bigint {
-    struct Bigint *next;
-    int k, maxwds, sign, wds;
-    ULong x[1];
-};
+    for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
+        num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
 
- typedef struct Bigint Bigint;
+    if ((flags & Alternate || flags & ShowBase)
+            && base == 8
+            && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
+        num_str.prepend(QLatin1Char('0'));
 
-static Bigint *Balloc(int k)
-{
-    int x;
-    Bigint *rv;
-
-    x = 1 << k;
-    rv = static_cast<Bigint *>(MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)));
-    Q_CHECK_PTR(rv);
-    rv->k = k;
-    rv->maxwds = x;
-    rv->sign = rv->wds = 0;
-    return rv;
-}
+    // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
+    // when precision is not specified in the format string
+    bool zero_padded = flags & ZeroPadded
+                        && !(flags & LeftAdjusted)
+                        && precision_not_specified;
 
-static void Bfree(Bigint *v)
-{
-    free(v);
-}
+    if (zero_padded) {
+        int num_pad_chars = width - num_str.length();
 
-#define Bcopy(x,y) memcpy(reinterpret_cast<char *>(&x->sign), reinterpret_cast<char *>(&y->sign), \
-y->wds*sizeof(Long) + 2*sizeof(int))
+        // leave space for optional '0x' in hex form
+        if (base == 16 && flags & Alternate)
+            num_pad_chars -= 2;
+        // leave space for optional '0b' in binary form
+        else if (base == 2 && flags & Alternate)
+            num_pad_chars -= 2;
 
-/* multiply by m and add a */
-static Bigint *multadd(Bigint *b, int m, int a)
-{
-    int i, wds;
-    ULong *x, y;
-#ifdef Pack_32
-    ULong xi, z;
-#endif
-    Bigint *b1;
-
-    wds = b->wds;
-    x = b->x;
-    i = 0;
-    do {
-#ifdef Pack_32
-        xi = *x;
-        y = (xi & 0xffff) * m + a;
-        z = (xi >> 16) * m + (y >> 16);
-        a = (z >> 16);
-        *x++ = (z << 16) + (y & 0xffff);
-#else
-        y = *x * m + a;
-        a = (y >> 16);
-        *x++ = y & 0xffff;
-#endif
-    }
-    while(++i < wds);
-    if (a) {
-        if (wds >= b->maxwds) {
-            b1 = Balloc(b->k+1);
-            Bcopy(b1, b);
-            Bfree(b);
-            b = b1;
-        }
-        b->x[wds++] = a;
-        b->wds = wds;
+        for (int i = 0; i < num_pad_chars; ++i)
+            num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
     }
-    return b;
-}
 
-static Bigint *s2b(const char *s, int nd0, int nd, ULong y9)
-{
-    Bigint *b;
-    int i, k;
-    Long x, y;
-
-    x = (nd + 8) / 9;
-    for(k = 0, y = 1; x > y; y <<= 1, k++) ;
-#ifdef Pack_32
-    b = Balloc(k);
-    b->x[0] = y9;
-    b->wds = 1;
-#else
-    b = Balloc(k+1);
-    b->x[0] = y9 & 0xffff;
-    b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
-#endif
+    if (flags & CapitalEorX)
+        num_str = num_str.toUpper();
 
-    i = 9;
-    if (9 < nd0) {
-        s += 9;
-        do b = multadd(b, 10, *s++ - '0');
-        while(++i < nd0);
-        s++;
-    }
-    else
-        s += 10;
-    for(; i < nd; i++)
-        b = multadd(b, 10, *s++ - '0');
-    return b;
-}
+    if (base == 16 && (flags & Alternate || flags & ShowBase))
+        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
+    else if (base == 2 && (flags & Alternate || flags & ShowBase))
+        num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
 
-static int hi0bits(ULong x)
-{
-    int k = 0;
+    // add sign
+    if (flags & AlwaysShowSign)
+        num_str.prepend(plus);
+    else if (flags & BlankBeforePositive)
+        num_str.prepend(QLatin1Char(' '));
 
-    if (!(x & 0xffff0000)) {
-        k = 16;
-        x <<= 16;
-    }
-    if (!(x & 0xff000000)) {
-        k += 8;
-        x <<= 8;
-    }
-    if (!(x & 0xf0000000)) {
-        k += 4;
-        x <<= 4;
-    }
-    if (!(x & 0xc0000000)) {
-        k += 2;
-        x <<= 2;
-    }
-    if (!(x & 0x80000000)) {
-        k++;
-        if (!(x & 0x40000000))
-            return 32;
-    }
-    return k;
+    return num_str;
 }
 
-static int lo0bits(ULong *y)
+/*
+    Converts a number in locale to its representation in the C locale.
+    Only has to guarantee that a string that is a correct representation of
+    a number will be converted. If junk is passed in, junk will be passed
+    out and the error will be detected during the actual conversion to a
+    number. We can't detect junk here, since we don't even know the base
+    of the number.
+*/
+bool QLocalePrivate::numberToCLocale(const QString &num,
+                                            GroupSeparatorMode group_sep_mode,
+                                            CharBuff *result) const
 {
-    int k;
-    ULong x = *y;
-
-    if (x & 7) {
-        if (x & 1)
-            return 0;
-        if (x & 2) {
-            *y = x >> 1;
-            return 1;
-        }
-        *y = x >> 2;
-        return 2;
-    }
-    k = 0;
-    if (!(x & 0xffff)) {
-        k = 16;
-        x >>= 16;
-    }
-    if (!(x & 0xff)) {
-        k += 8;
-        x >>= 8;
-    }
-    if (!(x & 0xf)) {
-        k += 4;
-        x >>= 4;
-    }
-    if (!(x & 0x3)) {
-        k += 2;
-        x >>= 2;
-    }
-    if (!(x & 1)) {
-        k++;
-        x >>= 1;
-        if (!x & 1)
-            return 32;
-    }
-    *y = x;
-    return k;
-}
+    const QChar *uc = num.unicode();
+    int l = num.length();
+    int idx = 0;
 
-static Bigint *i2b(int i)
-{
-    Bigint *b;
+    // Skip whitespace
+    while (idx < l && uc[idx].isSpace())
+        ++idx;
+    if (idx == l)
+        return false;
 
-    b = Balloc(1);
-    b->x[0] = i;
-    b->wds = 1;
-    return b;
-}
+    const QChar _group = group();
 
-static Bigint *mult(Bigint *a, Bigint *b)
-{
-    Bigint *c;
-    int k, wa, wb, wc;
-    ULong carry, y, z;
-    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
-#ifdef Pack_32
-    ULong z2;
-#endif
+    while (idx < l) {
+        const QChar &in = uc[idx];
 
-    if (a->wds < b->wds) {
-        c = a;
-        a = b;
-        b = c;
-    }
-    k = a->k;
-    wa = a->wds;
-    wb = b->wds;
-    wc = wa + wb;
-    if (wc > a->maxwds)
-        k++;
-    c = Balloc(k);
-    for(x = c->x, xa = x + wc; x < xa; x++)
-        *x = 0;
-    xa = a->x;
-    xae = xa + wa;
-    xb = b->x;
-    xbe = xb + wb;
-    xc0 = c->x;
-#ifdef Pack_32
-    for(; xb < xbe; xb++, xc0++) {
-        if ((y = *xb & 0xffff) != 0) {
-            x = xa;
-            xc = xc0;
-            carry = 0;
-            do {
-                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
-                carry = z >> 16;
-                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
-                carry = z2 >> 16;
-                Storeinc(xc, z2, z);
-            }
-            while(x < xae);
-            *xc = carry;
-        }
-        if ((y = *xb >> 16) != 0) {
-            x = xa;
-            xc = xc0;
-            carry = 0;
-            z2 = *xc;
-            do {
-                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
-                carry = z >> 16;
-                Storeinc(xc, z, z2);
-                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
-                carry = z2 >> 16;
-            }
-            while(x < xae);
-            *xc = z2;
-        }
-    }
-#else
-    for(; xb < xbe; xc0++) {
-        if (y = *xb++) {
-            x = xa;
-            xc = xc0;
-            carry = 0;
-            do {
-                z = *x++ * y + *xc + carry;
-                carry = z >> 16;
-                *xc++ = z & 0xffff;
-            }
-            while(x < xae);
-            *xc = carry;
+        char out = digitToCLocale(in);
+        if (out == 0) {
+            if (in == list())
+                out = ';';
+            else if (in == percent())
+                out = '%';
+            // for handling base-x numbers
+            else if (in.unicode() >= 'A' && in.unicode() <= 'Z')
+                out = in.toLower().toLatin1();
+            else if (in.unicode() >= 'a' && in.unicode() <= 'z')
+                out = in.toLatin1();
+            else
+                break;
         }
-    }
-#endif
-    for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
-    c->wds = wc;
-    return c;
-}
 
-static Bigint *p5s;
+        result->append(out);
 
-struct p5s_deleter
-{
-    ~p5s_deleter()
-    {
-        while (p5s) {
-            Bigint *next = p5s->next;
-            Bfree(p5s);
-            p5s = next;
-        }
+        ++idx;
     }
-};
 
-static Bigint *pow5mult(Bigint *b, int k)
-{
-    Bigint *b1, *p5, *p51;
-    int i;
-    static const int p05[3] = { 5, 25, 125 };
-
-    if ((i = k & 3) != 0)
-#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
-    {
-        // work around a bug on 64 bit IRIX gcc
-        int *p = (int *) p05;
-        b = multadd(b, p[i-1], 0);
+    // Check trailing whitespace
+    for (; idx < l; ++idx) {
+        if (!uc[idx].isSpace())
+            return false;
     }
-#else
-    b = multadd(b, p05[i-1], 0);
-#endif
 
-    if (!(k >>= 2))
-        return b;
-    if (!(p5 = p5s)) {
-        /* first time */
-        static p5s_deleter deleter;
-        p5 = p5s = i2b(625);
-        p5->next = 0;
-    }
-    for(;;) {
-        if (k & 1) {
-            b1 = mult(b, p5);
-            Bfree(b);
-            b = b1;
-        }
-        if (!(k >>= 1))
-            break;
-        if (!(p51 = p5->next)) {
-            p51 = p5->next = mult(p5,p5);
-            p51->next = 0;
-        }
-        p5 = p51;
-    }
-    return b;
-}
+    result->append('\0');
 
-static Bigint *lshift(Bigint *b, int k)
-{
-    int i, k1, n, n1;
-    Bigint *b1;
-    ULong *x, *x1, *xe, z;
+    // Check separators
+    if (group_sep_mode == ParseGroupSeparators
+            && !removeGroupSeparators(result))
+        return false;
 
-#ifdef Pack_32
-    n = k >> 5;
-#else
-    n = k >> 4;
-#endif
-    k1 = b->k;
-    n1 = n + b->wds + 1;
-    for(i = b->maxwds; n1 > i; i <<= 1)
-        k1++;
-    b1 = Balloc(k1);
-    x1 = b1->x;
-    for(i = 0; i < n; i++)
-        *x1++ = 0;
-    x = b->x;
-    xe = x + b->wds;
-#ifdef Pack_32
-    if (k &= 0x1f) {
-        k1 = 32 - k;
-        z = 0;
-        do {
-            *x1++ = *x << k | z;
-            z = *x++ >> k1;
-        }
-        while(x < xe);
-        if ((*x1 = z) != 0)
-            ++n1;
-    }
-#else
-    if (k &= 0xf) {
-        k1 = 16 - k;
-        z = 0;
-        do {
-            *x1++ = *x << k  & 0xffff | z;
-            z = *x++ >> k1;
-        }
-        while(x < xe);
-        if (*x1 = z)
-            ++n1;
-    }
-#endif
-    else do
-        *x1++ = *x++;
-    while(x < xe);
-    b1->wds = n1 - 1;
-    Bfree(b);
-    return b1;
-}
 
-static int cmp(Bigint *a, Bigint *b)
-{
-    ULong *xa, *xa0, *xb, *xb0;
-    int i, j;
-
-    i = a->wds;
-    j = b->wds;
-#ifdef BSD_QDTOA_DEBUG
-    if (i > 1 && !a->x[i-1])
-        Bug("cmp called with a->x[a->wds-1] == 0");
-    if (j > 1 && !b->x[j-1])
-        Bug("cmp called with b->x[b->wds-1] == 0");
-#endif
-    if (i -= j)
-        return i;
-    xa0 = a->x;
-    xa = xa0 + j;
-    xb0 = b->x;
-    xb = xb0 + j;
-    for(;;) {
-        if (*--xa != *--xb)
-            return *xa < *xb ? -1 : 1;
-        if (xa <= xa0)
-            break;
-    }
-    return 0;
+    return true;
 }
 
-static Bigint *diff(Bigint *a, Bigint *b)
+bool QLocalePrivate::validateChars(const QString &str, NumberMode numMode, QByteArray *buff,
+                                    int decDigits) const
 {
-    Bigint *c;
-    int i, wa, wb;
-    Long borrow, y;        /* We need signed shifts here. */
-    ULong *xa, *xae, *xb, *xbe, *xc;
-#ifdef Pack_32
-    Long z;
-#endif
+    buff->clear();
+    buff->reserve(str.length());
 
-    i = cmp(a,b);
-    if (!i) {
-        c = Balloc(0);
-        c->wds = 1;
-        c->x[0] = 0;
-        return c;
-    }
-    if (i < 0) {
-        c = a;
-        a = b;
-        b = c;
-        i = 1;
-    }
-    else
-        i = 0;
-    c = Balloc(a->k);
-    c->sign = i;
-    wa = a->wds;
-    xa = a->x;
-    xae = xa + wa;
-    wb = b->wds;
-    xb = b->x;
-    xbe = xb + wb;
-    xc = c->x;
-    borrow = 0;
-#ifdef Pack_32
-    do {
-        y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
-        borrow = y >> 16;
-        Sign_Extend(borrow, y);
-        z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
-        borrow = z >> 16;
-        Sign_Extend(borrow, z);
-        Storeinc(xc, z, y);
-    }
-    while(xb < xbe);
-    while(xa < xae) {
-        y = (*xa & 0xffff) + borrow;
-        borrow = y >> 16;
-        Sign_Extend(borrow, y);
-        z = (*xa++ >> 16) + borrow;
-        borrow = z >> 16;
-        Sign_Extend(borrow, z);
-        Storeinc(xc, z, y);
-    }
-#else
-    do {
-        y = *xa++ - *xb++ + borrow;
-        borrow = y >> 16;
-        Sign_Extend(borrow, y);
-        *xc++ = y & 0xffff;
-    }
-    while(xb < xbe);
-    while(xa < xae) {
-        y = *xa++ + borrow;
-        borrow = y >> 16;
-        Sign_Extend(borrow, y);
-        *xc++ = y & 0xffff;
-    }
-#endif
-    while(!*--xc)
-        wa--;
-    c->wds = wa;
-    return c;
-}
+    const bool scientific = numMode == DoubleScientificMode;
+    bool lastWasE = false;
+    bool lastWasDigit = false;
+    int eCnt = 0;
+    int decPointCnt = 0;
+    bool dec = false;
+    int decDigitCnt = 0;
 
-static double ulp(double x)
-{
-    Long L;
-    double a;
+    for (int i = 0; i < str.length(); ++i) {
+        char c = digitToCLocale(str.at(i));
 
-    L = (getWord0(x) & Exp_mask) - (P-1)*Exp_msk1;
-#ifndef Sudden_Underflow
-    if (L > 0) {
-#endif
-#ifdef IBM
-        L |= Exp_msk1 >> 4;
-#endif
-        setWord0(&a, L);
-        setWord1(&a, 0);
-#ifndef Sudden_Underflow
-    }
-    else {
-        L = -L >> Exp_shift;
-        if (L < Exp_shift) {
-            setWord0(&a, 0x80000 >> L);
-            setWord1(&a, 0);
-        }
-        else {
-            setWord0(&a, 0);
-            L -= Exp_shift;
-            setWord1(&a, L >= 31 ? 1U : 1U << (31 - L));
-        }
-    }
-#endif
-    return a;
-}
+        if (c >= '0' && c <= '9') {
+            if (numMode != IntegerMode) {
+                // If a double has too many digits after decpt, it shall be Invalid.
+                if (dec && decDigits != -1 && decDigits < ++decDigitCnt)
+                    return false;
+            }
+            lastWasDigit = true;
+        } else {
+            switch (c) {
+                case '.':
+                    if (numMode == IntegerMode) {
+                        // If an integer has a decimal point, it shall be Invalid.
+                        return false;
+                    } else {
+                        // If a double has more than one decimal point, it shall be Invalid.
+                        if (++decPointCnt > 1)
+                            return false;
+#if 0
+                        // If a double with no decimal digits has a decimal point, it shall be
+                        // Invalid.
+                        if (decDigits == 0)
+                            return false;
+#endif                  // On second thoughts, it shall be Valid.
 
-static double b2d(Bigint *a, int *e)
-{
-    ULong *xa, *xa0, w, y, z;
-    int k;
-    double d;
-
-    xa0 = a->x;
-    xa = xa0 + a->wds;
-    y = *--xa;
-#ifdef BSD_QDTOA_DEBUG
-    if (!y) Bug("zero y in b2d");
-#endif
-    k = hi0bits(y);
-    *e = 32 - k;
-#ifdef Pack_32
-    if (k < Ebits) {
-        setWord0(&d, Exp_1 | y >> (Ebits - k));
-        w = xa > xa0 ? *--xa : 0;
-        setWord1(&d, y << ((32-Ebits) + k) | w >> (Ebits - k));
-        goto ret_d;
-    }
-    z = xa > xa0 ? *--xa : 0;
-    if (k -= Ebits) {
-        setWord0(&d, Exp_1 | y << k | z >> (32 - k));
-        y = xa > xa0 ? *--xa : 0;
-        setWord1(&d, z << k | y >> (32 - k));
-    }
-    else {
-        setWord0(&d, Exp_1 | y);
-        setWord1(&d, z);
-    }
-#else
-    if (k < Ebits + 16) {
-        z = xa > xa0 ? *--xa : 0;
-        setWord0(&d, Exp_1 | y << k - Ebits | z >> Ebits + 16 - k);
-        w = xa > xa0 ? *--xa : 0;
-        y = xa > xa0 ? *--xa : 0;
-        setWord1(&d, z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k);
-        goto ret_d;
-    }
-    z = xa > xa0 ? *--xa : 0;
-    w = xa > xa0 ? *--xa : 0;
-    k -= Ebits + 16;
-    setWord0(&d, Exp_1 | y << k + 16 | z << k | w >> 16 - k);
-    y = xa > xa0 ? *--xa : 0;
-    setWord1(&d, w << k + 16 | y << k);
-#endif
- ret_d:
-    return d;
-}
+                        dec = true;
+                    }
+                    break;
 
-static Bigint *d2b(double d, int *e, int *bits)
-{
-    Bigint *b;
-    int de, i, k;
-    ULong *x, y, z;
+                case '+':
+                case '-':
+                    if (scientific) {
+                        // If a scientific has a sign that's not at the beginning or after
+                        // an 'e', it shall be Invalid.
+                        if (i != 0 && !lastWasE)
+                            return false;
+                    } else {
+                        // If a non-scientific has a sign that's not at the beginning,
+                        // it shall be Invalid.
+                        if (i != 0)
+                            return false;
+                    }
+                    break;
 
-#ifdef Pack_32
-    b = Balloc(1);
-#else
-    b = Balloc(2);
-#endif
-    x = b->x;
-
-    z = getWord0(d) & Frac_mask;
-    setWord0(&d, getWord0(d) & 0x7fffffff);        /* clear sign bit, which we ignore */
-#ifdef Sudden_Underflow
-    de = (int)(getWord0(d) >> Exp_shift);
-#ifndef IBM
-    z |= Exp_msk11;
-#endif
-#else
-    if ((de = int(getWord0(d) >> Exp_shift)) != 0)
-        z |= Exp_msk1;
-#endif
-#ifdef Pack_32
-    if ((y = getWord1(d)) != 0) {
-        if ((k = lo0bits(&y)) != 0) {
-            x[0] = y | z << (32 - k);
-            z >>= k;
-        }
-        else
-            x[0] = y;
-        i = b->wds = (x[1] = z) ? 2 : 1;
-    }
-    else {
-#ifdef BSD_QDTOA_DEBUG
-        if (!z)
-            Bug("Zero passed to d2b");
-#endif
-        k = lo0bits(&z);
-        x[0] = z;
-        i = b->wds = 1;
-        k += 32;
-    }
-#else
-    if (y = getWord1(d)) {
-        if (k = lo0bits(&y))
-            if (k >= 16) {
-                x[0] = y | z << 32 - k & 0xffff;
-                x[1] = z >> k - 16 & 0xffff;
-                x[2] = z >> k;
-                i = 2;
-            }
-            else {
-                x[0] = y & 0xffff;
-                x[1] = y >> 16 | z << 16 - k & 0xffff;
-                x[2] = z >> k & 0xffff;
-                x[3] = z >> k+16;
-                i = 3;
+                case ',':
+                    //it can only be placed after a digit which is before the decimal point
+                    if (!lastWasDigit || decPointCnt > 0)
+                        return false;
+                    break;
+
+                case 'e':
+                    if (scientific) {
+                        // If a scientific has more than one 'e', it shall be Invalid.
+                        if (++eCnt > 1)
+                            return false;
+                        dec = false;
+                    } else {
+                        // If a non-scientific has an 'e', it shall be Invalid.
+                        return false;
+                    }
+                    break;
+
+                default:
+                    // If it's not a valid digit, it shall be Invalid.
+                    return false;
             }
-        else {
-            x[0] = y & 0xffff;
-            x[1] = y >> 16;
-            x[2] = z & 0xffff;
-            x[3] = z >> 16;
-            i = 3;
-        }
-    }
-    else {
-#ifdef BSD_QDTOA_DEBUG
-        if (!z)
-            Bug("Zero passed to d2b");
-#endif
-        k = lo0bits(&z);
-        if (k >= 16) {
-            x[0] = z;
-            i = 0;
-        }
-        else {
-            x[0] = z & 0xffff;
-            x[1] = z >> 16;
-            i = 1;
+            lastWasDigit = false;
         }
-        k += 32;
-    }
-    while(!x[i])
-        --i;
-    b->wds = i + 1;
-#endif
-#ifndef Sudden_Underflow
-    if (de) {
-#endif
-#ifdef IBM
-        *e = (de - Bias - (P-1) << 2) + k;
-        *bits = 4*P + 8 - k - hi0bits(getWord0(d) & Frac_mask);
-#else
-        *e = de - Bias - (P-1) + k;
-        *bits = P - k;
-#endif
-#ifndef Sudden_Underflow
-    }
-    else {
-        *e = de - Bias - (P-1) + 1 + k;
-#ifdef Pack_32
-        *bits = 32*i - hi0bits(x[i-1]);
-#else
-        *bits = (i+2)*16 - hi0bits(x[i]);
-#endif
+
+        lastWasE = c == 'e';
+        if (c != ',')
+            buff->append(c);
     }
-#endif
-    return b;
+
+    return true;
 }
 
-static double ratio(Bigint *a, Bigint *b)
+double QLocalePrivate::stringToDouble(const QString &number, bool *ok,
+                                        GroupSeparatorMode group_sep_mode) const
 {
-    double da, db;
-    int k, ka, kb;
-
-    da = b2d(a, &ka);
-    db = b2d(b, &kb);
-#ifdef Pack_32
-    k = ka - kb + 32*(a->wds - b->wds);
-#else
-    k = ka - kb + 16*(a->wds - b->wds);
-#endif
-#ifdef IBM
-    if (k > 0) {
-        setWord0(&da, getWord0(da) + (k >> 2)*Exp_msk1);
-        if (k &= 3)
-            da *= 1 << k;
-    }
-    else {
-        k = -k;
-        setWord0(&db, getWord0(db) + (k >> 2)*Exp_msk1);
-        if (k &= 3)
-            db *= 1 << k;
-    }
-#else
-    if (k > 0)
-        setWord0(&da, getWord0(da) + k*Exp_msk1);
-    else {
-        k = -k;
-        setWord0(&db, getWord0(db) + k*Exp_msk1);
+    CharBuff buff;
+    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
+                         group_sep_mode, &buff)) {
+        if (ok != 0)
+            *ok = false;
+        return 0.0;
     }
-#endif
-    return da / db;
+    return bytearrayToDouble(buff.constData(), ok);
 }
 
-static const double tens[] = {
-    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
-    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
-    1e20, 1e21, 1e22
-#ifdef VAX
-    , 1e23, 1e24
-#endif
-};
+qlonglong QLocalePrivate::stringToLongLong(const QString &number, int base,
+                                           bool *ok, GroupSeparatorMode group_sep_mode) const
+{
+    CharBuff buff;
+    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
+                         group_sep_mode, &buff)) {
+        if (ok != 0)
+            *ok = false;
+        return 0;
+    }
 
-#ifdef IEEE_Arith
-static const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
-#define n_bigtens 5
-#else
-#ifdef IBM
-static const double bigtens[] = { 1e16, 1e32, 1e64 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
-#define n_bigtens 3
-#else
-static const double bigtens[] = { 1e16, 1e32 };
-static const double tinytens[] = { 1e-16, 1e-32 };
-#define n_bigtens 2
-#endif
-#endif
+    return bytearrayToLongLong(buff.constData(), base, ok);
+}
 
-/*
-  The pre-release gcc3.3 shipped with SuSE 8.2 has a bug which causes
-  the comparison 1e-100 == 0.0 to return true. As a workaround, we
-  compare it to a global variable containing 0.0, which produces
-  correct assembler output.
+qulonglong QLocalePrivate::stringToUnsLongLong(const QString &number, int base,
+                                               bool *ok, GroupSeparatorMode group_sep_mode) const
+{
+    CharBuff buff;
+    if (!numberToCLocale(group().unicode() == 0xa0 ? number.trimmed() : number,
+                         group_sep_mode, &buff)) {
+        if (ok != 0)
+            *ok = false;
+        return 0;
+    }
+
+    return bytearrayToUnsLongLong(buff.constData(), base, ok);
+}
 
-  ### consider detecting the broken compilers and using the static
-  ### double for these, and use a #define for all working compilers
-*/
-static double g_double_zero = 0.0;
 
-Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
+double QLocalePrivate::bytearrayToDouble(const char *num, bool *ok, bool *overflow)
 {
-    int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
-        e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
-    const char *s, *s0, *s1;
-    double aadj, aadj1, adj, rv, rv0;
-    Long L;
-    ULong y, z;
-    Bigint *bb1, *bd0;
-    Bigint *bb = NULL, *bd = NULL, *bs = NULL, *delta = NULL;/* pacify gcc */
-
-    /*
-      #ifndef KR_headers
-      const char decimal_point = localeconv()->decimal_point[0];
-      #else
-      const char decimal_point = '.';
-      #endif */
     if (ok != 0)
         *ok = true;
+    if (overflow != 0)
+        *overflow = false;
 
-    const char decimal_point = '.';
-
-    sign = nz0 = nz = 0;
-    rv = 0.;
-
+    if (*num == '\0') {
+        if (ok != 0)
+            *ok = false;
+        return 0.0;
+    }
 
-    for(s = s00; isspace(uchar(*s)); s++)
-        ;
+    if (qstrcmp(num, "nan") == 0)
+        return qt_snan();
 
-    if (*s == '-') {
-        sign = 1;
-        s++;
-    } else if (*s == '+') {
-        s++;
-    }
+    if (qstrcmp(num, "+inf") == 0 || qstrcmp(num, "inf") == 0)
+        return qt_inf();
 
-    if (*s == '\0') {
-        s = s00;
-        goto ret;
-    }
+    if (qstrcmp(num, "-inf") == 0)
+        return -qt_inf();
 
-    if (*s == '0') {
-        nz0 = 1;
-        while(*++s == '0') ;
-        if (!*s)
-            goto ret;
-    }
-    s0 = s;
-    y = z = 0;
-    for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
-        if (nd < 9)
-            y = 10*y + c - '0';
-        else if (nd < 16)
-            z = 10*z + c - '0';
-    nd0 = nd;
-    if (c == decimal_point) {
-        c = *++s;
-        if (!nd) {
-            for(; c == '0'; c = *++s)
-                nz++;
-            if (c > '0' && c <= '9') {
-                s0 = s;
-                nf += nz;
-                nz = 0;
-                goto have_dig;
-            }
-            goto dig_done;
-        }
-        for(; c >= '0' && c <= '9'; c = *++s) {
-        have_dig:
-            nz++;
-            if (c -= '0') {
-                nf += nz;
-                for(i = 1; i < nz; i++)
-                    if (nd++ < 9)
-                        y *= 10;
-                    else if (nd <= DBL_DIG + 1)
-                        z *= 10;
-                if (nd++ < 9)
-                    y = 10*y + c;
-                else if (nd <= DBL_DIG + 1)
-                    z = 10*z + c;
-                nz = 0;
-            }
-        }
-    }
- dig_done:
-    e = 0;
-    if (c == 'e' || c == 'E') {
-        if (!nd && !nz && !nz0) {
-            s = s00;
-            goto ret;
-        }
-        s00 = s;
-        esign = 0;
-        switch(c = *++s) {
-        case '-':
-            esign = 1;
-        case '+':
-            c = *++s;
-        }
-        if (c >= '0' && c <= '9') {
-            while(c == '0')
-                c = *++s;
-            if (c > '0' && c <= '9') {
-                L = c - '0';
-                s1 = s;
-                while((c = *++s) >= '0' && c <= '9')
-                    L = 10*L + c - '0';
-                if (s - s1 > 8 || L > 19999)
-                    /* Avoid confusion from exponents
-                     * so large that e might overflow.
-                     */
-                    e = 19999; /* safe for 16 bit ints */
-                else
-                    e = int(L);
-                if (esign)
-                    e = -e;
-            }
-            else
-                e = 0;
-        }
-        else
-            s = s00;
-    }
-    if (!nd) {
-        if (!nz && !nz0)
-            s = s00;
-        goto ret;
-    }
-    e1 = e -= nf;
-
-    /* Now we have nd0 digits, starting at s0, followed by a
-     * decimal point, followed by nd-nd0 digits.  The number we're
-     * after is the integer represented by those digits times
-     * 10**e */
-
-    if (!nd0)
-        nd0 = nd;
-    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
-    rv = y;
-    if (k > 9)
-#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
-    {
-        // work around a bug on 64 bit IRIX gcc
-        double *t = (double *) tens;
-        rv = t[k - 9] * rv + z;
-    }
-#else
-    rv = tens[k - 9] * rv + z;
-#endif
+    bool _ok;
+    const char *endptr;
+    double d = qstrtod(num, &endptr, &_ok);
 
-    bd0 = 0;
-    if (nd <= DBL_DIG
-#ifndef RND_PRODQUOT
-        && FLT_ROUNDS == 1
-#endif
-        ) {
-        if (!e)
-            goto ret;
-        if (e > 0) {
-            if (e <= Ten_pmax) {
-#ifdef VAX
-                goto vax_ovfl_check;
-#else
-                /* rv = */ rounded_product(rv, tens[e]);
-                goto ret;
-#endif
-            }
-            i = DBL_DIG - nd;
-            if (e <= Ten_pmax + i) {
-                /* A fancier test would sometimes let us do
-                 * this for larger i values.
-                 */
-                e -= i;
-                rv *= tens[i];
-#ifdef VAX
-                /* VAX exponent range is so narrow we must
-                 * worry about overflow here...
-                 */
-            vax_ovfl_check:
-                setWord0(&rv, getWord0(rv) - P*Exp_msk1);
-                /* rv = */ rounded_product(rv, tens[e]);
-                if ((getWord0(rv) & Exp_mask)
-                    > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
-                    goto ovfl;
-                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-#else
-                /* rv = */ rounded_product(rv, tens[e]);
-#endif
-                goto ret;
-            }
-        }
-#ifndef Inaccurate_Divide
-        else if (e >= -Ten_pmax) {
-            /* rv = */ rounded_quotient(rv, tens[-e]);
-            goto ret;
-        }
-#endif
+    if (!_ok) {
+        // the only way strtod can fail with *endptr != '\0' on a non-empty
+        // input string is overflow
+        if (ok != 0)
+            *ok = false;
+        if (overflow != 0)
+            *overflow = *endptr != '\0';
+        return 0.0;
     }
-    e1 += nd - k;
-
-    /* Get starting approximation = rv * 10**e1 */
-
-    if (e1 > 0) {
-        if ((i = e1 & 15) != 0)
-            rv *= tens[i];
-        if (e1 &= ~15) {
-            if (e1 > DBL_MAX_10_EXP) {
-            ovfl:
-                //                                errno = ERANGE;
-                if (ok != 0)
-                    *ok = false;
-#ifdef __STDC__
-                rv = HUGE_VAL;
-#else
-                /* Can't trust HUGE_VAL */
-#ifdef IEEE_Arith
-                setWord0(&rv, Exp_mask);
-                setWord1(&rv, 0);
-#else
-                setWord0(&rv, Big0);
-                setWord1(&rv, Big1);
-#endif
-#endif
-                if (bd0)
-                    goto retfree;
-                goto ret;
-            }
-            if (e1 >>= 4) {
-                for(j = 0; e1 > 1; j++, e1 >>= 1)
-                    if (e1 & 1)
-                        rv *= bigtens[j];
-                /* The last multiplication could overflow. */
-                setWord0(&rv, getWord0(rv) - P*Exp_msk1);
-                rv *= bigtens[j];
-                if ((z = getWord0(rv) & Exp_mask)
-                    > Exp_msk1*(DBL_MAX_EXP+Bias-P))
-                    goto ovfl;
-                if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
-                    /* set to largest number */
-                    /* (Can't trust DBL_MAX) */
-                    setWord0(&rv, Big0);
-                    setWord1(&rv, Big1);
-                }
-                else
-                    setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-            }
 
-        }
-    }
-    else if (e1 < 0) {
-        e1 = -e1;
-        if ((i = e1 & 15) != 0)
-            rv /= tens[i];
-        if (e1 &= ~15) {
-            e1 >>= 4;
-            if (e1 >= 1 << n_bigtens)
-                goto undfl;
-            for(j = 0; e1 > 1; j++, e1 >>= 1)
-                if (e1 & 1)
-                    rv *= tinytens[j];
-            /* The last multiplication could underflow. */
-            rv0 = rv;
-            rv *= tinytens[j];
-            if (rv == g_double_zero)
-                {
-                    rv = 2.*rv0;
-                    rv *= tinytens[j];
-                    if (rv == g_double_zero)
-                        {
-                        undfl:
-                            rv = 0.;
-                            //                                        errno = ERANGE;
-                            if (ok != 0)
-                                *ok = false;
-                            if (bd0)
-                                goto retfree;
-                            goto ret;
-                        }
-                    setWord0(&rv, Tiny0);
-                    setWord1(&rv, Tiny1);
-                    /* The refinement below will clean
-                     * this approximation up.
-                     */
-                }
-        }
+    if (*endptr != '\0') {
+        // we stopped at a non-digit character after converting some digits
+        if (ok != 0)
+            *ok = false;
+        if (overflow != 0)
+            *overflow = false;
+        return 0.0;
     }
 
-    /* Now the hard part -- adjusting rv to the correct value.*/
-
-    /* Put digits into bd: true value = bd * 10^e */
+    if (ok != 0)
+        *ok = true;
+    if (overflow != 0)
+        *overflow = false;
+    return d;
+}
 
-    bd0 = s2b(s0, nd0, nd, y);
+qlonglong QLocalePrivate::bytearrayToLongLong(const char *num, int base, bool *ok, bool *overflow)
+{
+    bool _ok;
+    const char *endptr;
 
-    for(;;) {
-        bd = Balloc(bd0->k);
-        Bcopy(bd, bd0);
-        bb = d2b(rv, &bbe, &bbbits);        /* rv = bb * 2^bbe */
-        bs = i2b(1);
+    if (*num == '\0') {
+        if (ok != 0)
+            *ok = false;
+        if (overflow != 0)
+            *overflow = false;
+        return 0;
+    }
 
-        if (e >= 0) {
-            bb2 = bb5 = 0;
-            bd2 = bd5 = e;
-        }
-        else {
-            bb2 = bb5 = -e;
-            bd2 = bd5 = 0;
-        }
-        if (bbe >= 0)
-            bb2 += bbe;
-        else
-            bd2 -= bbe;
-        bs2 = bb2;
-#ifdef Sudden_Underflow
-#ifdef IBM
-        j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
-#else
-        j = P + 1 - bbbits;
-#endif
-#else
-        i = bbe + bbbits - 1;        /* logb(rv) */
-        if (i < Emin)        /* denormal */
-            j = bbe + (P-Emin);
-        else
-            j = P + 1 - bbbits;
-#endif
-        bb2 += j;
-        bd2 += j;
-        i = bb2 < bd2 ? bb2 : bd2;
-        if (i > bs2)
-            i = bs2;
-        if (i > 0) {
-            bb2 -= i;
-            bd2 -= i;
-            bs2 -= i;
-        }
-        if (bb5 > 0) {
-            bs = pow5mult(bs, bb5);
-            bb1 = mult(bs, bb);
-            Bfree(bb);
-            bb = bb1;
-        }
-        if (bb2 > 0)
-            bb = lshift(bb, bb2);
-        if (bd5 > 0)
-            bd = pow5mult(bd, bd5);
-        if (bd2 > 0)
-            bd = lshift(bd, bd2);
-        if (bs2 > 0)
-            bs = lshift(bs, bs2);
-        delta = diff(bb, bd);
-        dsign = delta->sign;
-        delta->sign = 0;
-        i = cmp(delta, bs);
-        if (i < 0) {
-            /* Error is less than half an ulp -- check for
-             * special case of mantissa a power of two.
-             */
-            if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask)
-                break;
-            delta = lshift(delta,Log2P);
-            if (cmp(delta, bs) > 0)
-                goto drop_down;
-            break;
-        }
-        if (i == 0) {
-            /* exactly half-way between */
-            if (dsign) {
-                if ((getWord0(rv) & Bndry_mask1) == Bndry_mask1
-                    &&  getWord1(rv) == 0xffffffff) {
-                    /*boundary case -- increment exponent*/
-                    setWord0(&rv, (getWord0(rv) & Exp_mask)
-                                + Exp_msk1
-#ifdef IBM
-                                | Exp_msk1 >> 4
-#endif
-                                );
-                    setWord1(&rv, 0);
-                    break;
-                }
-            }
-            else if (!(getWord0(rv) & Bndry_mask) && !getWord1(rv)) {
-            drop_down:
-                /* boundary case -- decrement exponent */
-#ifdef Sudden_Underflow
-                L = getWord0(rv) & Exp_mask;
-#ifdef IBM
-                if (L <  Exp_msk1)
-#else
-                    if (L <= Exp_msk1)
-#endif
-                        goto undfl;
-                L -= Exp_msk1;
-#else
-                L = (getWord0(rv) & Exp_mask) - Exp_msk1;
-#endif
-                setWord0(&rv, L | Bndry_mask1);
-                setWord1(&rv, 0xffffffff);
-#ifdef IBM
-                goto cont;
-#else
-                break;
-#endif
-            }
-#ifndef ROUND_BIASED
-            if (!(getWord1(rv) & LSB))
-                break;
-#endif
-            if (dsign)
-                rv += ulp(rv);
-#ifndef ROUND_BIASED
-            else {
-                rv -= ulp(rv);
-#ifndef Sudden_Underflow
-                if (rv == g_double_zero)
-                    goto undfl;
-#endif
-            }
-#endif
-            break;
-        }
-        if ((aadj = ratio(delta, bs)) <= 2.) {
-            if (dsign)
-                aadj = aadj1 = 1.;
-            else if (getWord1(rv) || getWord0(rv) & Bndry_mask) {
-#ifndef Sudden_Underflow
-                if (getWord1(rv) == Tiny1 && !getWord0(rv))
-                    goto undfl;
-#endif
-                aadj = 1.;
-                aadj1 = -1.;
-            }
-            else {
-                /* special case -- power of FLT_RADIX to be */
-                /* rounded down... */
+    qlonglong l = qstrtoll(num, &endptr, base, &_ok);
 
-                if (aadj < 2./FLT_RADIX)
-                    aadj = 1./FLT_RADIX;
-                else
-                    aadj *= 0.5;
-                aadj1 = -aadj;
-            }
-        }
-        else {
-            aadj *= 0.5;
-            aadj1 = dsign ? aadj : -aadj;
-#ifdef Check_FLT_ROUNDS
-            switch(FLT_ROUNDS) {
-            case 2: /* towards +infinity */
-                aadj1 -= 0.5;
-                break;
-            case 0: /* towards 0 */
-            case 3: /* towards -infinity */
-                aadj1 += 0.5;
-            }
-#else
-            if (FLT_ROUNDS == 0)
-                aadj1 += 0.5;
-#endif
-        }
-        y = getWord0(rv) & Exp_mask;
-
-        /* Check for overflow */
-
-        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
-            rv0 = rv;
-            setWord0(&rv, getWord0(rv) - P*Exp_msk1);
-            adj = aadj1 * ulp(rv);
-            rv += adj;
-            if ((getWord0(rv) & Exp_mask) >=
-                Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
-                if (getWord0(rv0) == Big0 && getWord1(rv0) == Big1)
-                    goto ovfl;
-                setWord0(&rv, Big0);
-                setWord1(&rv, Big1);
-                goto cont;
-            }
-            else
-                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-        }
-        else {
-#ifdef Sudden_Underflow
-            if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) {
-                rv0 = rv;
-                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-                adj = aadj1 * ulp(rv);
-                rv += adj;
-#ifdef IBM
-                if ((getWord0(rv) & Exp_mask) <  P*Exp_msk1)
-#else
-                    if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1)
-#endif
-                        {
-                            if (getWord0(rv0) == Tiny0
-                                && getWord1(rv0) == Tiny1)
-                                goto undfl;
-                            setWord0(&rv, Tiny0);
-                            setWord1(&rv, Tiny1);
-                            goto cont;
-                        }
-                    else
-                        setWord0(&rv, getWord0(rv) - P*Exp_msk1);
-            }
-            else {
-                adj = aadj1 * ulp(rv);
-                rv += adj;
-            }
-#else
-            /* Compute adj so that the IEEE rounding rules will
-             * correctly round rv + adj in some half-way cases.
-             * If rv * ulp(rv) is denormalized (i.e.,
-             * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
-             * trouble from bits lost to denormalization;
-             * example: 1.2e-307 .
-             */
-            if (y <= (P-1)*Exp_msk1 && aadj >= 1.) {
-                aadj1 = int(aadj + 0.5);
-                if (!dsign)
-                    aadj1 = -aadj1;
-            }
-            adj = aadj1 * ulp(rv);
-            rv += adj;
-#endif
-        }
-        z = getWord0(rv) & Exp_mask;
-        if (y == z) {
-            /* Can we stop now? */
-            L = Long(aadj);
-            aadj -= L;
-            /* The tolerances below are conservative. */
-            if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) {
-                if (aadj < .4999999 || aadj > .5000001)
-                    break;
-            }
-            else if (aadj < .4999999/FLT_RADIX)
-                break;
+    if (!_ok) {
+        if (ok != 0)
+            *ok = false;
+        if (overflow != 0) {
+            // the only way qstrtoll can fail with *endptr != '\0' on a non-empty
+            // input string is overflow
+            *overflow = *endptr != '\0';
         }
-    cont:
-        Bfree(bb);
-        Bfree(bd);
-        Bfree(bs);
-        Bfree(delta);
+        return 0;
     }
- retfree:
-    Bfree(bb);
-    Bfree(bd);
-    Bfree(bs);
-    Bfree(bd0);
-    Bfree(delta);
- ret:
-    if (se)
-        *se = s;
-    return sign ? -rv : rv;
-}
-
-static int quorem(Bigint *b, Bigint *S)
-{
-    int n;
-    Long borrow, y;
-    ULong carry, q, ys;
-    ULong *bx, *bxe, *sx, *sxe;
-#ifdef Pack_32
-    Long z;
-    ULong si, zs;
-#endif
 
-    n = S->wds;
-#ifdef BSD_QDTOA_DEBUG
-    /*debug*/ if (b->wds > n)
-        /*debug*/        Bug("oversize b in quorem");
-#endif
-    if (b->wds < n)
+    if (*endptr != '\0') {
+        // we stopped at a non-digit character after converting some digits
+        if (ok != 0)
+            *ok = false;
+        if (overflow != 0)
+            *overflow = false;
         return 0;
-    sx = S->x;
-    sxe = sx + --n;
-    bx = b->x;
-    bxe = bx + n;
-    q = *bxe / (*sxe + 1);        /* ensure q <= true quotient */
-#ifdef BSD_QDTOA_DEBUG
-    /*debug*/ if (q > 9)
-        /*debug*/        Bug("oversized quotient in quorem");
-#endif
-    if (q) {
-        borrow = 0;
-        carry = 0;
-        do {
-#ifdef Pack_32
-            si = *sx++;
-            ys = (si & 0xffff) * q + carry;
-            zs = (si >> 16) * q + (ys >> 16);
-            carry = zs >> 16;
-            y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
-            borrow = y >> 16;
-            Sign_Extend(borrow, y);
-            z = (*bx >> 16) - (zs & 0xffff) + borrow;
-            borrow = z >> 16;
-            Sign_Extend(borrow, z);
-            Storeinc(bx, z, y);
-#else
-            ys = *sx++ * q + carry;
-            carry = ys >> 16;
-            y = *bx - (ys & 0xffff) + borrow;
-            borrow = y >> 16;
-            Sign_Extend(borrow, y);
-            *bx++ = y & 0xffff;
-#endif
-        }
-        while(sx <= sxe);
-        if (!*bxe) {
-            bx = b->x;
-            while(--bxe > bx && !*bxe)
-                --n;
-            b->wds = n;
-        }
-    }
-    if (cmp(b, S) >= 0) {
-        q++;
-        borrow = 0;
-        carry = 0;
-        bx = b->x;
-        sx = S->x;
-        do {
-#ifdef Pack_32
-            si = *sx++;
-            ys = (si & 0xffff) + carry;
-            zs = (si >> 16) + (ys >> 16);
-            carry = zs >> 16;
-            y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
-            borrow = y >> 16;
-            Sign_Extend(borrow, y);
-            z = (*bx >> 16) - (zs & 0xffff) + borrow;
-            borrow = z >> 16;
-            Sign_Extend(borrow, z);
-            Storeinc(bx, z, y);
-#else
-            ys = *sx++ + carry;
-            carry = ys >> 16;
-            y = *bx - (ys & 0xffff) + borrow;
-            borrow = y >> 16;
-            Sign_Extend(borrow, y);
-            *bx++ = y & 0xffff;
-#endif
-        }
-        while(sx <= sxe);
-        bx = b->x;
-        bxe = bx + n;
-        if (!*bxe) {
-            while(--bxe > bx && !*bxe)
-                --n;
-            b->wds = n;
-        }
     }
-    return q;
+
+    if (ok != 0)
+        *ok = true;
+    if (overflow != 0)
+        *overflow = false;
+    return l;
 }
 
-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
- *
- * Inspired by "How to Print Floating-Point Numbers Accurately" by
- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- *        1. Rather than iterating, we use a simple numeric overestimate
- *           to determine k = floor(log10(d)).  We scale relevant
- *           quantities using O(log2(k)) rather than O(k) multiplications.
- *        2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
- *           try to generate digits strictly left to right.  Instead, we
- *           compute with fewer bits and propagate the carry if necessary
- *           when rounding the final digit up.  This is often faster.
- *        3. Under the assumption that input will be rounded nearest,
- *           mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
- *           That is, we allow equality in stopping tests when the
- *           round-nearest rule will give the same floating-point value
- *           as would satisfaction of the stopping test with strict
- *           inequality.
- *        4. We remove common factors of powers of 2 from relevant
- *           quantities.
- *        5. When converting floating-point integers less than 1e16,
- *           we use floating-point arithmetic rather than resorting
- *           to multiple-precision integers.
- *        6. When asked to produce fewer than 15 digits, we first try
- *           to get by with floating-point arithmetic; we resort to
- *           multiple-precision integer arithmetic only if we cannot
- *           guarantee that the floating-point calculation has given
- *           the correctly rounded result.  For k requested digits and
- *           "uniformly" distributed input, the probability is
- *           something like 10^(k-15) that we must resort to the Long
- *           calculation.
- */
-
-
-/* This actually sometimes returns a pointer to a string literal
-   cast to a char*. Do NOT try to modify the return value. */
-
-Q_CORE_EXPORT char *qdtoa ( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+qulonglong QLocalePrivate::bytearrayToUnsLongLong(const char *num, int base, bool *ok)
 {
-    // Some values of the floating-point control word can cause _qdtoa to crash with an underflow.
-    // We set a safe value here.
-#ifdef Q_OS_WIN
-    _clear87();
-    unsigned int oldbits = _control87(0, 0);
-#ifndef MCW_EM
-#    ifdef _MCW_EM
-#        define MCW_EM _MCW_EM
-#    else
-#        define MCW_EM 0x0008001F
-#    endif
-#endif
-    _control87(MCW_EM, MCW_EM);
-#endif
-
-#if defined(__GLIBC__) && !defined(__UCLIBC__)
-    fenv_t envp;
-    feholdexcept(&envp);
-#endif
-
-    char *s = _qdtoa(d, mode, ndigits, decpt, sign, rve, resultp);
-
-#ifdef Q_OS_WIN
-    _clear87();
-#ifndef _M_X64
-    _control87(oldbits, 0xFFFFF);
-#else
-    _control87(oldbits, _MCW_EM|_MCW_DN|_MCW_RC);
-#endif //_M_X64
-#endif //Q_OS_WIN
+    bool _ok;
+    const char *endptr;
+    qulonglong l = qstrtoull(num, &endptr, base, &_ok);
 
-#if defined(__GLIBC__) && !defined(__UCLIBC__)
-    fesetenv(&envp);
-#endif
+    if (!_ok || *endptr != '\0') {
+        if (ok != 0)
+            *ok = false;
+        return 0;
+    }
 
-    return s;
+    if (ok != 0)
+        *ok = true;
+    return l;
 }
 
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
-{
-    /*
-      Arguments ndigits, decpt, sign are similar to those
-      of ecvt and fcvt; trailing zeros are suppressed from
-      the returned string.  If not null, *rve is set to point
-      to the end of the return value.  If d is +-Infinity or NaN,
-      then *decpt is set to 9999.
-
-      mode:
-      0 ==> shortest string that yields d when read in
-      and rounded to nearest.
-      1 ==> like 0, but with Steele & White stopping rule;
-      e.g. with IEEE P754 arithmetic , mode 0 gives
-      1e23 whereas mode 1 gives 9.999999999999999e22.
-      2 ==> max(1,ndigits) significant digits.  This gives a
-      return value similar to that of ecvt, except
-      that trailing zeros are suppressed.
-      3 ==> through ndigits past the decimal point.  This
-      gives a return value similar to that from fcvt,
-      except that trailing zeros are suppressed, and
-      ndigits can be negative.
-      4-9 should give the same return values as 2-3, i.e.,
-      4 <= mode <= 9 ==> same return as mode
-      2 + (mode & 1).  These modes are mainly for
-      debugging; often they run slower but sometimes
-      faster than modes 2-3.
-      4,5,8,9 ==> left-to-right digit generation.
-      6-9 ==> don't try fast floating-point estimate
-      (if applicable).
-
-      Values of mode other than 0-9 are treated as mode 0.
-
-      Sufficient space is allocated to the return value
-      to hold the suppressed trailing zeros.
-    */
-
-    int bbits, b2, b5, be, dig, i, ieps, ilim0,
-        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
-        try_quick;
-    int ilim = 0, ilim1 = 0, spec_case = 0;        /* pacify gcc */
-    Long L;
-#ifndef Sudden_Underflow
-    int denorm;
-    ULong x;
-#endif
-    Bigint *b, *b1, *delta, *mhi, *S;
-    Bigint *mlo = NULL; /* pacify gcc */
-    double d2;
-    double ds, eps;
-    char *s, *s0;
-
-    if (getWord0(d) & Sign_bit) {
-        /* set sign for everything, including 0's and NaNs */
-        *sign = 1;
-        setWord0(&d, getWord0(d) & ~Sign_bit);        /* clear sign bit */
-    }
-    else
-        *sign = 0;
+/*!
+    \since 4.8
 
-#if defined(IEEE_Arith) + defined(VAX)
-#ifdef IEEE_Arith
-    if ((getWord0(d) & Exp_mask) == Exp_mask)
-#else
-        if (getWord0(d)  == 0x8000)
-#endif
-            {
-                /* Infinity or NaN */
-                *decpt = 9999;
-                s =
-#ifdef IEEE_Arith
-                    !getWord1(d) && !(getWord0(d) & 0xfffff) ? const_cast<char*>("Infinity") :
-#endif
-                    const_cast<char*>("NaN");
-                if (rve)
-                    *rve =
-#ifdef IEEE_Arith
-                        s[3] ? s + 8 :
-#endif
-                        s + 3;
-                return s;
-            }
-#endif
-#ifdef IBM
-    d += 0; /* normalize */
-#endif
-    if (d == g_double_zero)
-        {
-            *decpt = 1;
-            s = const_cast<char*>("0");
-            if (rve)
-                *rve = s + 1;
-            return s;
-        }
+    \enum QLocale::CurrencyFormat
 
-    b = d2b(d, &be, &bbits);
-#ifdef Sudden_Underflow
-    i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
-#else
-    if ((i = int(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) {
-#endif
-        d2 = d;
-        setWord0(&d2, getWord0(d2) & Frac_mask1);
-        setWord0(&d2, getWord0(d2) | Exp_11);
-#ifdef IBM
-        if (j = 11 - hi0bits(getWord0(d2) & Frac_mask))
-            d2 /= 1 << j;
-#endif
+    Specifies the format of the currency symbol.
 
-        /* log(x)        ~=~ log(1.5) + (x-1.5)/1.5
-         * log10(x)         =  log(x) / log(10)
-         *                ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
-         * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
-         *
-         * This suggests computing an approximation k to log10(d) by
-         *
-         * k = (i - Bias)*0.301029995663981
-         *        + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
-         *
-         * We want k to be too large rather than too small.
-         * The error in the first-order Taylor series approximation
-         * is in our favor, so we just round up the constant enough
-         * to compensate for any error in the multiplication of
-         * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
-         * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
-         * adding 1e-13 to the constant term more than suffices.
-         * Hence we adjust the constant term to 0.1760912590558.
-         * (We could get a more accurate k by invoking log10,
-         *  but this is probably not worthwhile.)
-         */
-
-        i -= Bias;
-#ifdef IBM
-        i <<= 2;
-        i += j;
-#endif
-#ifndef Sudden_Underflow
-        denorm = 0;
-    }
-    else {
-        /* d is denormalized */
-
-        i = bbits + be + (Bias + (P-1) - 1);
-        x = i > 32  ? getWord0(d) << (64 - i) | getWord1(d) >> (i - 32)
-            : getWord1(d) << (32 - i);
-        d2 = x;
-        setWord0(&d2, getWord0(d2) - 31*Exp_msk1); /* adjust exponent */
-        i -= (Bias + (P-1) - 1) + 1;
-        denorm = 1;
+    \value CurrencyIsoCode a ISO-4217 code of the currency.
+    \value CurrencySymbol a currency symbol.
+    \value CurrencyDisplayName a user readable name of the currency.
+*/
+
+/*!
+    \since 4.8
+    Returns a currency symbol according to the \a format.
+*/
+QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
+        if (!res.isNull())
+            return res.toString();
     }
 #endif
-    ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
-    k = int(ds);
-    if (ds < 0. && ds != k)
-        k--;        /* want k = floor(ds) */
-    k_check = 1;
-    if (k >= 0 && k <= Ten_pmax) {
-        if (d < tens[k])
-            k--;
-        k_check = 0;
-    }
-    j = bbits - i - 1;
-    if (j >= 0) {
-        b2 = 0;
-        s2 = j;
-    }
-    else {
-        b2 = -j;
-        s2 = 0;
-    }
-    if (k >= 0) {
-        b5 = 0;
-        s5 = k;
-        s2 += k;
-    }
-    else {
-        b2 -= k;
-        b5 = -k;
-        s5 = 0;
-    }
-    if (mode < 0 || mode > 9)
-        mode = 0;
-    try_quick = 1;
-    if (mode > 5) {
-        mode -= 4;
-        try_quick = 0;
-    }
-    leftright = 1;
-    switch(mode) {
-    case 0:
-    case 1:
-        ilim = ilim1 = -1;
-        i = 18;
-        ndigits = 0;
-        break;
-    case 2:
-        leftright = 0;
-        /* no break */
-    case 4:
-        if (ndigits <= 0)
-            ndigits = 1;
-        ilim = ilim1 = i = ndigits;
-        break;
-    case 3:
-        leftright = 0;
-        /* no break */
-    case 5:
-        i = ndigits + k + 1;
-        ilim = i;
-        ilim1 = i - 1;
-        if (i <= 0)
-            i = 1;
-    }
-    QT_TRY {
-        *resultp = static_cast<char *>(malloc(i + 1));
-        Q_CHECK_PTR(*resultp);
-    } QT_CATCH(...) {
-        Bfree(b);
-        QT_RETHROW;
+    quint32 idx, size;
+    switch (format) {
+    case CurrencySymbol:
+        idx = d()->m_currency_symbol_idx;
+        size = d()->m_currency_symbol_size;
+        return getLocaleData(currency_symbol_data + idx, size);
+    case CurrencyDisplayName:
+        idx = d()->m_currency_display_name_idx;
+        size = d()->m_currency_display_name_size;
+        return getLocaleListData(currency_display_name_data + idx, size, 0);
+    case CurrencyIsoCode: {
+        int len = 0;
+        const QLocalePrivate *d = this->d();
+        for (; len < 3; ++len)
+            if (!d->m_currency_iso_code[len])
+                break;
+        return len ? QString::fromLatin1(d->m_currency_iso_code, len) : QString();
     }
-    s = s0 = *resultp;
-
-    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
-
-        /* Try to get by with floating-point arithmetic. */
-
-        i = 0;
-        d2 = d;
-        k0 = k;
-        ilim0 = ilim;
-        ieps = 2; /* conservative */
-        if (k > 0) {
-            ds = tens[k&0xf];
-            j = k >> 4;
-            if (j & Bletch) {
-                /* prevent overflows */
-                j &= Bletch - 1;
-                d /= bigtens[n_bigtens-1];
-                ieps++;
-            }
-            for(; j; j >>= 1, i++)
-                if (j & 1) {
-                    ieps++;
-                    ds *= bigtens[i];
-                }
-            d /= ds;
-        }
-        else if ((j1 = -k) != 0) {
-            d *= tens[j1 & 0xf];
-            for(j = j1 >> 4; j; j >>= 1, i++)
-                if (j & 1) {
-                    ieps++;
-                    d *= bigtens[i];
-                }
-        }
-        if (k_check && d < 1. && ilim > 0) {
-            if (ilim1 <= 0)
-                goto fast_failed;
-            ilim = ilim1;
-            k--;
-            d *= 10.;
-            ieps++;
-        }
-        eps = ieps*d + 7.;
-        setWord0(&eps, getWord0(eps) - (P-1)*Exp_msk1);
-        if (ilim == 0) {
-            S = mhi = 0;
-            d -= 5.;
-            if (d > eps)
-                goto one_digit;
-            if (d < -eps)
-                goto no_digits;
-            goto fast_failed;
-        }
-#ifndef No_leftright
-        if (leftright) {
-            /* Use Steele & White method of only
-             * generating digits needed.
-             */
-            eps = 0.5/tens[ilim-1] - eps;
-            for(i = 0;;) {
-                L = Long(d);
-                d -= L;
-                *s++ = '0' + int(L);
-                if (d < eps)
-                    goto ret1;
-                if (1. - d < eps)
-                    goto bump_up;
-                if (++i >= ilim)
-                    break;
-                eps *= 10.;
-                d *= 10.;
-            }
-        }
-        else {
-#endif
-            /* Generate ilim digits, then fix them up. */
-#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
-            // work around a bug on 64 bit IRIX gcc
-            double *t = (double *) tens;
-            eps *= t[ilim-1];
-#else
-            eps *= tens[ilim-1];
-#endif
-            for(i = 1;; i++, d *= 10.) {
-                L = Long(d);
-                d -= L;
-                *s++ = '0' + int(L);
-                if (i == ilim) {
-                    if (d > 0.5 + eps)
-                        goto bump_up;
-                    else if (d < 0.5 - eps) {
-                        while(*--s == '0') {}
-                        s++;
-                        goto ret1;
-                    }
-                    break;
-                }
-            }
-#ifndef No_leftright
-        }
-#endif
-    fast_failed:
-        s = s0;
-        d = d2;
-        k = k0;
-        ilim = ilim0;
     }
+    return QString();
+}
 
-    /* Do we have a "small" integer? */
+/*!
+    \fn QString QLocale::toCurrencyString(short) const
+    \since 4.8
+    \overload
+*/
 
-    if (be >= 0 && k <= Int_max) {
-        /* Yes. */
-        ds = tens[k];
-        if (ndigits < 0 && ilim <= 0) {
-            S = mhi = 0;
-            if (ilim < 0 || d <= 5*ds)
-                goto no_digits;
-            goto one_digit;
-        }
-        for(i = 1;; i++) {
-            L = Long(d / ds);
-            d -= L*ds;
-#ifdef Check_FLT_ROUNDS
-            /* If FLT_ROUNDS == 2, L will usually be high by 1 */
-            if (d < 0) {
-                L--;
-                d += ds;
-            }
-#endif
-            *s++ = '0' + int(L);
-            if (i == ilim) {
-                d += d;
-                if (d > ds || (d == ds && L & 1)) {
-                bump_up:
-                    while(*--s == '9')
-                        if (s == s0) {
-                            k++;
-                            *s = '0';
-                            break;
-                        }
-                    ++*s++;
-                }
-                break;
-            }
-            if ((d *= 10.) == g_double_zero)
-                break;
-        }
-        goto ret1;
-    }
+/*!
+    \fn QString QLocale::toCurrencyString(ushort) const
+    \since 4.8
+    \overload
+*/
 
-    m2 = b2;
-    m5 = b5;
-    mhi = mlo = 0;
-    if (leftright) {
-        if (mode < 2) {
-            i =
-#ifndef Sudden_Underflow
-                denorm ? be + (Bias + (P-1) - 1 + 1) :
-#endif
-#ifdef IBM
-                1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
-#else
-            1 + P - bbits;
-#endif
-        }
-        else {
-            j = ilim - 1;
-            if (m5 >= j)
-                m5 -= j;
-            else {
-                s5 += j -= m5;
-                b5 += j;
-                m5 = 0;
-            }
-            if ((i = ilim) < 0) {
-                m2 -= i;
-                i = 0;
-            }
-        }
-        b2 += i;
-        s2 += i;
-        mhi = i2b(1);
-    }
-    if (m2 > 0 && s2 > 0) {
-        i = m2 < s2 ? m2 : s2;
-        b2 -= i;
-        m2 -= i;
-        s2 -= i;
-    }
-    if (b5 > 0) {
-        if (leftright) {
-            if (m5 > 0) {
-                mhi = pow5mult(mhi, m5);
-                b1 = mult(mhi, b);
-                Bfree(b);
-                b = b1;
-            }
-            if ((j = b5 - m5) != 0)
-                b = pow5mult(b, j);
-        }
-        else
-            b = pow5mult(b, b5);
-    }
-    S = i2b(1);
-    if (s5 > 0)
-        S = pow5mult(S, s5);
+/*!
+    \fn QString QLocale::toCurrencyString(int) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(uint) const
+    \since 4.8
+    \overload
+*/
+/*!
+    \fn QString QLocale::toCurrencyString(float) const
+    \since 4.8
+    \overload
+*/
 
-    /* Check for special case that d is a normalized power of 2. */
+/*!
+    \since 4.8
 
-    if (mode < 2) {
-        if (!getWord1(d) && !(getWord0(d) & Bndry_mask)
-#ifndef Sudden_Underflow
-            && getWord0(d) & Exp_mask
-#endif
-            ) {
-            /* The special case */
-            b2 += Log2P;
-            s2 += Log2P;
-            spec_case = 1;
-        }
-        else
-            spec_case = 0;
+    Returns a localized string representation of \a value as a currency.
+*/
+QString QLocale::toCurrencyString(qlonglong value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
     }
-
-    /* Arrange for convenient computation of quotients:
-     * shift left if necessary so divisor has 4 leading 0 bits.
-     *
-     * Perhaps we should just compute leading 28 bits of S once
-     * and for all and pass them and a shift to quorem, so it
-     * can do shifts and ors to compute the numerator for q.
-     */
-#ifdef Pack_32
-    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
-        i = 32 - i;
-#else
-    if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
-        i = 16 - i;
 #endif
-    if (i > 4) {
-        i -= 4;
-        b2 += i;
-        m2 += i;
-        s2 += i;
-    }
-    else if (i < 4) {
-        i += 28;
-        b2 += i;
-        m2 += i;
-        s2 += i;
-    }
-    if (b2 > 0)
-        b = lshift(b, b2);
-    if (s2 > 0)
-        S = lshift(S, s2);
-    if (k_check) {
-        if (cmp(b,S) < 0) {
-            k--;
-            b = multadd(b, 10, 0);        /* we botched the k estimate */
-            if (leftright)
-                mhi = multadd(mhi, 10, 0);
-            ilim = ilim1;
-        }
-    }
-    if (ilim <= 0 && mode > 2) {
-        if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
-            /* no digits, fcvt style */
-        no_digits:
-            k = -1 - ndigits;
-            goto ret;
-        }
-    one_digit:
-        *s++ = '1';
-        k++;
-        goto ret;
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    if (d->m_currency_negative_format_size && value < 0) {
+        idx = d->m_currency_negative_format_idx;
+        size = d->m_currency_negative_format_size;
+        value = -value;
     }
-    if (leftright) {
-        if (m2 > 0)
-            mhi = lshift(mhi, m2);
-
-        /* Compute mlo -- check for special case
-         * that d is a normalized power of 2.
-         */
-
-        mlo = mhi;
-        if (spec_case) {
-            mhi = Balloc(mhi->k);
-            Bcopy(mhi, mlo);
-            mhi = lshift(mhi, Log2P);
-        }
+    QString str = d->longLongToString(value);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
+}
 
-        for(i = 1;;i++) {
-            dig = quorem(b,S) + '0';
-            /* Do we yet have the shortest decimal string
-             * that will round to d?
-             */
-            j = cmp(b, mlo);
-            delta = diff(S, mhi);
-            j1 = delta->sign ? 1 : cmp(b, delta);
-            Bfree(delta);
-#ifndef ROUND_BIASED
-            if (j1 == 0 && !mode && !(getWord1(d) & 1)) {
-                if (dig == '9')
-                    goto round_9_up;
-                if (j > 0)
-                    dig++;
-                *s++ = dig;
-                goto ret;
-            }
-#endif
-            if (j < 0 || (j == 0 && !mode
-#ifndef ROUND_BIASED
-                          && !(getWord1(d) & 1)
-#endif
-                          )) {
-                if (j1 > 0) {
-                    b = lshift(b, 1);
-                    j1 = cmp(b, S);
-                    if ((j1 > 0 || (j1 == 0 && dig & 1))
-                        && dig++ == '9')
-                        goto round_9_up;
-                }
-                *s++ = dig;
-                goto ret;
-            }
-            if (j1 > 0) {
-                if (dig == '9') { /* possible if i == 1 */
-                round_9_up:
-                    *s++ = '9';
-                    goto roundoff;
-                }
-                *s++ = dig + 1;
-                goto ret;
-            }
-            *s++ = dig;
-            if (i == ilim)
-                break;
-            b = multadd(b, 10, 0);
-            if (mlo == mhi)
-                mlo = mhi = multadd(mhi, 10, 0);
-            else {
-                mlo = multadd(mlo, 10, 0);
-                mhi = multadd(mhi, 10, 0);
-            }
-        }
+/*!
+    \since 4.8
+    \overload
+*/
+QString QLocale::toCurrencyString(qulonglong value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
     }
-    else
-        for(i = 1;; i++) {
-            *s++ = dig = quorem(b,S) + '0';
-            if (i >= ilim)
-                break;
-            b = multadd(b, 10, 0);
-        }
+#endif
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    QString str = d->unsLongLongToString(value);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
+}
 
-    /* Round off last digit */
-
-    b = lshift(b, 1);
-    j = cmp(b, S);
-    if (j > 0 || (j == 0 && dig & 1)) {
-    roundoff:
-        while(*--s == '9')
-            if (s == s0) {
-                k++;
-                *s++ = '1';
-                goto ret;
-            }
-        ++*s++;
-    }
-    else {
-        while(*--s == '0') {}
-        s++;
-    }
- ret:
-    Bfree(S);
-    if (mhi) {
-        if (mlo && mlo != mhi)
-            Bfree(mlo);
-        Bfree(mhi);
+QString QLocale::toCurrencyString(double value) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        if (!res.isNull())
+            return res.toString();
     }
- ret1:
-    Bfree(b);
-    if (s == s0) {                                /* don't return empty string */
-        *s++ = '0';
-        k = 0;
+#endif
+    const QLocalePrivate *d = this->d();
+    quint8 idx = d->m_currency_format_idx;
+    quint8 size = d->m_currency_format_size;
+    if (d->m_currency_negative_format_size && value < 0) {
+        idx = d->m_currency_negative_format_idx;
+        size = d->m_currency_negative_format_size;
+        value = -value;
     }
-    *s = 0;
-    *decpt = k + 1;
-    if (rve)
-        *rve = s;
-    return s0;
+    QString str = d->doubleToString(value, d->m_currency_digits,
+                                    QLocalePrivate::DFDecimal);
+    QString symbol = currencySymbol();
+    if (symbol.isEmpty())
+        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString format = getLocaleData(currency_format_data + idx, size);
+    return format.arg(str, symbol);
 }
-#else
-// NOT thread safe!
-
-#include <errno.h>
-
-Q_CORE_EXPORT char *qdtoa( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
-{
-    if(rve)
-      *rve = 0;
 
-    char *res;
-    if (mode == 0)
-        ndigits = 80;
+/*!
+    \since 4.8
 
-    if (mode == 3)
-        res = fcvt(d, ndigits, decpt, sign);
-    else
-        res = ecvt(d, ndigits, decpt, sign);
-
-    int n = qstrlen(res);
-    if (mode == 0) { // remove trailing 0's
-        const int stop = qMax(1, *decpt);
-        int i;
-        for (i = n-1; i >= stop; --i) {
-            if (res[i] != '0')
-                break;
-        }
-        n = i + 1;
-    }
-    *resultp = static_cast<char*>(malloc(n + 1));
-    Q_CHECK_PTR(resultp);
-    qstrncpy(*resultp, res, n + 1);
-    return *resultp;
-}
+    Returns a sorted list of locale names that could be used for translation
+    of messages presented to the user.
 
-Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
+    \sa QTranslator
+*/
+QStringList QLocale::uiLanguages() const
 {
-    errno = 0;
-    double ret = strtod((char*)s00, (char**)se);
-    if (ok) {
-      if((ret == 0.0l && errno == ERANGE)
-         || ret == HUGE_VAL || ret == -HUGE_VAL)
-        *ok = false;
-      else
-        *ok = true; // the result will be that we don't report underflow in this case
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
+        if (!res.isNull()) {
+            QStringList result = res.toStringList();
+            if (!result.isEmpty())
+                return result;
+        }
     }
-    return ret;
+#endif
+    return QStringList(name());
 }
-#endif // QT_QLOCALE_USES_FCVT
 
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index e62e2d9..18c6db3 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -107,7 +107,7 @@ public:
 
 private:
     QSystemLocale(bool);
-    friend class QSystemLocaleData;
+    friend QSystemLocale *QSystemLocale_globalSystemLocale();
 };
 #endif
 
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
new file mode 100644
index 0000000..3231951
--- /dev/null
+++ b/src/corelib/tools/qlocale.qdoc
@@ -0,0 +1,773 @@
+
+/*!
+    \class QLocale
+    \brief The QLocale class converts between numbers and their
+    string representations in various languages.
+
+    \reentrant
+    \ingroup i18n
+    \ingroup string-processing
+    \ingroup shared
+
+
+    QLocale is initialized with a language/country pair in its
+    constructor and offers number-to-string and string-to-number
+    conversion functions similar to those in QString.
+
+    Example:
+
+    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 0
+
+    QLocale supports the concept of a default locale, which is
+    determined from the system's locale settings at application
+    startup. The default locale can be changed by calling the
+    static member setDefault(). Setting the default locale has the
+    following effects:
+
+    \list
+    \i If a QLocale object is constructed with the default constructor,
+       it will use the default locale's settings.
+    \i QString::toInt(), QString::toDouble(), etc., interpret the
+       string according to the default locale. If this fails, it
+       falls back on the "C" locale.
+    \i QString::arg() uses the default locale to format a number when
+       its position specifier in the format string contains an 'L',
+       e.g. "%L1".
+    \endlist
+
+    The following example illustrates how to use QLocale directly:
+
+    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 1
+
+    When a language/country pair is specified in the constructor, one
+    of three things can happen:
+
+    \list
+    \i If the language/country pair is found in the database, it is used.
+    \i If the language is found but the country is not, or if the country
+       is \c AnyCountry, the language is used with the most
+       appropriate available country (for example, Germany for German),
+    \i If neither the language nor the country are found, QLocale
+       defaults to the default locale (see setDefault()).
+    \endlist
+
+    Use language() and country() to determine the actual language and
+    country values used.
+
+    An alternative method for constructing a QLocale object is by
+    specifying the locale name.
+
+    \snippet doc/src/snippets/code/src_corelib_tools_qlocale.cpp 2
+
+    This constructor converts the locale name to a language/country
+    pair; it does not use the system locale database.
+
+    QLocale's data is based on Common Locale Data Repository v1.8.1.
+
+    The double-to-string and string-to-double conversion functions are
+    covered by the following licenses:
+
+    \legalese
+    Copyright (c) 1991 by AT&T.
+
+    Permission to use, copy, modify, and distribute this software for any
+    purpose without fee is hereby granted, provided that this entire notice
+    is included in all copies of any software which is or includes a copy
+    or modification of this software and in all copies of the supporting
+    documentation for such software.
+
+    THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+    WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
+    REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+    OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+
+    This product includes software developed by the University of
+    California, Berkeley and its contributors.
+
+    \sa QString::arg(), QString::toInt(), QString::toDouble()
+*/
+
+/*!
+    \enum QLocale::Language
+
+    This enumerated type is used to specify a language.
+
+    \value C The "C" locale is identical in behavior to English/UnitedStates.
+    \value Abkhazian
+    \value Afan
+    \value Afar
+    \value Afrikaans
+    \value Albanian
+    \value Amharic
+    \value Arabic
+    \value Armenian
+    \value Assamese
+    \value Aymara
+    \value Azerbaijani
+    \value Bashkir
+    \value Basque
+    \value Bengali
+    \value Bhutani
+    \value Bihari
+    \value Bislama
+    \value Bosnian
+    \value Breton
+    \value Bulgarian
+    \value Burmese
+    \value Byelorussian
+    \value Cambodian
+    \value Catalan
+    \value Chinese
+    \value Cornish
+    \value Corsican
+    \value Croatian
+    \value Czech
+    \value Danish
+    \value Divehi
+    \value Dutch
+    \value English
+    \value Esperanto
+    \value Estonian
+    \value Faroese
+    \value FijiLanguage
+    \value Finnish
+    \value French
+    \value Frisian
+    \value Gaelic
+    \value Galician
+    \value Georgian
+    \value German
+    \value Greek
+    \value Greenlandic
+    \value Guarani
+    \value Gujarati
+    \value Hausa
+    \value Hebrew
+    \value Hindi
+    \value Hungarian
+    \value Icelandic
+    \value Indonesian
+    \value Interlingua
+    \value Interlingue
+    \value Inuktitut
+    \value Inupiak
+    \value Irish
+    \value Italian
+    \value Japanese
+    \value Javanese
+    \value Kannada
+    \value Kashmiri
+    \value Kazakh
+    \value Kinyarwanda
+    \value Kirghiz
+    \value Korean
+    \value Kurdish
+    \value Kurundi
+    \value Laothian
+    \value Latin
+    \value Latvian
+    \value Lingala
+    \value Lithuanian
+    \value Macedonian
+    \value Malagasy
+    \value Malay
+    \value Malayalam
+    \value Maltese
+    \value Manx
+    \value Maori
+    \value Marathi
+    \value Moldavian
+    \value Mongolian
+    \value NauruLanguage
+    \value Nepali
+    \value Norwegian
+    \value NorwegianBokmal
+    \value Nynorsk Obsolete, please use NorwegianNynorsk
+    \value NorwegianNynorsk
+    \value Occitan
+    \value Oriya
+    \value Pashto
+    \value Persian
+    \value Polish
+    \value Portuguese
+    \value Punjabi
+    \value Quechua
+    \value RhaetoRomance
+    \value Romanian
+    \value Russian
+    \value Samoan
+    \value Sangho
+    \value Sanskrit
+    \value Serbian
+    \value SerboCroatian
+    \value Sesotho
+    \value Setswana
+    \value Shona
+    \value Sindhi
+    \value Singhalese
+    \value Siswati
+    \value Slovak
+    \value Slovenian
+    \value Somali
+    \value Spanish
+    \value Sundanese
+    \value Swahili
+    \value Swedish
+    \value Tagalog
+    \value Tajik
+    \value Tamil
+    \value Tatar
+    \value Telugu
+    \value Thai
+    \value Tibetan
+    \value Tigrinya
+    \value TongaLanguage
+    \value Tsonga
+    \value Turkish
+    \value Turkmen
+    \value Twi
+    \value Uigur
+    \value Ukrainian
+    \value Urdu
+    \value Uzbek
+    \value Vietnamese
+    \value Volapuk
+    \value Welsh
+    \value Wolof
+    \value Xhosa
+    \value Yiddish
+    \value Yoruba
+    \value Zhuang
+    \value Zulu
+    \value Bosnian
+    \value Divehi
+    \value Manx
+    \value Cornish
+    \value Akan
+    \value Konkani
+    \value Ga
+    \value Igbo
+    \value Kamba
+    \value Syriac
+    \value Blin
+    \value Geez
+    \value Koro
+    \value Sidamo
+    \value Atsam
+    \value Tigre
+    \value Jju
+    \value Friulian
+    \value Venda
+    \value Ewe
+    \value Walamo
+    \value Hawaiian
+    \value Tyap
+    \value Chewa
+    \value Filipino
+    \value SwissGerman
+    \value SichuanYi
+    \value Kpelle
+    \value LowGerman
+    \value SouthNdebele
+    \value NorthernSotho
+    \value NorthernSami
+    \value Taroko
+    \value Gusii
+    \value Taita
+    \value Fulah
+    \value Kikuyu
+    \value Samburu
+    \value Sena
+    \value NorthNdebele
+    \value Rombo
+    \value Tachelhit
+    \value Kabyle
+    \value Nyankole
+    \value Bena
+    \value Vunjo
+    \value Bambara
+    \value Embu
+    \value Cherokee
+    \value Morisyen
+    \value Makonde
+    \value Langi
+    \value Ganda
+    \value Bemba
+    \value Kabuverdianu
+    \value Meru
+    \value Kalenjin
+    \value Nama
+    \value Machame
+    \value Colognian
+    \value Masai
+    \value Soga
+    \value Luyia
+    \value Asu
+    \value Teso
+    \value Saho
+    \value KoyraChiini
+    \value Rwa
+    \value Luo
+    \value Chiga
+    \value CentralMoroccoTamazight
+    \value KoyraboroSenni
+    \value Shambala
+    \omitvalue LastLanguage
+
+    \sa language()
+*/
+
+/*!
+    \enum QLocale::Country
+
+    This enumerated type is used to specify a country.
+
+    \value AnyCountry
+    \value Afghanistan
+    \value Albania
+    \value Algeria
+    \value AmericanSamoa
+    \value Andorra
+    \value Angola
+    \value Anguilla
+    \value Antarctica
+    \value AntiguaAndBarbuda
+    \value Argentina
+    \value Armenia
+    \value Aruba
+    \value Australia
+    \value Austria
+    \value Azerbaijan
+    \value Bahamas
+    \value Bahrain
+    \value Bangladesh
+    \value Barbados
+    \value Belarus
+    \value Belgium
+    \value Belize
+    \value Benin
+    \value Bermuda
+    \value Bhutan
+    \value Bolivia
+    \value BosniaAndHerzegowina
+    \value Botswana
+    \value BouvetIsland
+    \value Brazil
+    \value BritishIndianOceanTerritory
+    \value BruneiDarussalam
+    \value Bulgaria
+    \value BurkinaFaso
+    \value Burundi
+    \value Cambodia
+    \value Cameroon
+    \value Canada
+    \value CapeVerde
+    \value CaymanIslands
+    \value CentralAfricanRepublic
+    \value Chad
+    \value Chile
+    \value China
+    \value ChristmasIsland
+    \value CocosIslands
+    \value Colombia
+    \value Comoros
+    \value DemocraticRepublicOfCongo
+    \value PeoplesRepublicOfCongo
+    \value CookIslands
+    \value CostaRica
+    \value IvoryCoast
+    \value Croatia
+    \value Cuba
+    \value Cyprus
+    \value CzechRepublic
+    \value Denmark
+    \value Djibouti
+    \value Dominica
+    \value DominicanRepublic
+    \value EastTimor
+    \value Ecuador
+    \value Egypt
+    \value ElSalvador
+    \value EquatorialGuinea
+    \value Eritrea
+    \value Estonia
+    \value Ethiopia
+    \value FalklandIslands
+    \value FaroeIslands
+    \value FijiCountry
+    \value Finland
+    \value France
+    \value MetropolitanFrance
+    \value FrenchGuiana
+    \value FrenchPolynesia
+    \value FrenchSouthernTerritories
+    \value Gabon
+    \value Gambia
+    \value Georgia
+    \value Germany
+    \value Ghana
+    \value Gibraltar
+    \value Greece
+    \value Greenland
+    \value Grenada
+    \value Guadeloupe
+    \value Guam
+    \value Guatemala
+    \value Guinea
+    \value GuineaBissau
+    \value Guyana
+    \value Haiti
+    \value HeardAndMcDonaldIslands
+    \value Honduras
+    \value HongKong
+    \value Hungary
+    \value Iceland
+    \value India
+    \value Indonesia
+    \value Iran
+    \value Iraq
+    \value Ireland
+    \value Israel
+    \value Italy
+    \value Jamaica
+    \value Japan
+    \value Jordan
+    \value Kazakhstan
+    \value Kenya
+    \value Kiribati
+    \value DemocraticRepublicOfKorea
+    \value RepublicOfKorea
+    \value Kuwait
+    \value Kyrgyzstan
+    \value Lao
+    \value Latvia
+    \value Lebanon
+    \value Lesotho
+    \value Liberia
+    \value LibyanArabJamahiriya
+    \value Liechtenstein
+    \value Lithuania
+    \value Luxembourg
+    \value Macau
+    \value Macedonia
+    \value Madagascar
+    \value Malawi
+    \value Malaysia
+    \value Maldives
+    \value Mali
+    \value Malta
+    \value MarshallIslands
+    \value Martinique
+    \value Mauritania
+    \value Mauritius
+    \value Mayotte
+    \value Mexico
+    \value Micronesia
+    \value Moldova
+    \value Monaco
+    \value Mongolia
+    \value Montserrat
+    \value Morocco
+    \value Mozambique
+    \value Myanmar
+    \value Namibia
+    \value NauruCountry
+    \value Nepal
+    \value Netherlands
+    \value NetherlandsAntilles
+    \value NewCaledonia
+    \value NewZealand
+    \value Nicaragua
+    \value Niger
+    \value Nigeria
+    \value Niue
+    \value NorfolkIsland
+    \value NorthernMarianaIslands
+    \value Norway
+    \value Oman
+    \value Pakistan
+    \value Palau
+    \value PalestinianTerritory
+    \value Panama
+    \value PapuaNewGuinea
+    \value Paraguay
+    \value Peru
+    \value Philippines
+    \value Pitcairn
+    \value Poland
+    \value Portugal
+    \value PuertoRico
+    \value Qatar
+    \value Reunion
+    \value Romania
+    \value RussianFederation
+    \value Rwanda
+    \value SaintKittsAndNevis
+    \value StLucia
+    \value StVincentAndTheGrenadines
+    \value Samoa
+    \value SanMarino
+    \value SaoTomeAndPrincipe
+    \value SaudiArabia
+    \value Senegal
+    \value SerbiaAndMontenegro
+    \value Seychelles
+    \value SierraLeone
+    \value Singapore
+    \value Slovakia
+    \value Slovenia
+    \value SolomonIslands
+    \value Somalia
+    \value SouthAfrica
+    \value SouthGeorgiaAndTheSouthSandwichIslands
+    \value Spain
+    \value SriLanka
+    \value StHelena
+    \value StPierreAndMiquelon
+    \value Sudan
+    \value Suriname
+    \value SvalbardAndJanMayenIslands
+    \value Swaziland
+    \value Sweden
+    \value Switzerland
+    \value SyrianArabRepublic
+    \value Taiwan
+    \value Tajikistan
+    \value Tanzania
+    \value Thailand
+    \value Togo
+    \value Tokelau
+    \value TongaCountry
+    \value TrinidadAndTobago
+    \value Tunisia
+    \value Turkey
+    \value Turkmenistan
+    \value TurksAndCaicosIslands
+    \value Tuvalu
+    \value Uganda
+    \value Ukraine
+    \value UnitedArabEmirates
+    \value UnitedKingdom
+    \value UnitedStates
+    \value UnitedStatesMinorOutlyingIslands
+    \value Uruguay
+    \value Uzbekistan
+    \value Vanuatu
+    \value VaticanCityState
+    \value Venezuela
+    \value VietNam
+    \value BritishVirginIslands
+    \value USVirginIslands
+    \value WallisAndFutunaIslands
+    \value WesternSahara
+    \value Yemen
+    \value Yugoslavia
+    \value Zambia
+    \value Zimbabwe
+    \value SerbiaAndMontenegro
+    \value Montenegro
+    \value Serbia
+    \value SaintBarthelemy
+    \value SaintMartin
+    \value LatinAmericaAndTheCaribbean
+    \omitvalue LastCountry
+
+    \sa country()
+*/
+
+/*!
+    \enum QLocale::FormatType
+
+    This enum describes the types of format that can be used when
+    converting QDate and QTime objects to strings.
+
+    \value LongFormat The long version of day and month names; for
+    example, returning "January" as a month name.
+
+    \value ShortFormat The short version of day and month names; for
+    example, returning "Jan" as a month name.
+
+    \value NarrowFormat A special version of day and month names for
+    use when space is limited; for example, returning "J" as a month
+    name. Note that the narrow format might contain the same text for
+    different months and days or it can even be an empty string if the
+    locale doesn't support narrow names, so you should avoid using it
+    for date formatting. Also, for the system locale this format is
+    the same as ShortFormat.
+*/
+
+/*!
+    \enum QLocale::NumberOption
+
+    This enum defines a set of options for number-to-string and string-to-number
+    conversions. They can be retrieved with numberOptions() and set with
+    setNumberOptions().
+
+    \value OmitGroupSeparator If this option is set, the number-to-string functions
+            will not insert group separators in their return values. The default
+            is to insert group separators.
+    \value RejectGroupSeparator If this option is set, the string-to-number functions
+            will fail if they encounter group separators in their input. The default
+            is to accept numbers containing correctly placed group separators.
+
+    \sa setNumberOptions() numberOptions()
+*/
+
+/*!
+    \enum QLocale::MeasurementSystem
+
+    This enum defines which units are used for measurement.
+
+    \value MetricSystem This value indicates metric units, such as meters,
+            centimeters and millimeters.
+    \value ImperialSystem This value indicates imperial units, such as inches and
+            miles. There are several distinct imperial systems in the world; this
+            value stands for the official United States imperial units.
+
+    \since 4.4
+*/
+
+
+/*!
+    \fn bool QLocale::operator==(const QLocale &other) const
+
+    Returns true if the QLocale object is the same as the \a other
+    locale specified; otherwise returns false.
+*/
+
+/*!
+    \fn bool QLocale::operator!=(const QLocale &other) const
+
+    Returns true if the QLocale object is not the same as the \a other
+    locale specified; otherwise returns false.
+*/
+
+/*!
+    \enum QLocale::QuotationStyle
+
+    This enum defines a set of possible styles for locale specific quotation.
+
+    \value StandardQuotation If this option is set, the standard quotation marks
+            will be used to quote strings.
+    \value AlternateQuotation If this option is set, the alternate quotation marks
+            will be used to quote strings.
+
+    \since 4.8
+
+    \sa quoteString()
+*/
+
+/*!
+    \class QSystemLocale
+    \brief The QSystemLocale class can be used to finetune the system locale
+    of the user.
+    \since 4.2
+
+    \ingroup i18n
+
+    \warning This class is only useful in very rare cases. Usually QLocale offers
+    all the functionality required for application development.
+
+    QSystemLocale allows to override the values provided by the system
+    locale (QLocale::system()).
+
+    \sa QLocale
+*/
+
+/*!
+  \enum QSystemLocale::QueryType
+
+  Specifies the type of information queried by query(). For each value
+  the type of information to return from the query() method is listed.
+
+  \value LanguageId a uint specifying the language.
+  \value CountryId a uint specifying the country.
+  \value DecimalPoint a QString specifying the decimal point.
+  \value GroupSeparator a QString specifying the group separator.
+  \value ZeroDigit a QString specifying the zero digit.
+  \value NegativeSign a QString specifying the minus sign.
+  \value PositiveSign a QString specifying the plus sign.
+  \value DateFormatLong a QString specifying the long date format
+  \value DateFormatShort a QString specifying the short date format
+  \value TimeFormatLong a QString specifying the long time format
+  \value TimeFormatShort a QString specifying the short time format
+  \value DayNameLong a QString specifying the name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
+  \value DayNameShort a QString specifying the short name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
+  \value MonthNameLong a QString specifying the name of a month. the in variant contains an integer between 1 and 12
+  \value MonthNameShort a QString specifying the short name of a month. the in variant contains an integer between 1 and 12
+  \value DateToStringLong converts the QDate stored in the in variant to a QString using the long date format
+  \value DateToStringShort converts the QDate stored in the in variant to a QString using the short date format
+  \value TimeToStringLong converts the QTime stored in the in variant to a QString using the long time format
+  \value TimeToStringShort converts the QTime stored in the in variant to a QString using the short time format
+  \value DateTimeFormatLong a QString specifying the long date time format
+  \value DateTimeFormatShort a QString specifying the short date time format
+  \value DateTimeToStringLong converts the QDateTime in the in variant to a QString using the long datetime format
+  \value DateTimeToStringShort converts the QDateTime in the in variant to a QString using the short datetime format
+  \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
+  \value AMText a string that represents the system AM designator associated with a 12-hour clock.
+  \value PMText a string that represents the system PM designator associated with a 12-hour clock.
+  \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
+  \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
+  \value FormatCurrency a localized string representation of a number with a currency symbol.
+  \value UILanguages a list of strings representing locale names that could be used for UI translation.
+  \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
+  \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
+*/
+
+/*!
+\fn QString QLocale::toString(short i) const
+
+\overload
+
+\sa toShort()
+*/
+
+/*!
+\fn QString QLocale::toString(ushort i) const
+
+\overload
+
+\sa toUShort()
+*/
+
+/*!
+\fn QString QLocale::toString(int i) const
+
+\overload
+
+\sa toInt()
+*/
+
+/*!
+\fn QString QLocale::toString(uint i) const
+
+\overload
+
+\sa toUInt()
+*/
+
+/*
+\fn QString QLocale::toString(long i) const
+
+\overload
+
+\sa  toLong()
+*/
+
+/*
+\fn QString QLocale::toString(ulong i) const
+
+\overload
+
+\sa toULong()
+*/
+
+/*!
+\fn QString QLocale::toString(float i, char f = 'g', int prec = 6) const
+
+\overload
+
+\a f and \a prec have the same meaning as in QString::number(double, char, int).
+
+\sa toDouble()
+*/
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
new file mode 100644
index 0000000..cdbf93d
--- /dev/null
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -0,0 +1,485 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qlocale_p.h"
+
+#include "qstringlist.h"
+#include "qvariant.h"
+#include "qdatetime.h"
+
+#if !defined(QWS) && defined(Q_OS_MAC)
+#   include "private/qcore_mac_p.h"
+#   include <CoreFoundation/CoreFoundation.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/******************************************************************************
+** Wrappers for Mac locale system functions
+*/
+
+static QByteArray envVarLocale()
+{
+    static QByteArray lang = 0;
+#ifdef Q_OS_UNIX
+    lang = qgetenv("LC_ALL");
+    if (lang.isNull())
+        lang = qgetenv("LC_NUMERIC");
+    if (lang.isNull())
+#endif
+        lang = qgetenv("LANG");
+    return lang;
+}
+
+static QByteArray getMacLocaleName()
+{
+    QByteArray result = envVarLocale();
+
+    QChar lang[3];
+    QChar cntry[3];
+    if (result.isEmpty() || result != "C"
+            && !splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) {
+        QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
+        CFStringRef locale = CFLocaleGetIdentifier(l);
+        result = QCFString::toQString(locale).toUtf8();
+    }
+    return result;
+}
+
+static QString macMonthName(int month, bool short_format)
+{
+    month -= 1;
+    if (month < 0 || month > 11)
+        return QString();
+
+    QCFType<CFDateFormatterRef> formatter
+        = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
+                                kCFDateFormatterNoStyle,  kCFDateFormatterNoStyle);
+    QCFType<CFArrayRef> values
+        = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
+                                  short_format ? kCFDateFormatterShortMonthSymbols
+                                               : kCFDateFormatterMonthSymbols));
+    if (values != 0) {
+        CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, month));
+        return QCFString::toQString(cfstring);
+    }
+    return QString();
+}
+
+static QString macDayName(int day, bool short_format)
+{
+    if (day < 1 || day > 7)
+        return QString();
+
+    QCFType<CFDateFormatterRef> formatter
+        = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
+                                kCFDateFormatterNoStyle,  kCFDateFormatterNoStyle);
+    QCFType<CFArrayRef> values = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
+                                            short_format ? kCFDateFormatterShortWeekdaySymbols
+                                                         : kCFDateFormatterWeekdaySymbols));
+    if (values != 0) {
+        CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, day % 7));
+        return QCFString::toQString(cfstring);
+    }
+    return QString();
+}
+
+static QString macDateToString(const QDate &date, bool short_format)
+{
+    CFGregorianDate macGDate;
+    macGDate.year = date.year();
+    macGDate.month = date.month();
+    macGDate.day = date.day();
+    macGDate.hour = 0;
+    macGDate.minute = 0;
+    macGDate.second = 0.0;
+    QCFType<CFDateRef> myDate
+        = CFDateCreate(0, CFGregorianDateGetAbsoluteTime(macGDate,
+                                                         QCFType<CFTimeZoneRef>(CFTimeZoneCopyDefault())));
+    QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
+    CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle : kCFDateFormatterLongStyle;
+    QCFType<CFDateFormatterRef> myFormatter
+        = CFDateFormatterCreate(kCFAllocatorDefault,
+                                mylocale, style,
+                                kCFDateFormatterNoStyle);
+    return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
+}
+
+static QString macTimeToString(const QTime &time, bool short_format)
+{
+    CFGregorianDate macGDate;
+    // Assume this is local time and the current date
+    QDate dt = QDate::currentDate();
+    macGDate.year = dt.year();
+    macGDate.month = dt.month();
+    macGDate.day = dt.day();
+    macGDate.hour = time.hour();
+    macGDate.minute = time.minute();
+    macGDate.second = time.second();
+    QCFType<CFDateRef> myDate
+        = CFDateCreate(0, CFGregorianDateGetAbsoluteTime(macGDate,
+                                                         QCFType<CFTimeZoneRef>(CFTimeZoneCopyDefault())));
+
+    QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
+    CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle :  kCFDateFormatterLongStyle;
+    QCFType<CFDateFormatterRef> myFormatter = CFDateFormatterCreate(kCFAllocatorDefault,
+                                                                    mylocale,
+                                                                    kCFDateFormatterNoStyle,
+                                                                    style);
+    return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
+}
+
+static QString macToQtFormat(const QString &sys_fmt)
+{
+    QString result;
+    int i = 0;
+
+    while (i < sys_fmt.size()) {
+        if (sys_fmt.at(i).unicode() == '\'') {
+            QString text = readEscapedFormatString(sys_fmt, &i);
+            if (text == QLatin1String("'"))
+                result += QLatin1String("''");
+            else
+                result += QLatin1Char('\'') + text + QLatin1Char('\'');
+            continue;
+        }
+
+        QChar c = sys_fmt.at(i);
+        int repeat = repeatCount(sys_fmt, i);
+
+        switch (c.unicode()) {
+            case 'G': // Qt doesn't support these :(
+            case 'Y':
+            case 'D':
+            case 'F':
+            case 'w':
+            case 'W':
+            case 'g':
+                break;
+
+            case 'u': // extended year - use 'y'
+                if (repeat < 4)
+                    result += QLatin1String("yy");
+                else
+                    result += QLatin1String("yyyy");
+                break;
+            case 'S': // fractional second
+                if (repeat < 3)
+                    result += QLatin1Char('z');
+                else
+                    result += QLatin1String("zzz");
+                break;
+            case 'E':
+                if (repeat <= 3)
+                    result += QLatin1String("ddd");
+                else
+                    result += QLatin1String("dddd");
+                break;
+            case 'e':
+                if (repeat >= 2)
+                    result += QLatin1String("dd");
+                else
+                    result += QLatin1Char('d');
+                break;
+            case 'a':
+                result += QLatin1String("AP");
+                break;
+            case 'k':
+                result += QString(repeat, QLatin1Char('H'));
+                break;
+            case 'K':
+                result += QString(repeat, QLatin1Char('h'));
+                break;
+            case 'z':
+            case 'Z':
+            case 'v':
+                result += QLatin1Char('t');
+                break;
+            default:
+                result += QString(repeat, c);
+                break;
+        }
+
+        i += repeat;
+    }
+
+    return result;
+}
+
+QString getMacDateFormat(CFDateFormatterStyle style)
+{
+    QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
+    QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
+                                                                  l, style, kCFDateFormatterNoStyle);
+    return macToQtFormat(QCFString::toQString(CFDateFormatterGetFormat(formatter)));
+}
+
+static QString getMacTimeFormat(CFDateFormatterStyle style)
+{
+    QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
+    QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
+                                                                  l, kCFDateFormatterNoStyle, style);
+    return macToQtFormat(QCFString::toQString(CFDateFormatterGetFormat(formatter)));
+}
+
+static QString getCFLocaleValue(CFStringRef key)
+{
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    CFTypeRef value = CFLocaleGetValue(locale, key);
+    return QCFString::toQString(CFStringRef(static_cast<CFTypeRef>(value)));
+}
+
+static QLocale::MeasurementSystem macMeasurementSystem()
+{
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    CFStringRef system = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleMeasurementSystem));
+    if (QCFString::toQString(system) == QLatin1String("Metric")) {
+        return QLocale::MetricSystem;
+    } else {
+        return QLocale::ImperialSystem;
+    }
+}
+
+
+static quint8 macFirstDayOfWeek()
+{
+    QCFType<CFCalendarRef> calendar = CFCalendarCopyCurrent();
+    quint8 day = static_cast<quint8>(CFCalendarGetFirstWeekday(calendar))-1;
+    if (day == 0)
+        day = 7;
+    return day;
+}
+
+static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
+{
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    switch (format) {
+    case QLocale::CurrencyIsoCode:
+        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode)));
+    case QLocale::CurrencySymbol:
+        return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencySymbol)));
+    case QLocale::CurrencyDisplayName: {
+        CFStringRef code = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode));
+        QCFType<CFStringRef> value = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleCurrencyCode, code);
+        return QCFString::toQString(value);
+    }
+    default:
+        break;
+    }
+    return QString();
+}
+
+static QString macFormatCurrency(const QVariant &in)
+{
+    QCFType<CFNumberRef> value;
+    switch (in.type()) {
+    case QVariant::Int:
+    case QVariant::UInt: {
+        int v = in.toInt();
+        value = CFNumberCreate(NULL, kCFNumberIntType, &v);
+        break;
+    }
+    case QVariant::Double: {
+        double v = in.toInt();
+        value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
+        break;
+    }
+    case QVariant::LongLong:
+    case QVariant::ULongLong: {
+        qint64 v = in.toLongLong();
+        value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
+        break;
+    }
+    default:
+        return QString();
+    }
+
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    QCFType<CFNumberFormatterRef> currencyFormatter =
+            CFNumberFormatterCreate(NULL, locale, kCFNumberFormatterCurrencyStyle);
+    QCFType<CFStringRef> result = CFNumberFormatterCreateStringWithNumber(NULL, currencyFormatter, value);
+    return QCFString::toQString(result);
+}
+
+static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant &in)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+    if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6)
+        return QVariant();
+
+    QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+    switch (type) {
+    case  QSystemLocale::QuotationBegin:
+        if (in.toInt() == QLocale::StandardQuotation)
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
+        else
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
+        break;
+    case QSystemLocale::QuotationEnd:
+        if (in.toInt() == QLocale::StandardQuotation)
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
+        else
+            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
+        break;
+     default:
+        break;
+    }
+#endif
+    return QVariant();
+}
+
+static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
+{
+    QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
+             CFSTR("AppleLanguages"),
+             kCFPreferencesAnyApplication,
+             kCFPreferencesCurrentUser,
+             kCFPreferencesAnyHost);
+    if (languages && CFArrayGetCount(languages) > 0) {
+        QCFType<CFLocaleRef> locale = CFLocaleCreate(kCFAllocatorDefault,
+                                                     CFStringRef(CFArrayGetValueAtIndex(languages, 0)));
+        if (language)
+            *language = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleLanguageCode)));
+        if (country)
+            *country = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleCountryCode)));
+    }
+}
+
+#ifndef QT_NO_SYSTEMLOCALE
+
+QLocale QSystemLocale::fallbackLocale() const
+{
+    return QLocale(QString::fromUtf8(getMacLocaleName().constData()));
+}
+
+QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+{
+    switch(type) {
+//     case Name:
+//         return getMacLocaleName();
+    case DecimalPoint: {
+        QString value = getCFLocaleValue(kCFLocaleDecimalSeparator);
+        return value.isEmpty() ? QVariant() : value;
+    }
+    case GroupSeparator: {
+        QString value = getCFLocaleValue(kCFLocaleGroupingSeparator);
+        return value.isEmpty() ? QVariant() : value;
+    }
+    case DateFormatLong:
+    case DateFormatShort:
+        return getMacDateFormat(type == DateFormatShort
+                                ? kCFDateFormatterShortStyle
+                                : kCFDateFormatterLongStyle);
+    case TimeFormatLong:
+    case TimeFormatShort:
+        return getMacTimeFormat(type == TimeFormatShort
+                                ? kCFDateFormatterShortStyle
+                                : kCFDateFormatterLongStyle);
+    case DayNameLong:
+    case DayNameShort:
+        return macDayName(in.toInt(), (type == DayNameShort));
+    case MonthNameLong:
+    case MonthNameShort:
+        return macMonthName(in.toInt(), (type == MonthNameShort));
+    case DateToStringShort:
+    case DateToStringLong:
+        return macDateToString(in.toDate(), (type == DateToStringShort));
+    case TimeToStringShort:
+    case TimeToStringLong:
+        return macTimeToString(in.toTime(), (type == TimeToStringShort));
+
+    case NegativeSign:
+    case PositiveSign:
+    case ZeroDigit:
+        break;
+    case LanguageId:
+    case CountryId: {
+        QString preferredLanguage;
+        QString preferredCountry(3, QChar()); // codeToCountry assumes QChar[3]
+        getMacPreferredLanguageAndCountry(&preferredLanguage, &preferredCountry);
+        QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : codeToLanguage(preferredLanguage.data()));
+        QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : codeToCountry(preferredCountry.data()));
+        const QLocalePrivate *d = findLocale(languageCode, countryCode);
+        if (type == LanguageId)
+            return (QLocale::Language)d->languageId();
+        return (QLocale::Country)d->countryId();
+    }
+
+    case MeasurementSystem:
+        return QVariant(static_cast<int>(macMeasurementSystem()));
+
+    case AMText:
+    case PMText:
+        break;
+    case FirstDayOfWeek:
+        return QVariant(macFirstDayOfWeek());
+    case CurrencySymbol:
+        return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+    case FormatCurrency:
+        return macFormatCurrency(in);
+    case UILanguages: {
+        QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
+                 CFSTR("AppleLanguages"),
+                 kCFPreferencesAnyApplication,
+                 kCFPreferencesCurrentUser,
+                 kCFPreferencesAnyHost);
+        const int cnt = CFArrayGetCount(languages);
+        QStringList result;
+        result.reserve(cnt);
+        for (int i = 0; i < cnt; ++i) {
+            const QString lang = QCFString::toQString(
+                        static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i)));
+            result.append(lang);
+        }
+        return QVariant(result);
+    }
+    case QuotationBegin:
+    case QuotationEnd:
+        return macQuotationSymbol(type,in);
+    default:
+        break;
+    }
+    return QVariant();
+}
+
+#endif // QT_NO_SYSTEMLOCALE
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 1d286ab..748f654 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -245,6 +245,16 @@ private:
 };
 #endif
 
+const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country country);
+const QLocalePrivate *findLocale(const QString &name);
+QString readEscapedFormatString(const QString &format, int *idx);
+bool splitLocaleName(const QString &name, QChar *lang_begin, QChar *cntry_begin,
+                     int *lang_len = 0, int *cntry_len = 0);
+int repeatCount(const QString &s, int i);
+QLocale::Language codeToLanguage(const QChar *code);
+QLocale::Country codeToCountry(const QChar *code);
+void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Country &cntry);
+
 QT_END_NAMESPACE
 
 #endif // QLOCALE_P_H
diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp
new file mode 100644
index 0000000..17d8b2a
--- /dev/null
+++ b/src/corelib/tools/qlocale_tools.cpp
@@ -0,0 +1,2961 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qlocale_tools_p.h"
+#include "qlocale_p.h"
+#include "qstring.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdlib.h>
+#include <time.h>
+
+#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
+#    include <fenv.h>
+#endif
+
+// Sizes as defined by the ISO C99 standard - fallback
+#ifndef LLONG_MAX
+#   define LLONG_MAX Q_INT64_C(0x7fffffffffffffff)
+#endif
+#ifndef LLONG_MIN
+#   define LLONG_MIN (-LLONG_MAX - Q_INT64_C(1))
+#endif
+#ifndef ULLONG_MAX
+#   define ULLONG_MAX Q_UINT64_C(0xffffffffffffffff)
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_QLOCALE_USES_FCVT
+static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt,
+                        int *sign, char **rve, char **digits_str);
+#endif
+
+QString qulltoa(qulonglong l, int base, const QChar _zero)
+{
+    ushort buff[65]; // length of MAX_ULLONG in base 2
+    ushort *p = buff + 65;
+
+    if (base != 10 || _zero.unicode() == '0') {
+        while (l != 0) {
+            int c = l % base;
+
+            --p;
+
+            if (c < 10)
+                *p = '0' + c;
+            else
+                *p = c - 10 + 'a';
+
+            l /= base;
+        }
+    }
+    else {
+        while (l != 0) {
+            int c = l % base;
+
+            *(--p) = _zero.unicode() + c;
+
+            l /= base;
+        }
+    }
+
+    return QString(reinterpret_cast<QChar *>(p), 65 - (p - buff));
+}
+
+QString qlltoa(qlonglong l, int base, const QChar zero)
+{
+    return qulltoa(l < 0 ? -l : l, base, zero);
+}
+
+QString &decimalForm(QChar zero, QChar decimal, QChar group,
+                     QString &digits, int decpt, uint precision,
+                     PrecisionMode pm,
+                     bool always_show_decpt,
+                     bool thousands_group)
+{
+    if (decpt < 0) {
+        for (int i = 0; i < -decpt; ++i)
+            digits.prepend(zero);
+        decpt = 0;
+    }
+    else if (decpt > digits.length()) {
+        for (int i = digits.length(); i < decpt; ++i)
+            digits.append(zero);
+    }
+
+    if (pm == PMDecimalDigits) {
+        uint decimal_digits = digits.length() - decpt;
+        for (uint i = decimal_digits; i < precision; ++i)
+            digits.append(zero);
+    }
+    else if (pm == PMSignificantDigits) {
+        for (uint i = digits.length(); i < precision; ++i)
+            digits.append(zero);
+    }
+    else { // pm == PMChopTrailingZeros
+    }
+
+    if (always_show_decpt || decpt < digits.length())
+        digits.insert(decpt, decimal);
+
+    if (thousands_group) {
+        for (int i = decpt - 3; i > 0; i -= 3)
+            digits.insert(i, group);
+    }
+
+    if (decpt == 0)
+        digits.prepend(zero);
+
+    return digits;
+}
+
+QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
+                      QChar group, QChar plus, QChar minus,
+                      QString &digits, int decpt, uint precision,
+                      PrecisionMode pm,
+                      bool always_show_decpt)
+{
+    int exp = decpt - 1;
+
+    if (pm == PMDecimalDigits) {
+        for (uint i = digits.length(); i < precision + 1; ++i)
+            digits.append(zero);
+    }
+    else if (pm == PMSignificantDigits) {
+        for (uint i = digits.length(); i < precision; ++i)
+            digits.append(zero);
+    }
+    else { // pm == PMChopTrailingZeros
+    }
+
+    if (always_show_decpt || digits.length() > 1)
+        digits.insert(1, decimal);
+
+    digits.append(exponential);
+    digits.append(QLocalePrivate::longLongToString(zero, group, plus, minus,
+                   exp, 2, 10, -1, QLocalePrivate::AlwaysShowSign));
+
+    return digits;
+}
+
+// Removes thousand-group separators in "C" locale.
+bool removeGroupSeparators(QLocalePrivate::CharBuff *num)
+{
+    int group_cnt = 0; // counts number of group chars
+    int decpt_idx = -1;
+
+    char *data = num->data();
+    int l = qstrlen(data);
+
+    // Find the decimal point and check if there are any group chars
+    int i = 0;
+    for (; i < l; ++i) {
+        char c = data[i];
+
+        if (c == ',') {
+            if (i == 0 || data[i - 1] < '0' || data[i - 1] > '9')
+                return false;
+            if (i == l - 1 || data[i + 1] < '0' || data[i + 1] > '9')
+                return false;
+            ++group_cnt;
+        }
+        else if (c == '.') {
+            // Fail if more than one decimal points
+            if (decpt_idx != -1)
+                return false;
+            decpt_idx = i;
+        } else if (c == 'e' || c == 'E') {
+            // an 'e' or 'E' - if we have not encountered a decimal
+            // point, this is where it "is".
+            if (decpt_idx == -1)
+                decpt_idx = i;
+        }
+    }
+
+    // If no group chars, we're done
+    if (group_cnt == 0)
+        return true;
+
+    // No decimal point means that it "is" at the end of the string
+    if (decpt_idx == -1)
+        decpt_idx = l;
+
+    i = 0;
+    while (i < l && group_cnt > 0) {
+        char c = data[i];
+
+        if (c == ',') {
+            // Don't allow group chars after the decimal point
+            if (i > decpt_idx)
+                return false;
+
+            // Check that it is placed correctly relative to the decpt
+            if ((decpt_idx - i) % 4 != 0)
+                return false;
+
+            // Remove it
+            memmove(data + i, data + i + 1, l - i - 1);
+            data[--l] = '\0';
+
+            --group_cnt;
+            --decpt_idx;
+        } else {
+            // Check that we are not missing a separator
+            if (i < decpt_idx
+                    && (decpt_idx - i) % 4 == 0
+                    && !(i == 0 && c == '-')) // check for negative sign at start of string
+                return false;
+            ++i;
+        }
+    }
+
+    return true;
+}
+
+#if defined(Q_CC_MWERKS) && defined(Q_OS_WIN32)
+inline bool isascii(int c)
+{
+        return (c >= 0 && c <=127);
+}
+#endif
+
+/*-
+ * Copyright (c) 1992, 1993
+ *        The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgment:
+ *        This product includes software developed by the University of
+ *        California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// static char sccsid[] = "@(#)strtouq.c        8.1 (Berkeley) 6/4/93";
+//  "$FreeBSD: src/lib/libc/stdlib/strtoull.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $";
+
+/*
+ * Convert a string to an unsigned long long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok)
+{
+    register const char *s = nptr;
+    register qulonglong acc;
+    register unsigned char c;
+    register qulonglong qbase, cutoff;
+    register int any, cutlim;
+
+    if (ok != 0)
+        *ok = true;
+
+    /*
+     * See strtoq for comments as to the logic used.
+     */
+    s = nptr;
+    do {
+        c = *s++;
+    } while (isspace(c));
+    if (c == '-') {
+        if (ok != 0)
+            *ok = false;
+        if (endptr != 0)
+            *endptr = s - 1;
+        return 0;
+    } else {
+        if (c == '+')
+            c = *s++;
+    }
+    if ((base == 0 || base == 16) &&
+        c == '0' && (*s == 'x' || *s == 'X')) {
+        c = s[1];
+        s += 2;
+        base = 16;
+    }
+    if (base == 0)
+        base = c == '0' ? 8 : 10;
+    qbase = unsigned(base);
+    cutoff = qulonglong(ULLONG_MAX) / qbase;
+    cutlim = qulonglong(ULLONG_MAX) % qbase;
+    for (acc = 0, any = 0;; c = *s++) {
+        if (!isascii(c))
+            break;
+        if (isdigit(c))
+            c -= '0';
+        else if (isalpha(c))
+            c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+        else
+            break;
+        if (c >= base)
+            break;
+        if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+            any = -1;
+        else {
+            any = 1;
+            acc *= qbase;
+            acc += c;
+        }
+    }
+    if (any == 0) {
+        if (ok != 0)
+            *ok = false;
+    } else if (any < 0) {
+        acc = ULLONG_MAX;
+        if (ok != 0)
+            *ok = false;
+    }
+    if (endptr != 0)
+        *endptr = (any ? s - 1 : nptr);
+    return acc;
+}
+
+
+//  "$FreeBSD: src/lib/libc/stdlib/strtoll.c,v 1.5.2.1 2001/03/02 09:45:20 obrien Exp $";
+
+
+/*
+ * Convert a string to a long long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok)
+{
+    register const char *s;
+    register qulonglong acc;
+    register unsigned char c;
+    register qulonglong qbase, cutoff;
+    register int neg, any, cutlim;
+
+    /*
+     * Skip white space and pick up leading +/- sign if any.
+     * If base is 0, allow 0x for hex and 0 for octal, else
+     * assume decimal; if base is already 16, allow 0x.
+     */
+    s = nptr;
+    do {
+        c = *s++;
+    } while (isspace(c));
+    if (c == '-') {
+        neg = 1;
+        c = *s++;
+    } else {
+        neg = 0;
+        if (c == '+')
+            c = *s++;
+    }
+    if ((base == 0 || base == 16) &&
+        c == '0' && (*s == 'x' || *s == 'X')) {
+        c = s[1];
+        s += 2;
+        base = 16;
+    }
+    if (base == 0)
+        base = c == '0' ? 8 : 10;
+
+    /*
+     * Compute the cutoff value between legal numbers and illegal
+     * numbers.  That is the largest legal value, divided by the
+     * base.  An input number that is greater than this value, if
+     * followed by a legal input character, is too big.  One that
+     * is equal to this value may be valid or not; the limit
+     * between valid and invalid numbers is then based on the last
+     * digit.  For instance, if the range for quads is
+     * [-9223372036854775808..9223372036854775807] and the input base
+     * is 10, cutoff will be set to 922337203685477580 and cutlim to
+     * either 7 (neg==0) or 8 (neg==1), meaning that if we have
+     * accumulated a value > 922337203685477580, or equal but the
+     * next digit is > 7 (or 8), the number is too big, and we will
+     * return a range error.
+     *
+     * Set any if any `digits' consumed; make it negative to indicate
+     * overflow.
+     */
+    qbase = unsigned(base);
+    cutoff = neg ? qulonglong(0-(LLONG_MIN + LLONG_MAX)) + LLONG_MAX : LLONG_MAX;
+    cutlim = cutoff % qbase;
+    cutoff /= qbase;
+    for (acc = 0, any = 0;; c = *s++) {
+        if (!isascii(c))
+            break;
+        if (isdigit(c))
+            c -= '0';
+        else if (isalpha(c))
+            c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+        else
+            break;
+        if (c >= base)
+            break;
+        if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+            any = -1;
+        else {
+            any = 1;
+            acc *= qbase;
+            acc += c;
+        }
+    }
+    if (any < 0) {
+        acc = neg ? LLONG_MIN : LLONG_MAX;
+        if (ok != 0)
+            *ok = false;
+    } else if (neg) {
+        acc = (~acc) + 1;
+    }
+    if (endptr != 0)
+        *endptr = (any >= 0 ? s - 1 : nptr);
+
+    if (ok != 0)
+        *ok = any > 0;
+
+    return acc;
+}
+
+#ifndef QT_QLOCALE_USES_FCVT
+
+/*        From: NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp */
+/* $FreeBSD: src/lib/libc/stdlib/netbsd_strtod.c,v 1.2.2.2 2001/03/02 17:14:15 tegge Exp $        */
+
+/* Please send bug reports to
+        David M. Gay
+        AT&T Bell Laboratories, Room 2C-463
+        600 Mountain Avenue
+        Murray Hill, NJ 07974-2070
+        U.S.A.
+        dmg@research.att.com or research!dmg
+ */
+
+/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
+ *
+ * This strtod returns a nearest machine number to the input decimal
+ * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
+ * broken by the IEEE round-even rule.  Otherwise ties are broken by
+ * biased rounding (add half and chop).
+ *
+ * Inspired loosely by William D. Clinger's paper "How to Read Floating
+ * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
+ *
+ * Modifications:
+ *
+ *        1. We only require IEEE, IBM, or VAX double-precision
+ *                arithmetic (not IEEE double-extended).
+ *        2. We get by with floating-point arithmetic in a case that
+ *                Clinger missed -- when we're computing d * 10^n
+ *                for a small integer d and the integer n is not too
+ *                much larger than 22 (the maximum integer k for which
+ *                we can represent 10^k exactly), we may be able to
+ *                compute (d*10^k) * 10^(e-k) with just one roundoff.
+ *        3. Rather than a bit-at-a-time adjustment of the binary
+ *                result in the hard case, we use floating-point
+ *                arithmetic to determine the adjustment to within
+ *                one bit; only in really hard cases do we need to
+ *                compute a second residual.
+ *        4. Because of 3., we don't need a large table of powers of 10
+ *                for ten-to-e (just some small tables, e.g. of 10^k
+ *                for 0 <= k <= 22).
+ */
+
+/*
+ * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least
+ *        significant byte has the lowest address.
+ * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most
+ *        significant byte has the lowest address.
+ * #define Long int on machines with 32-bit ints and 64-bit longs.
+ * #define Sudden_Underflow for IEEE-format machines without gradual
+ *        underflow (i.e., that flush to zero on underflow).
+ * #define IBM for IBM mainframe-style floating-point arithmetic.
+ * #define VAX for VAX-style floating-point arithmetic.
+ * #define Unsigned_Shifts if >> does treats its left operand as unsigned.
+ * #define No_leftright to omit left-right logic in fast floating-point
+ *        computation of dtoa.
+ * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
+ * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
+ *        that use extended-precision instructions to compute rounded
+ *        products and quotients) with IBM.
+ * #define ROUND_BIASED for IEEE-format with biased rounding.
+ * #define Inaccurate_Divide for IEEE-format with correctly rounded
+ *        products but inaccurate quotients, e.g., for Intel i860.
+ * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision
+ *        integer arithmetic.  Whether this speeds things up or slows things
+ *        down depends on the machine and the number being converted.
+ * #define KR_headers for old-style C function headers.
+ * #define Bad_float_h if your system lacks a float.h or if it does not
+ *        define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
+ *        FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
+ *        if memory is available and otherwise does something you deem
+ *        appropriate.  If MALLOC is undefined, malloc will be invoked
+ *        directly -- and assumed always to succeed.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+/*
+#if defined(__m68k__)    || defined(__sparc__) || defined(__i386__) || \
+     defined(__mips__)    || defined(__ns32k__) || defined(__alpha__) || \
+     defined(__powerpc__) || defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_MAC) || \
+     defined(mips) || defined(Q_OS_AIX) || defined(Q_OS_SOLARIS)
+#           define IEEE_BIG_OR_LITTLE_ENDIAN 1
+#endif
+*/
+
+// *All* of our architectures have IEEE arithmetic, don't they?
+#define IEEE_BIG_OR_LITTLE_ENDIAN 1
+
+#ifdef __arm32__
+/*
+ * Although the CPU is little endian the FP has different
+ * byte and word endianness. The byte order is still little endian
+ * but the word order is big endian.
+ */
+#define IEEE_BIG_OR_LITTLE_ENDIAN
+#endif
+
+#ifdef vax
+#define VAX
+#endif
+
+#define Long        qint32
+#define ULong        quint32
+
+#define MALLOC malloc
+
+#ifdef BSD_QDTOA_DEBUG
+QT_BEGIN_INCLUDE_NAMESPACE
+#include <stdio.h>
+QT_END_INCLUDE_NAMESPACE
+
+#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
+#endif
+
+#ifdef Unsigned_Shifts
+#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000;
+#else
+#define Sign_Extend(a,b) /*no-op*/
+#endif
+
+#if (defined(IEEE_BIG_OR_LITTLE_ENDIAN) + defined(VAX) + defined(IBM)) != 1
+#error Exactly one of IEEE_BIG_OR_LITTLE_ENDIAN, VAX, or IBM should be defined.
+#endif
+
+static inline ULong _getWord0(const NEEDS_VOLATILE double x)
+{
+    const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
+    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+        return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
+    } else {
+        return (ptr[7]<<24) + (ptr[6]<<16) + (ptr[5]<<8) + ptr[4];
+    }
+}
+
+static inline void _setWord0(NEEDS_VOLATILE double *x, ULong l)
+{
+    NEEDS_VOLATILE uchar *ptr = reinterpret_cast<NEEDS_VOLATILE uchar *>(x);
+    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+        ptr[0] = uchar(l>>24);
+        ptr[1] = uchar(l>>16);
+        ptr[2] = uchar(l>>8);
+        ptr[3] = uchar(l);
+    } else {
+        ptr[7] = uchar(l>>24);
+        ptr[6] = uchar(l>>16);
+        ptr[5] = uchar(l>>8);
+        ptr[4] = uchar(l);
+    }
+}
+
+static inline ULong _getWord1(const NEEDS_VOLATILE double x)
+{
+    const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
+    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+        return (ptr[4]<<24) + (ptr[5]<<16) + (ptr[6]<<8) + ptr[7];
+    } else {
+        return (ptr[3]<<24) + (ptr[2]<<16) + (ptr[1]<<8) + ptr[0];
+    }
+}
+static inline void _setWord1(NEEDS_VOLATILE double *x, ULong l)
+{
+    NEEDS_VOLATILE uchar *ptr = reinterpret_cast<uchar NEEDS_VOLATILE *>(x);
+    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+        ptr[4] = uchar(l>>24);
+        ptr[5] = uchar(l>>16);
+        ptr[6] = uchar(l>>8);
+        ptr[7] = uchar(l);
+    } else {
+        ptr[3] = uchar(l>>24);
+        ptr[2] = uchar(l>>16);
+        ptr[1] = uchar(l>>8);
+        ptr[0] = uchar(l);
+    }
+}
+
+static inline ULong getWord0(const NEEDS_VOLATILE double x)
+{
+#ifdef QT_ARMFPA
+    return _getWord1(x);
+#else
+    return _getWord0(x);
+#endif
+}
+
+static inline void setWord0(NEEDS_VOLATILE double *x, ULong l)
+{
+#ifdef QT_ARMFPA
+    _setWord1(x, l);
+#else
+    _setWord0(x, l);
+#endif
+}
+
+static inline ULong getWord1(const NEEDS_VOLATILE double x)
+{
+#ifdef QT_ARMFPA
+    return _getWord0(x);
+#else
+    return _getWord1(x);
+#endif
+}
+
+static inline void setWord1(NEEDS_VOLATILE double *x, ULong l)
+{
+#ifdef QT_ARMFPA
+    _setWord0(x, l);
+#else
+    _setWord1(x, l);
+#endif
+}
+
+static inline void Storeinc(ULong *&a, const ULong &b, const ULong &c)
+{
+
+    *a = (ushort(b) << 16) | ushort(c);
+    ++a;
+}
+
+/* #define P DBL_MANT_DIG */
+/* Ten_pmax = floor(P*log(2)/log(5)) */
+/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
+/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
+/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
+
+#if defined(IEEE_BIG_OR_LITTLE_ENDIAN)
+#define Exp_shift  20
+#define Exp_shift1 20
+#define Exp_msk1    0x100000
+#define Exp_msk11   0x100000
+#define Exp_mask  0x7ff00000
+#define P 53
+#define Bias 1023
+#define IEEE_Arith
+#define Emin (-1022)
+#define Exp_1  0x3ff00000
+#define Exp_11 0x3ff00000
+#define Ebits 11
+#define Frac_mask  0xfffff
+#define Frac_mask1 0xfffff
+#define Ten_pmax 22
+#define Bletch 0x10
+#define Bndry_mask  0xfffff
+#define Bndry_mask1 0xfffff
+#if defined(LSB) && defined(Q_OS_VXWORKS)
+#undef LSB
+#endif
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 1
+#define Tiny0 0
+#define Tiny1 1
+#define Quick_max 14
+#define Int_max 14
+#define Infinite(x) (getWord0(x) == 0x7ff00000) /* sufficient test for here */
+#else
+#undef  Sudden_Underflow
+#define Sudden_Underflow
+#ifdef IBM
+#define Exp_shift  24
+#define Exp_shift1 24
+#define Exp_msk1   0x1000000
+#define Exp_msk11  0x1000000
+#define Exp_mask  0x7f000000
+#define P 14
+#define Bias 65
+#define Exp_1  0x41000000
+#define Exp_11 0x41000000
+#define Ebits 8        /* exponent has 7 bits, but 8 is the right value in b2d */
+#define Frac_mask  0xffffff
+#define Frac_mask1 0xffffff
+#define Bletch 4
+#define Ten_pmax 22
+#define Bndry_mask  0xefffff
+#define Bndry_mask1 0xffffff
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 4
+#define Tiny0 0x100000
+#define Tiny1 0
+#define Quick_max 14
+#define Int_max 15
+#else /* VAX */
+#define Exp_shift  23
+#define Exp_shift1 7
+#define Exp_msk1    0x80
+#define Exp_msk11   0x800000
+#define Exp_mask  0x7f80
+#define P 56
+#define Bias 129
+#define Exp_1  0x40800000
+#define Exp_11 0x4080
+#define Ebits 8
+#define Frac_mask  0x7fffff
+#define Frac_mask1 0xffff007f
+#define Ten_pmax 24
+#define Bletch 2
+#define Bndry_mask  0xffff007f
+#define Bndry_mask1 0xffff007f
+#define LSB 0x10000
+#define Sign_bit 0x8000
+#define Log2P 1
+#define Tiny0 0x80
+#define Tiny1 0
+#define Quick_max 15
+#define Int_max 15
+#endif
+#endif
+
+#ifndef IEEE_Arith
+#define ROUND_BIASED
+#endif
+
+#ifdef RND_PRODQUOT
+#define rounded_product(a,b) a = rnd_prod(a, b)
+#define rounded_quotient(a,b) a = rnd_quot(a, b)
+extern double rnd_prod(double, double), rnd_quot(double, double);
+#else
+#define rounded_product(a,b) a *= b
+#define rounded_quotient(a,b) a /= b
+#endif
+
+#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
+#define Big1 0xffffffff
+
+#ifndef Just_16
+/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
+ * This makes some inner loops simpler and sometimes saves work
+ * during multiplications, but it often seems to make things slightly
+ * slower.  Hence the default is now to store 32 bits per Long.
+ */
+#ifndef Pack_32
+#define Pack_32
+#endif
+#endif
+
+#define Kmax 15
+
+struct
+Bigint {
+    struct Bigint *next;
+    int k, maxwds, sign, wds;
+    ULong x[1];
+};
+
+ typedef struct Bigint Bigint;
+
+static Bigint *Balloc(int k)
+{
+    int x;
+    Bigint *rv;
+
+    x = 1 << k;
+    rv = static_cast<Bigint *>(MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)));
+    Q_CHECK_PTR(rv);
+    rv->k = k;
+    rv->maxwds = x;
+    rv->sign = rv->wds = 0;
+    return rv;
+}
+
+static void Bfree(Bigint *v)
+{
+    free(v);
+}
+
+#define Bcopy(x,y) memcpy(reinterpret_cast<char *>(&x->sign), reinterpret_cast<char *>(&y->sign), \
+y->wds*sizeof(Long) + 2*sizeof(int))
+
+/* multiply by m and add a */
+static Bigint *multadd(Bigint *b, int m, int a)
+{
+    int i, wds;
+    ULong *x, y;
+#ifdef Pack_32
+    ULong xi, z;
+#endif
+    Bigint *b1;
+
+    wds = b->wds;
+    x = b->x;
+    i = 0;
+    do {
+#ifdef Pack_32
+        xi = *x;
+        y = (xi & 0xffff) * m + a;
+        z = (xi >> 16) * m + (y >> 16);
+        a = (z >> 16);
+        *x++ = (z << 16) + (y & 0xffff);
+#else
+        y = *x * m + a;
+        a = (y >> 16);
+        *x++ = y & 0xffff;
+#endif
+    }
+    while(++i < wds);
+    if (a) {
+        if (wds >= b->maxwds) {
+            b1 = Balloc(b->k+1);
+            Bcopy(b1, b);
+            Bfree(b);
+            b = b1;
+        }
+        b->x[wds++] = a;
+        b->wds = wds;
+    }
+    return b;
+}
+
+static Bigint *s2b(const char *s, int nd0, int nd, ULong y9)
+{
+    Bigint *b;
+    int i, k;
+    Long x, y;
+
+    x = (nd + 8) / 9;
+    for(k = 0, y = 1; x > y; y <<= 1, k++) ;
+#ifdef Pack_32
+    b = Balloc(k);
+    b->x[0] = y9;
+    b->wds = 1;
+#else
+    b = Balloc(k+1);
+    b->x[0] = y9 & 0xffff;
+    b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
+#endif
+
+    i = 9;
+    if (9 < nd0) {
+        s += 9;
+        do b = multadd(b, 10, *s++ - '0');
+        while(++i < nd0);
+        s++;
+    }
+    else
+        s += 10;
+    for(; i < nd; i++)
+        b = multadd(b, 10, *s++ - '0');
+    return b;
+}
+
+static int hi0bits(ULong x)
+{
+    int k = 0;
+
+    if (!(x & 0xffff0000)) {
+        k = 16;
+        x <<= 16;
+    }
+    if (!(x & 0xff000000)) {
+        k += 8;
+        x <<= 8;
+    }
+    if (!(x & 0xf0000000)) {
+        k += 4;
+        x <<= 4;
+    }
+    if (!(x & 0xc0000000)) {
+        k += 2;
+        x <<= 2;
+    }
+    if (!(x & 0x80000000)) {
+        k++;
+        if (!(x & 0x40000000))
+            return 32;
+    }
+    return k;
+}
+
+static int lo0bits(ULong *y)
+{
+    int k;
+    ULong x = *y;
+
+    if (x & 7) {
+        if (x & 1)
+            return 0;
+        if (x & 2) {
+            *y = x >> 1;
+            return 1;
+        }
+        *y = x >> 2;
+        return 2;
+    }
+    k = 0;
+    if (!(x & 0xffff)) {
+        k = 16;
+        x >>= 16;
+    }
+    if (!(x & 0xff)) {
+        k += 8;
+        x >>= 8;
+    }
+    if (!(x & 0xf)) {
+        k += 4;
+        x >>= 4;
+    }
+    if (!(x & 0x3)) {
+        k += 2;
+        x >>= 2;
+    }
+    if (!(x & 1)) {
+        k++;
+        x >>= 1;
+        if (!x & 1)
+            return 32;
+    }
+    *y = x;
+    return k;
+}
+
+static Bigint *i2b(int i)
+{
+    Bigint *b;
+
+    b = Balloc(1);
+    b->x[0] = i;
+    b->wds = 1;
+    return b;
+}
+
+static Bigint *mult(Bigint *a, Bigint *b)
+{
+    Bigint *c;
+    int k, wa, wb, wc;
+    ULong carry, y, z;
+    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
+#ifdef Pack_32
+    ULong z2;
+#endif
+
+    if (a->wds < b->wds) {
+        c = a;
+        a = b;
+        b = c;
+    }
+    k = a->k;
+    wa = a->wds;
+    wb = b->wds;
+    wc = wa + wb;
+    if (wc > a->maxwds)
+        k++;
+    c = Balloc(k);
+    for(x = c->x, xa = x + wc; x < xa; x++)
+        *x = 0;
+    xa = a->x;
+    xae = xa + wa;
+    xb = b->x;
+    xbe = xb + wb;
+    xc0 = c->x;
+#ifdef Pack_32
+    for(; xb < xbe; xb++, xc0++) {
+        if ((y = *xb & 0xffff) != 0) {
+            x = xa;
+            xc = xc0;
+            carry = 0;
+            do {
+                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
+                carry = z >> 16;
+                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
+                carry = z2 >> 16;
+                Storeinc(xc, z2, z);
+            }
+            while(x < xae);
+            *xc = carry;
+        }
+        if ((y = *xb >> 16) != 0) {
+            x = xa;
+            xc = xc0;
+            carry = 0;
+            z2 = *xc;
+            do {
+                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
+                carry = z >> 16;
+                Storeinc(xc, z, z2);
+                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
+                carry = z2 >> 16;
+            }
+            while(x < xae);
+            *xc = z2;
+        }
+    }
+#else
+    for(; xb < xbe; xc0++) {
+        if (y = *xb++) {
+            x = xa;
+            xc = xc0;
+            carry = 0;
+            do {
+                z = *x++ * y + *xc + carry;
+                carry = z >> 16;
+                *xc++ = z & 0xffff;
+            }
+            while(x < xae);
+            *xc = carry;
+        }
+    }
+#endif
+    for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
+    c->wds = wc;
+    return c;
+}
+
+static Bigint *p5s;
+
+struct p5s_deleter
+{
+    ~p5s_deleter()
+    {
+        while (p5s) {
+            Bigint *next = p5s->next;
+            Bfree(p5s);
+            p5s = next;
+        }
+    }
+};
+
+static Bigint *pow5mult(Bigint *b, int k)
+{
+    Bigint *b1, *p5, *p51;
+    int i;
+    static const int p05[3] = { 5, 25, 125 };
+
+    if ((i = k & 3) != 0)
+#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
+    {
+        // work around a bug on 64 bit IRIX gcc
+        int *p = (int *) p05;
+        b = multadd(b, p[i-1], 0);
+    }
+#else
+    b = multadd(b, p05[i-1], 0);
+#endif
+
+    if (!(k >>= 2))
+        return b;
+    if (!(p5 = p5s)) {
+        /* first time */
+        static p5s_deleter deleter;
+        p5 = p5s = i2b(625);
+        p5->next = 0;
+    }
+    for(;;) {
+        if (k & 1) {
+            b1 = mult(b, p5);
+            Bfree(b);
+            b = b1;
+        }
+        if (!(k >>= 1))
+            break;
+        if (!(p51 = p5->next)) {
+            p51 = p5->next = mult(p5,p5);
+            p51->next = 0;
+        }
+        p5 = p51;
+    }
+    return b;
+}
+
+static Bigint *lshift(Bigint *b, int k)
+{
+    int i, k1, n, n1;
+    Bigint *b1;
+    ULong *x, *x1, *xe, z;
+
+#ifdef Pack_32
+    n = k >> 5;
+#else
+    n = k >> 4;
+#endif
+    k1 = b->k;
+    n1 = n + b->wds + 1;
+    for(i = b->maxwds; n1 > i; i <<= 1)
+        k1++;
+    b1 = Balloc(k1);
+    x1 = b1->x;
+    for(i = 0; i < n; i++)
+        *x1++ = 0;
+    x = b->x;
+    xe = x + b->wds;
+#ifdef Pack_32
+    if (k &= 0x1f) {
+        k1 = 32 - k;
+        z = 0;
+        do {
+            *x1++ = *x << k | z;
+            z = *x++ >> k1;
+        }
+        while(x < xe);
+        if ((*x1 = z) != 0)
+            ++n1;
+    }
+#else
+    if (k &= 0xf) {
+        k1 = 16 - k;
+        z = 0;
+        do {
+            *x1++ = *x << k  & 0xffff | z;
+            z = *x++ >> k1;
+        }
+        while(x < xe);
+        if (*x1 = z)
+            ++n1;
+    }
+#endif
+    else do
+        *x1++ = *x++;
+    while(x < xe);
+    b1->wds = n1 - 1;
+    Bfree(b);
+    return b1;
+}
+
+static int cmp(Bigint *a, Bigint *b)
+{
+    ULong *xa, *xa0, *xb, *xb0;
+    int i, j;
+
+    i = a->wds;
+    j = b->wds;
+#ifdef BSD_QDTOA_DEBUG
+    if (i > 1 && !a->x[i-1])
+        Bug("cmp called with a->x[a->wds-1] == 0");
+    if (j > 1 && !b->x[j-1])
+        Bug("cmp called with b->x[b->wds-1] == 0");
+#endif
+    if (i -= j)
+        return i;
+    xa0 = a->x;
+    xa = xa0 + j;
+    xb0 = b->x;
+    xb = xb0 + j;
+    for(;;) {
+        if (*--xa != *--xb)
+            return *xa < *xb ? -1 : 1;
+        if (xa <= xa0)
+            break;
+    }
+    return 0;
+}
+
+static Bigint *diff(Bigint *a, Bigint *b)
+{
+    Bigint *c;
+    int i, wa, wb;
+    Long borrow, y;        /* We need signed shifts here. */
+    ULong *xa, *xae, *xb, *xbe, *xc;
+#ifdef Pack_32
+    Long z;
+#endif
+
+    i = cmp(a,b);
+    if (!i) {
+        c = Balloc(0);
+        c->wds = 1;
+        c->x[0] = 0;
+        return c;
+    }
+    if (i < 0) {
+        c = a;
+        a = b;
+        b = c;
+        i = 1;
+    }
+    else
+        i = 0;
+    c = Balloc(a->k);
+    c->sign = i;
+    wa = a->wds;
+    xa = a->x;
+    xae = xa + wa;
+    wb = b->wds;
+    xb = b->x;
+    xbe = xb + wb;
+    xc = c->x;
+    borrow = 0;
+#ifdef Pack_32
+    do {
+        y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
+        borrow = y >> 16;
+        Sign_Extend(borrow, y);
+        z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
+        borrow = z >> 16;
+        Sign_Extend(borrow, z);
+        Storeinc(xc, z, y);
+    }
+    while(xb < xbe);
+    while(xa < xae) {
+        y = (*xa & 0xffff) + borrow;
+        borrow = y >> 16;
+        Sign_Extend(borrow, y);
+        z = (*xa++ >> 16) + borrow;
+        borrow = z >> 16;
+        Sign_Extend(borrow, z);
+        Storeinc(xc, z, y);
+    }
+#else
+    do {
+        y = *xa++ - *xb++ + borrow;
+        borrow = y >> 16;
+        Sign_Extend(borrow, y);
+        *xc++ = y & 0xffff;
+    }
+    while(xb < xbe);
+    while(xa < xae) {
+        y = *xa++ + borrow;
+        borrow = y >> 16;
+        Sign_Extend(borrow, y);
+        *xc++ = y & 0xffff;
+    }
+#endif
+    while(!*--xc)
+        wa--;
+    c->wds = wa;
+    return c;
+}
+
+static double ulp(double x)
+{
+    Long L;
+    double a;
+
+    L = (getWord0(x) & Exp_mask) - (P-1)*Exp_msk1;
+#ifndef Sudden_Underflow
+    if (L > 0) {
+#endif
+#ifdef IBM
+        L |= Exp_msk1 >> 4;
+#endif
+        setWord0(&a, L);
+        setWord1(&a, 0);
+#ifndef Sudden_Underflow
+    }
+    else {
+        L = -L >> Exp_shift;
+        if (L < Exp_shift) {
+            setWord0(&a, 0x80000 >> L);
+            setWord1(&a, 0);
+        }
+        else {
+            setWord0(&a, 0);
+            L -= Exp_shift;
+            setWord1(&a, L >= 31 ? 1U : 1U << (31 - L));
+        }
+    }
+#endif
+    return a;
+}
+
+static double b2d(Bigint *a, int *e)
+{
+    ULong *xa, *xa0, w, y, z;
+    int k;
+    double d;
+
+    xa0 = a->x;
+    xa = xa0 + a->wds;
+    y = *--xa;
+#ifdef BSD_QDTOA_DEBUG
+    if (!y) Bug("zero y in b2d");
+#endif
+    k = hi0bits(y);
+    *e = 32 - k;
+#ifdef Pack_32
+    if (k < Ebits) {
+        setWord0(&d, Exp_1 | y >> (Ebits - k));
+        w = xa > xa0 ? *--xa : 0;
+        setWord1(&d, y << ((32-Ebits) + k) | w >> (Ebits - k));
+        goto ret_d;
+    }
+    z = xa > xa0 ? *--xa : 0;
+    if (k -= Ebits) {
+        setWord0(&d, Exp_1 | y << k | z >> (32 - k));
+        y = xa > xa0 ? *--xa : 0;
+        setWord1(&d, z << k | y >> (32 - k));
+    }
+    else {
+        setWord0(&d, Exp_1 | y);
+        setWord1(&d, z);
+    }
+#else
+    if (k < Ebits + 16) {
+        z = xa > xa0 ? *--xa : 0;
+        setWord0(&d, Exp_1 | y << k - Ebits | z >> Ebits + 16 - k);
+        w = xa > xa0 ? *--xa : 0;
+        y = xa > xa0 ? *--xa : 0;
+        setWord1(&d, z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k);
+        goto ret_d;
+    }
+    z = xa > xa0 ? *--xa : 0;
+    w = xa > xa0 ? *--xa : 0;
+    k -= Ebits + 16;
+    setWord0(&d, Exp_1 | y << k + 16 | z << k | w >> 16 - k);
+    y = xa > xa0 ? *--xa : 0;
+    setWord1(&d, w << k + 16 | y << k);
+#endif
+ ret_d:
+    return d;
+}
+
+static Bigint *d2b(double d, int *e, int *bits)
+{
+    Bigint *b;
+    int de, i, k;
+    ULong *x, y, z;
+
+#ifdef Pack_32
+    b = Balloc(1);
+#else
+    b = Balloc(2);
+#endif
+    x = b->x;
+
+    z = getWord0(d) & Frac_mask;
+    setWord0(&d, getWord0(d) & 0x7fffffff);        /* clear sign bit, which we ignore */
+#ifdef Sudden_Underflow
+    de = (int)(getWord0(d) >> Exp_shift);
+#ifndef IBM
+    z |= Exp_msk11;
+#endif
+#else
+    if ((de = int(getWord0(d) >> Exp_shift)) != 0)
+        z |= Exp_msk1;
+#endif
+#ifdef Pack_32
+    if ((y = getWord1(d)) != 0) {
+        if ((k = lo0bits(&y)) != 0) {
+            x[0] = y | z << (32 - k);
+            z >>= k;
+        }
+        else
+            x[0] = y;
+        i = b->wds = (x[1] = z) ? 2 : 1;
+    }
+    else {
+#ifdef BSD_QDTOA_DEBUG
+        if (!z)
+            Bug("Zero passed to d2b");
+#endif
+        k = lo0bits(&z);
+        x[0] = z;
+        i = b->wds = 1;
+        k += 32;
+    }
+#else
+    if (y = getWord1(d)) {
+        if (k = lo0bits(&y))
+            if (k >= 16) {
+                x[0] = y | z << 32 - k & 0xffff;
+                x[1] = z >> k - 16 & 0xffff;
+                x[2] = z >> k;
+                i = 2;
+            }
+            else {
+                x[0] = y & 0xffff;
+                x[1] = y >> 16 | z << 16 - k & 0xffff;
+                x[2] = z >> k & 0xffff;
+                x[3] = z >> k+16;
+                i = 3;
+            }
+        else {
+            x[0] = y & 0xffff;
+            x[1] = y >> 16;
+            x[2] = z & 0xffff;
+            x[3] = z >> 16;
+            i = 3;
+        }
+    }
+    else {
+#ifdef BSD_QDTOA_DEBUG
+        if (!z)
+            Bug("Zero passed to d2b");
+#endif
+        k = lo0bits(&z);
+        if (k >= 16) {
+            x[0] = z;
+            i = 0;
+        }
+        else {
+            x[0] = z & 0xffff;
+            x[1] = z >> 16;
+            i = 1;
+        }
+        k += 32;
+    }
+    while(!x[i])
+        --i;
+    b->wds = i + 1;
+#endif
+#ifndef Sudden_Underflow
+    if (de) {
+#endif
+#ifdef IBM
+        *e = (de - Bias - (P-1) << 2) + k;
+        *bits = 4*P + 8 - k - hi0bits(getWord0(d) & Frac_mask);
+#else
+        *e = de - Bias - (P-1) + k;
+        *bits = P - k;
+#endif
+#ifndef Sudden_Underflow
+    }
+    else {
+        *e = de - Bias - (P-1) + 1 + k;
+#ifdef Pack_32
+        *bits = 32*i - hi0bits(x[i-1]);
+#else
+        *bits = (i+2)*16 - hi0bits(x[i]);
+#endif
+    }
+#endif
+    return b;
+}
+
+static double ratio(Bigint *a, Bigint *b)
+{
+    double da, db;
+    int k, ka, kb;
+
+    da = b2d(a, &ka);
+    db = b2d(b, &kb);
+#ifdef Pack_32
+    k = ka - kb + 32*(a->wds - b->wds);
+#else
+    k = ka - kb + 16*(a->wds - b->wds);
+#endif
+#ifdef IBM
+    if (k > 0) {
+        setWord0(&da, getWord0(da) + (k >> 2)*Exp_msk1);
+        if (k &= 3)
+            da *= 1 << k;
+    }
+    else {
+        k = -k;
+        setWord0(&db, getWord0(db) + (k >> 2)*Exp_msk1);
+        if (k &= 3)
+            db *= 1 << k;
+    }
+#else
+    if (k > 0)
+        setWord0(&da, getWord0(da) + k*Exp_msk1);
+    else {
+        k = -k;
+        setWord0(&db, getWord0(db) + k*Exp_msk1);
+    }
+#endif
+    return da / db;
+}
+
+static const double tens[] = {
+    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+    1e20, 1e21, 1e22
+#ifdef VAX
+    , 1e23, 1e24
+#endif
+};
+
+#ifdef IEEE_Arith
+static const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
+static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
+#define n_bigtens 5
+#else
+#ifdef IBM
+static const double bigtens[] = { 1e16, 1e32, 1e64 };
+static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
+#define n_bigtens 3
+#else
+static const double bigtens[] = { 1e16, 1e32 };
+static const double tinytens[] = { 1e-16, 1e-32 };
+#define n_bigtens 2
+#endif
+#endif
+
+/*
+  The pre-release gcc3.3 shipped with SuSE 8.2 has a bug which causes
+  the comparison 1e-100 == 0.0 to return true. As a workaround, we
+  compare it to a global variable containing 0.0, which produces
+  correct assembler output.
+
+  ### consider detecting the broken compilers and using the static
+  ### double for these, and use a #define for all working compilers
+*/
+static double g_double_zero = 0.0;
+
+Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
+{
+    int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
+        e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
+    const char *s, *s0, *s1;
+    double aadj, aadj1, adj, rv, rv0;
+    Long L;
+    ULong y, z;
+    Bigint *bb1, *bd0;
+    Bigint *bb = NULL, *bd = NULL, *bs = NULL, *delta = NULL;/* pacify gcc */
+
+    /*
+      #ifndef KR_headers
+      const char decimal_point = localeconv()->decimal_point[0];
+      #else
+      const char decimal_point = '.';
+      #endif */
+    if (ok != 0)
+        *ok = true;
+
+    const char decimal_point = '.';
+
+    sign = nz0 = nz = 0;
+    rv = 0.;
+
+
+    for(s = s00; isspace(uchar(*s)); s++)
+        ;
+
+    if (*s == '-') {
+        sign = 1;
+        s++;
+    } else if (*s == '+') {
+        s++;
+    }
+
+    if (*s == '\0') {
+        s = s00;
+        goto ret;
+    }
+
+    if (*s == '0') {
+        nz0 = 1;
+        while(*++s == '0') ;
+        if (!*s)
+            goto ret;
+    }
+    s0 = s;
+    y = z = 0;
+    for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
+        if (nd < 9)
+            y = 10*y + c - '0';
+        else if (nd < 16)
+            z = 10*z + c - '0';
+    nd0 = nd;
+    if (c == decimal_point) {
+        c = *++s;
+        if (!nd) {
+            for(; c == '0'; c = *++s)
+                nz++;
+            if (c > '0' && c <= '9') {
+                s0 = s;
+                nf += nz;
+                nz = 0;
+                goto have_dig;
+            }
+            goto dig_done;
+        }
+        for(; c >= '0' && c <= '9'; c = *++s) {
+        have_dig:
+            nz++;
+            if (c -= '0') {
+                nf += nz;
+                for(i = 1; i < nz; i++)
+                    if (nd++ < 9)
+                        y *= 10;
+                    else if (nd <= DBL_DIG + 1)
+                        z *= 10;
+                if (nd++ < 9)
+                    y = 10*y + c;
+                else if (nd <= DBL_DIG + 1)
+                    z = 10*z + c;
+                nz = 0;
+            }
+        }
+    }
+ dig_done:
+    e = 0;
+    if (c == 'e' || c == 'E') {
+        if (!nd && !nz && !nz0) {
+            s = s00;
+            goto ret;
+        }
+        s00 = s;
+        esign = 0;
+        switch(c = *++s) {
+        case '-':
+            esign = 1;
+        case '+':
+            c = *++s;
+        }
+        if (c >= '0' && c <= '9') {
+            while(c == '0')
+                c = *++s;
+            if (c > '0' && c <= '9') {
+                L = c - '0';
+                s1 = s;
+                while((c = *++s) >= '0' && c <= '9')
+                    L = 10*L + c - '0';
+                if (s - s1 > 8 || L > 19999)
+                    /* Avoid confusion from exponents
+                     * so large that e might overflow.
+                     */
+                    e = 19999; /* safe for 16 bit ints */
+                else
+                    e = int(L);
+                if (esign)
+                    e = -e;
+            }
+            else
+                e = 0;
+        }
+        else
+            s = s00;
+    }
+    if (!nd) {
+        if (!nz && !nz0)
+            s = s00;
+        goto ret;
+    }
+    e1 = e -= nf;
+
+    /* Now we have nd0 digits, starting at s0, followed by a
+     * decimal point, followed by nd-nd0 digits.  The number we're
+     * after is the integer represented by those digits times
+     * 10**e */
+
+    if (!nd0)
+        nd0 = nd;
+    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
+    rv = y;
+    if (k > 9)
+#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
+    {
+        // work around a bug on 64 bit IRIX gcc
+        double *t = (double *) tens;
+        rv = t[k - 9] * rv + z;
+    }
+#else
+    rv = tens[k - 9] * rv + z;
+#endif
+
+    bd0 = 0;
+    if (nd <= DBL_DIG
+#ifndef RND_PRODQUOT
+        && FLT_ROUNDS == 1
+#endif
+        ) {
+        if (!e)
+            goto ret;
+        if (e > 0) {
+            if (e <= Ten_pmax) {
+#ifdef VAX
+                goto vax_ovfl_check;
+#else
+                /* rv = */ rounded_product(rv, tens[e]);
+                goto ret;
+#endif
+            }
+            i = DBL_DIG - nd;
+            if (e <= Ten_pmax + i) {
+                /* A fancier test would sometimes let us do
+                 * this for larger i values.
+                 */
+                e -= i;
+                rv *= tens[i];
+#ifdef VAX
+                /* VAX exponent range is so narrow we must
+                 * worry about overflow here...
+                 */
+            vax_ovfl_check:
+                setWord0(&rv, getWord0(rv) - P*Exp_msk1);
+                /* rv = */ rounded_product(rv, tens[e]);
+                if ((getWord0(rv) & Exp_mask)
+                    > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
+                    goto ovfl;
+                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
+#else
+                /* rv = */ rounded_product(rv, tens[e]);
+#endif
+                goto ret;
+            }
+        }
+#ifndef Inaccurate_Divide
+        else if (e >= -Ten_pmax) {
+            /* rv = */ rounded_quotient(rv, tens[-e]);
+            goto ret;
+        }
+#endif
+    }
+    e1 += nd - k;
+
+    /* Get starting approximation = rv * 10**e1 */
+
+    if (e1 > 0) {
+        if ((i = e1 & 15) != 0)
+            rv *= tens[i];
+        if (e1 &= ~15) {
+            if (e1 > DBL_MAX_10_EXP) {
+            ovfl:
+                //                                errno = ERANGE;
+                if (ok != 0)
+                    *ok = false;
+#ifdef __STDC__
+                rv = HUGE_VAL;
+#else
+                /* Can't trust HUGE_VAL */
+#ifdef IEEE_Arith
+                setWord0(&rv, Exp_mask);
+                setWord1(&rv, 0);
+#else
+                setWord0(&rv, Big0);
+                setWord1(&rv, Big1);
+#endif
+#endif
+                if (bd0)
+                    goto retfree;
+                goto ret;
+            }
+            if (e1 >>= 4) {
+                for(j = 0; e1 > 1; j++, e1 >>= 1)
+                    if (e1 & 1)
+                        rv *= bigtens[j];
+                /* The last multiplication could overflow. */
+                setWord0(&rv, getWord0(rv) - P*Exp_msk1);
+                rv *= bigtens[j];
+                if ((z = getWord0(rv) & Exp_mask)
+                    > Exp_msk1*(DBL_MAX_EXP+Bias-P))
+                    goto ovfl;
+                if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
+                    /* set to largest number */
+                    /* (Can't trust DBL_MAX) */
+                    setWord0(&rv, Big0);
+                    setWord1(&rv, Big1);
+                }
+                else
+                    setWord0(&rv, getWord0(rv) + P*Exp_msk1);
+            }
+
+        }
+    }
+    else if (e1 < 0) {
+        e1 = -e1;
+        if ((i = e1 & 15) != 0)
+            rv /= tens[i];
+        if (e1 &= ~15) {
+            e1 >>= 4;
+            if (e1 >= 1 << n_bigtens)
+                goto undfl;
+            for(j = 0; e1 > 1; j++, e1 >>= 1)
+                if (e1 & 1)
+                    rv *= tinytens[j];
+            /* The last multiplication could underflow. */
+            rv0 = rv;
+            rv *= tinytens[j];
+            if (rv == g_double_zero)
+                {
+                    rv = 2.*rv0;
+                    rv *= tinytens[j];
+                    if (rv == g_double_zero)
+                        {
+                        undfl:
+                            rv = 0.;
+                            //                                        errno = ERANGE;
+                            if (ok != 0)
+                                *ok = false;
+                            if (bd0)
+                                goto retfree;
+                            goto ret;
+                        }
+                    setWord0(&rv, Tiny0);
+                    setWord1(&rv, Tiny1);
+                    /* The refinement below will clean
+                     * this approximation up.
+                     */
+                }
+        }
+    }
+
+    /* Now the hard part -- adjusting rv to the correct value.*/
+
+    /* Put digits into bd: true value = bd * 10^e */
+
+    bd0 = s2b(s0, nd0, nd, y);
+
+    for(;;) {
+        bd = Balloc(bd0->k);
+        Bcopy(bd, bd0);
+        bb = d2b(rv, &bbe, &bbbits);        /* rv = bb * 2^bbe */
+        bs = i2b(1);
+
+        if (e >= 0) {
+            bb2 = bb5 = 0;
+            bd2 = bd5 = e;
+        }
+        else {
+            bb2 = bb5 = -e;
+            bd2 = bd5 = 0;
+        }
+        if (bbe >= 0)
+            bb2 += bbe;
+        else
+            bd2 -= bbe;
+        bs2 = bb2;
+#ifdef Sudden_Underflow
+#ifdef IBM
+        j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
+#else
+        j = P + 1 - bbbits;
+#endif
+#else
+        i = bbe + bbbits - 1;        /* logb(rv) */
+        if (i < Emin)        /* denormal */
+            j = bbe + (P-Emin);
+        else
+            j = P + 1 - bbbits;
+#endif
+        bb2 += j;
+        bd2 += j;
+        i = bb2 < bd2 ? bb2 : bd2;
+        if (i > bs2)
+            i = bs2;
+        if (i > 0) {
+            bb2 -= i;
+            bd2 -= i;
+            bs2 -= i;
+        }
+        if (bb5 > 0) {
+            bs = pow5mult(bs, bb5);
+            bb1 = mult(bs, bb);
+            Bfree(bb);
+            bb = bb1;
+        }
+        if (bb2 > 0)
+            bb = lshift(bb, bb2);
+        if (bd5 > 0)
+            bd = pow5mult(bd, bd5);
+        if (bd2 > 0)
+            bd = lshift(bd, bd2);
+        if (bs2 > 0)
+            bs = lshift(bs, bs2);
+        delta = diff(bb, bd);
+        dsign = delta->sign;
+        delta->sign = 0;
+        i = cmp(delta, bs);
+        if (i < 0) {
+            /* Error is less than half an ulp -- check for
+             * special case of mantissa a power of two.
+             */
+            if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask)
+                break;
+            delta = lshift(delta,Log2P);
+            if (cmp(delta, bs) > 0)
+                goto drop_down;
+            break;
+        }
+        if (i == 0) {
+            /* exactly half-way between */
+            if (dsign) {
+                if ((getWord0(rv) & Bndry_mask1) == Bndry_mask1
+                    &&  getWord1(rv) == 0xffffffff) {
+                    /*boundary case -- increment exponent*/
+                    setWord0(&rv, (getWord0(rv) & Exp_mask)
+                                + Exp_msk1
+#ifdef IBM
+                                | Exp_msk1 >> 4
+#endif
+                                );
+                    setWord1(&rv, 0);
+                    break;
+                }
+            }
+            else if (!(getWord0(rv) & Bndry_mask) && !getWord1(rv)) {
+            drop_down:
+                /* boundary case -- decrement exponent */
+#ifdef Sudden_Underflow
+                L = getWord0(rv) & Exp_mask;
+#ifdef IBM
+                if (L <  Exp_msk1)
+#else
+                    if (L <= Exp_msk1)
+#endif
+                        goto undfl;
+                L -= Exp_msk1;
+#else
+                L = (getWord0(rv) & Exp_mask) - Exp_msk1;
+#endif
+                setWord0(&rv, L | Bndry_mask1);
+                setWord1(&rv, 0xffffffff);
+#ifdef IBM
+                goto cont;
+#else
+                break;
+#endif
+            }
+#ifndef ROUND_BIASED
+            if (!(getWord1(rv) & LSB))
+                break;
+#endif
+            if (dsign)
+                rv += ulp(rv);
+#ifndef ROUND_BIASED
+            else {
+                rv -= ulp(rv);
+#ifndef Sudden_Underflow
+                if (rv == g_double_zero)
+                    goto undfl;
+#endif
+            }
+#endif
+            break;
+        }
+        if ((aadj = ratio(delta, bs)) <= 2.) {
+            if (dsign)
+                aadj = aadj1 = 1.;
+            else if (getWord1(rv) || getWord0(rv) & Bndry_mask) {
+#ifndef Sudden_Underflow
+                if (getWord1(rv) == Tiny1 && !getWord0(rv))
+                    goto undfl;
+#endif
+                aadj = 1.;
+                aadj1 = -1.;
+            }
+            else {
+                /* special case -- power of FLT_RADIX to be */
+                /* rounded down... */
+
+                if (aadj < 2./FLT_RADIX)
+                    aadj = 1./FLT_RADIX;
+                else
+                    aadj *= 0.5;
+                aadj1 = -aadj;
+            }
+        }
+        else {
+            aadj *= 0.5;
+            aadj1 = dsign ? aadj : -aadj;
+#ifdef Check_FLT_ROUNDS
+            switch(FLT_ROUNDS) {
+            case 2: /* towards +infinity */
+                aadj1 -= 0.5;
+                break;
+            case 0: /* towards 0 */
+            case 3: /* towards -infinity */
+                aadj1 += 0.5;
+            }
+#else
+            if (FLT_ROUNDS == 0)
+                aadj1 += 0.5;
+#endif
+        }
+        y = getWord0(rv) & Exp_mask;
+
+        /* Check for overflow */
+
+        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
+            rv0 = rv;
+            setWord0(&rv, getWord0(rv) - P*Exp_msk1);
+            adj = aadj1 * ulp(rv);
+            rv += adj;
+            if ((getWord0(rv) & Exp_mask) >=
+                Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
+                if (getWord0(rv0) == Big0 && getWord1(rv0) == Big1)
+                    goto ovfl;
+                setWord0(&rv, Big0);
+                setWord1(&rv, Big1);
+                goto cont;
+            }
+            else
+                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
+        }
+        else {
+#ifdef Sudden_Underflow
+            if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) {
+                rv0 = rv;
+                setWord0(&rv, getWord0(rv) + P*Exp_msk1);
+                adj = aadj1 * ulp(rv);
+                rv += adj;
+#ifdef IBM
+                if ((getWord0(rv) & Exp_mask) <  P*Exp_msk1)
+#else
+                    if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1)
+#endif
+                        {
+                            if (getWord0(rv0) == Tiny0
+                                && getWord1(rv0) == Tiny1)
+                                goto undfl;
+                            setWord0(&rv, Tiny0);
+                            setWord1(&rv, Tiny1);
+                            goto cont;
+                        }
+                    else
+                        setWord0(&rv, getWord0(rv) - P*Exp_msk1);
+            }
+            else {
+                adj = aadj1 * ulp(rv);
+                rv += adj;
+            }
+#else
+            /* Compute adj so that the IEEE rounding rules will
+             * correctly round rv + adj in some half-way cases.
+             * If rv * ulp(rv) is denormalized (i.e.,
+             * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
+             * trouble from bits lost to denormalization;
+             * example: 1.2e-307 .
+             */
+            if (y <= (P-1)*Exp_msk1 && aadj >= 1.) {
+                aadj1 = int(aadj + 0.5);
+                if (!dsign)
+                    aadj1 = -aadj1;
+            }
+            adj = aadj1 * ulp(rv);
+            rv += adj;
+#endif
+        }
+        z = getWord0(rv) & Exp_mask;
+        if (y == z) {
+            /* Can we stop now? */
+            L = Long(aadj);
+            aadj -= L;
+            /* The tolerances below are conservative. */
+            if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) {
+                if (aadj < .4999999 || aadj > .5000001)
+                    break;
+            }
+            else if (aadj < .4999999/FLT_RADIX)
+                break;
+        }
+    cont:
+        Bfree(bb);
+        Bfree(bd);
+        Bfree(bs);
+        Bfree(delta);
+    }
+ retfree:
+    Bfree(bb);
+    Bfree(bd);
+    Bfree(bs);
+    Bfree(bd0);
+    Bfree(delta);
+ ret:
+    if (se)
+        *se = s;
+    return sign ? -rv : rv;
+}
+
+static int quorem(Bigint *b, Bigint *S)
+{
+    int n;
+    Long borrow, y;
+    ULong carry, q, ys;
+    ULong *bx, *bxe, *sx, *sxe;
+#ifdef Pack_32
+    Long z;
+    ULong si, zs;
+#endif
+
+    n = S->wds;
+#ifdef BSD_QDTOA_DEBUG
+    /*debug*/ if (b->wds > n)
+        /*debug*/        Bug("oversize b in quorem");
+#endif
+    if (b->wds < n)
+        return 0;
+    sx = S->x;
+    sxe = sx + --n;
+    bx = b->x;
+    bxe = bx + n;
+    q = *bxe / (*sxe + 1);        /* ensure q <= true quotient */
+#ifdef BSD_QDTOA_DEBUG
+    /*debug*/ if (q > 9)
+        /*debug*/        Bug("oversized quotient in quorem");
+#endif
+    if (q) {
+        borrow = 0;
+        carry = 0;
+        do {
+#ifdef Pack_32
+            si = *sx++;
+            ys = (si & 0xffff) * q + carry;
+            zs = (si >> 16) * q + (ys >> 16);
+            carry = zs >> 16;
+            y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
+            borrow = y >> 16;
+            Sign_Extend(borrow, y);
+            z = (*bx >> 16) - (zs & 0xffff) + borrow;
+            borrow = z >> 16;
+            Sign_Extend(borrow, z);
+            Storeinc(bx, z, y);
+#else
+            ys = *sx++ * q + carry;
+            carry = ys >> 16;
+            y = *bx - (ys & 0xffff) + borrow;
+            borrow = y >> 16;
+            Sign_Extend(borrow, y);
+            *bx++ = y & 0xffff;
+#endif
+        }
+        while(sx <= sxe);
+        if (!*bxe) {
+            bx = b->x;
+            while(--bxe > bx && !*bxe)
+                --n;
+            b->wds = n;
+        }
+    }
+    if (cmp(b, S) >= 0) {
+        q++;
+        borrow = 0;
+        carry = 0;
+        bx = b->x;
+        sx = S->x;
+        do {
+#ifdef Pack_32
+            si = *sx++;
+            ys = (si & 0xffff) + carry;
+            zs = (si >> 16) + (ys >> 16);
+            carry = zs >> 16;
+            y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
+            borrow = y >> 16;
+            Sign_Extend(borrow, y);
+            z = (*bx >> 16) - (zs & 0xffff) + borrow;
+            borrow = z >> 16;
+            Sign_Extend(borrow, z);
+            Storeinc(bx, z, y);
+#else
+            ys = *sx++ + carry;
+            carry = ys >> 16;
+            y = *bx - (ys & 0xffff) + borrow;
+            borrow = y >> 16;
+            Sign_Extend(borrow, y);
+            *bx++ = y & 0xffff;
+#endif
+        }
+        while(sx <= sxe);
+        bx = b->x;
+        bxe = bx + n;
+        if (!*bxe) {
+            while(--bxe > bx && !*bxe)
+                --n;
+            b->wds = n;
+        }
+    }
+    return q;
+}
+
+/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
+ *
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
+ *
+ * Modifications:
+ *        1. Rather than iterating, we use a simple numeric overestimate
+ *           to determine k = floor(log10(d)).  We scale relevant
+ *           quantities using O(log2(k)) rather than O(k) multiplications.
+ *        2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
+ *           try to generate digits strictly left to right.  Instead, we
+ *           compute with fewer bits and propagate the carry if necessary
+ *           when rounding the final digit up.  This is often faster.
+ *        3. Under the assumption that input will be rounded nearest,
+ *           mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
+ *           That is, we allow equality in stopping tests when the
+ *           round-nearest rule will give the same floating-point value
+ *           as would satisfaction of the stopping test with strict
+ *           inequality.
+ *        4. We remove common factors of powers of 2 from relevant
+ *           quantities.
+ *        5. When converting floating-point integers less than 1e16,
+ *           we use floating-point arithmetic rather than resorting
+ *           to multiple-precision integers.
+ *        6. When asked to produce fewer than 15 digits, we first try
+ *           to get by with floating-point arithmetic; we resort to
+ *           multiple-precision integer arithmetic only if we cannot
+ *           guarantee that the floating-point calculation has given
+ *           the correctly rounded result.  For k requested digits and
+ *           "uniformly" distributed input, the probability is
+ *           something like 10^(k-15) that we must resort to the Long
+ *           calculation.
+ */
+
+
+/* This actually sometimes returns a pointer to a string literal
+   cast to a char*. Do NOT try to modify the return value. */
+
+Q_CORE_EXPORT char *qdtoa ( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+{
+    // Some values of the floating-point control word can cause _qdtoa to crash with an underflow.
+    // We set a safe value here.
+#ifdef Q_OS_WIN
+    _clear87();
+    unsigned int oldbits = _control87(0, 0);
+#ifndef MCW_EM
+#    ifdef _MCW_EM
+#        define MCW_EM _MCW_EM
+#    else
+#        define MCW_EM 0x0008001F
+#    endif
+#endif
+    _control87(MCW_EM, MCW_EM);
+#endif
+
+#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
+    fenv_t envp;
+    feholdexcept(&envp);
+#endif
+
+    char *s = _qdtoa(d, mode, ndigits, decpt, sign, rve, resultp);
+
+#ifdef Q_OS_WIN
+    _clear87();
+#ifndef _M_X64
+    _control87(oldbits, 0xFFFFF);
+#else
+    _control87(oldbits, _MCW_EM|_MCW_DN|_MCW_RC);
+#endif //_M_X64
+#endif //Q_OS_WIN
+
+#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
+    fesetenv(&envp);
+#endif
+
+    return s;
+}
+
+static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+{
+    /*
+      Arguments ndigits, decpt, sign are similar to those
+      of ecvt and fcvt; trailing zeros are suppressed from
+      the returned string.  If not null, *rve is set to point
+      to the end of the return value.  If d is +-Infinity or NaN,
+      then *decpt is set to 9999.
+
+      mode:
+      0 ==> shortest string that yields d when read in
+      and rounded to nearest.
+      1 ==> like 0, but with Steele & White stopping rule;
+      e.g. with IEEE P754 arithmetic , mode 0 gives
+      1e23 whereas mode 1 gives 9.999999999999999e22.
+      2 ==> max(1,ndigits) significant digits.  This gives a
+      return value similar to that of ecvt, except
+      that trailing zeros are suppressed.
+      3 ==> through ndigits past the decimal point.  This
+      gives a return value similar to that from fcvt,
+      except that trailing zeros are suppressed, and
+      ndigits can be negative.
+      4-9 should give the same return values as 2-3, i.e.,
+      4 <= mode <= 9 ==> same return as mode
+      2 + (mode & 1).  These modes are mainly for
+      debugging; often they run slower but sometimes
+      faster than modes 2-3.
+      4,5,8,9 ==> left-to-right digit generation.
+      6-9 ==> don't try fast floating-point estimate
+      (if applicable).
+
+      Values of mode other than 0-9 are treated as mode 0.
+
+      Sufficient space is allocated to the return value
+      to hold the suppressed trailing zeros.
+    */
+
+    int bbits, b2, b5, be, dig, i, ieps, ilim0,
+        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
+        try_quick;
+    int ilim = 0, ilim1 = 0, spec_case = 0;        /* pacify gcc */
+    Long L;
+#ifndef Sudden_Underflow
+    int denorm;
+    ULong x;
+#endif
+    Bigint *b, *b1, *delta, *mhi, *S;
+    Bigint *mlo = NULL; /* pacify gcc */
+    double d2;
+    double ds, eps;
+    char *s, *s0;
+
+    if (getWord0(d) & Sign_bit) {
+        /* set sign for everything, including 0's and NaNs */
+        *sign = 1;
+        setWord0(&d, getWord0(d) & ~Sign_bit);        /* clear sign bit */
+    }
+    else
+        *sign = 0;
+
+#if defined(IEEE_Arith) + defined(VAX)
+#ifdef IEEE_Arith
+    if ((getWord0(d) & Exp_mask) == Exp_mask)
+#else
+        if (getWord0(d)  == 0x8000)
+#endif
+            {
+                /* Infinity or NaN */
+                *decpt = 9999;
+                s =
+#ifdef IEEE_Arith
+                    !getWord1(d) && !(getWord0(d) & 0xfffff) ? const_cast<char*>("Infinity") :
+#endif
+                    const_cast<char*>("NaN");
+                if (rve)
+                    *rve =
+#ifdef IEEE_Arith
+                        s[3] ? s + 8 :
+#endif
+                        s + 3;
+                return s;
+            }
+#endif
+#ifdef IBM
+    d += 0; /* normalize */
+#endif
+    if (d == g_double_zero)
+        {
+            *decpt = 1;
+            s = const_cast<char*>("0");
+            if (rve)
+                *rve = s + 1;
+            return s;
+        }
+
+    b = d2b(d, &be, &bbits);
+#ifdef Sudden_Underflow
+    i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
+#else
+    if ((i = int(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) {
+#endif
+        d2 = d;
+        setWord0(&d2, getWord0(d2) & Frac_mask1);
+        setWord0(&d2, getWord0(d2) | Exp_11);
+#ifdef IBM
+        if (j = 11 - hi0bits(getWord0(d2) & Frac_mask))
+            d2 /= 1 << j;
+#endif
+
+        /* log(x)        ~=~ log(1.5) + (x-1.5)/1.5
+         * log10(x)         =  log(x) / log(10)
+         *                ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
+         * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
+         *
+         * This suggests computing an approximation k to log10(d) by
+         *
+         * k = (i - Bias)*0.301029995663981
+         *        + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
+         *
+         * We want k to be too large rather than too small.
+         * The error in the first-order Taylor series approximation
+         * is in our favor, so we just round up the constant enough
+         * to compensate for any error in the multiplication of
+         * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
+         * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
+         * adding 1e-13 to the constant term more than suffices.
+         * Hence we adjust the constant term to 0.1760912590558.
+         * (We could get a more accurate k by invoking log10,
+         *  but this is probably not worthwhile.)
+         */
+
+        i -= Bias;
+#ifdef IBM
+        i <<= 2;
+        i += j;
+#endif
+#ifndef Sudden_Underflow
+        denorm = 0;
+    }
+    else {
+        /* d is denormalized */
+
+        i = bbits + be + (Bias + (P-1) - 1);
+        x = i > 32  ? getWord0(d) << (64 - i) | getWord1(d) >> (i - 32)
+            : getWord1(d) << (32 - i);
+        d2 = x;
+        setWord0(&d2, getWord0(d2) - 31*Exp_msk1); /* adjust exponent */
+        i -= (Bias + (P-1) - 1) + 1;
+        denorm = 1;
+    }
+#endif
+    ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
+    k = int(ds);
+    if (ds < 0. && ds != k)
+        k--;        /* want k = floor(ds) */
+    k_check = 1;
+    if (k >= 0 && k <= Ten_pmax) {
+        if (d < tens[k])
+            k--;
+        k_check = 0;
+    }
+    j = bbits - i - 1;
+    if (j >= 0) {
+        b2 = 0;
+        s2 = j;
+    }
+    else {
+        b2 = -j;
+        s2 = 0;
+    }
+    if (k >= 0) {
+        b5 = 0;
+        s5 = k;
+        s2 += k;
+    }
+    else {
+        b2 -= k;
+        b5 = -k;
+        s5 = 0;
+    }
+    if (mode < 0 || mode > 9)
+        mode = 0;
+    try_quick = 1;
+    if (mode > 5) {
+        mode -= 4;
+        try_quick = 0;
+    }
+    leftright = 1;
+    switch(mode) {
+    case 0:
+    case 1:
+        ilim = ilim1 = -1;
+        i = 18;
+        ndigits = 0;
+        break;
+    case 2:
+        leftright = 0;
+        /* no break */
+    case 4:
+        if (ndigits <= 0)
+            ndigits = 1;
+        ilim = ilim1 = i = ndigits;
+        break;
+    case 3:
+        leftright = 0;
+        /* no break */
+    case 5:
+        i = ndigits + k + 1;
+        ilim = i;
+        ilim1 = i - 1;
+        if (i <= 0)
+            i = 1;
+    }
+    QT_TRY {
+        *resultp = static_cast<char *>(malloc(i + 1));
+        Q_CHECK_PTR(*resultp);
+    } QT_CATCH(...) {
+        Bfree(b);
+        QT_RETHROW;
+    }
+    s = s0 = *resultp;
+
+    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
+
+        /* Try to get by with floating-point arithmetic. */
+
+        i = 0;
+        d2 = d;
+        k0 = k;
+        ilim0 = ilim;
+        ieps = 2; /* conservative */
+        if (k > 0) {
+            ds = tens[k&0xf];
+            j = k >> 4;
+            if (j & Bletch) {
+                /* prevent overflows */
+                j &= Bletch - 1;
+                d /= bigtens[n_bigtens-1];
+                ieps++;
+            }
+            for(; j; j >>= 1, i++)
+                if (j & 1) {
+                    ieps++;
+                    ds *= bigtens[i];
+                }
+            d /= ds;
+        }
+        else if ((j1 = -k) != 0) {
+            d *= tens[j1 & 0xf];
+            for(j = j1 >> 4; j; j >>= 1, i++)
+                if (j & 1) {
+                    ieps++;
+                    d *= bigtens[i];
+                }
+        }
+        if (k_check && d < 1. && ilim > 0) {
+            if (ilim1 <= 0)
+                goto fast_failed;
+            ilim = ilim1;
+            k--;
+            d *= 10.;
+            ieps++;
+        }
+        eps = ieps*d + 7.;
+        setWord0(&eps, getWord0(eps) - (P-1)*Exp_msk1);
+        if (ilim == 0) {
+            S = mhi = 0;
+            d -= 5.;
+            if (d > eps)
+                goto one_digit;
+            if (d < -eps)
+                goto no_digits;
+            goto fast_failed;
+        }
+#ifndef No_leftright
+        if (leftright) {
+            /* Use Steele & White method of only
+             * generating digits needed.
+             */
+            eps = 0.5/tens[ilim-1] - eps;
+            for(i = 0;;) {
+                L = Long(d);
+                d -= L;
+                *s++ = '0' + int(L);
+                if (d < eps)
+                    goto ret1;
+                if (1. - d < eps)
+                    goto bump_up;
+                if (++i >= ilim)
+                    break;
+                eps *= 10.;
+                d *= 10.;
+            }
+        }
+        else {
+#endif
+            /* Generate ilim digits, then fix them up. */
+#if defined(Q_OS_IRIX) && defined(Q_CC_GNU)
+            // work around a bug on 64 bit IRIX gcc
+            double *t = (double *) tens;
+            eps *= t[ilim-1];
+#else
+            eps *= tens[ilim-1];
+#endif
+            for(i = 1;; i++, d *= 10.) {
+                L = Long(d);
+                d -= L;
+                *s++ = '0' + int(L);
+                if (i == ilim) {
+                    if (d > 0.5 + eps)
+                        goto bump_up;
+                    else if (d < 0.5 - eps) {
+                        while(*--s == '0') {}
+                        s++;
+                        goto ret1;
+                    }
+                    break;
+                }
+            }
+#ifndef No_leftright
+        }
+#endif
+    fast_failed:
+        s = s0;
+        d = d2;
+        k = k0;
+        ilim = ilim0;
+    }
+
+    /* Do we have a "small" integer? */
+
+    if (be >= 0 && k <= Int_max) {
+        /* Yes. */
+        ds = tens[k];
+        if (ndigits < 0 && ilim <= 0) {
+            S = mhi = 0;
+            if (ilim < 0 || d <= 5*ds)
+                goto no_digits;
+            goto one_digit;
+        }
+        for(i = 1;; i++) {
+            L = Long(d / ds);
+            d -= L*ds;
+#ifdef Check_FLT_ROUNDS
+            /* If FLT_ROUNDS == 2, L will usually be high by 1 */
+            if (d < 0) {
+                L--;
+                d += ds;
+            }
+#endif
+            *s++ = '0' + int(L);
+            if (i == ilim) {
+                d += d;
+                if (d > ds || (d == ds && L & 1)) {
+                bump_up:
+                    while(*--s == '9')
+                        if (s == s0) {
+                            k++;
+                            *s = '0';
+                            break;
+                        }
+                    ++*s++;
+                }
+                break;
+            }
+            if ((d *= 10.) == g_double_zero)
+                break;
+        }
+        goto ret1;
+    }
+
+    m2 = b2;
+    m5 = b5;
+    mhi = mlo = 0;
+    if (leftright) {
+        if (mode < 2) {
+            i =
+#ifndef Sudden_Underflow
+                denorm ? be + (Bias + (P-1) - 1 + 1) :
+#endif
+#ifdef IBM
+                1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
+#else
+            1 + P - bbits;
+#endif
+        }
+        else {
+            j = ilim - 1;
+            if (m5 >= j)
+                m5 -= j;
+            else {
+                s5 += j -= m5;
+                b5 += j;
+                m5 = 0;
+            }
+            if ((i = ilim) < 0) {
+                m2 -= i;
+                i = 0;
+            }
+        }
+        b2 += i;
+        s2 += i;
+        mhi = i2b(1);
+    }
+    if (m2 > 0 && s2 > 0) {
+        i = m2 < s2 ? m2 : s2;
+        b2 -= i;
+        m2 -= i;
+        s2 -= i;
+    }
+    if (b5 > 0) {
+        if (leftright) {
+            if (m5 > 0) {
+                mhi = pow5mult(mhi, m5);
+                b1 = mult(mhi, b);
+                Bfree(b);
+                b = b1;
+            }
+            if ((j = b5 - m5) != 0)
+                b = pow5mult(b, j);
+        }
+        else
+            b = pow5mult(b, b5);
+    }
+    S = i2b(1);
+    if (s5 > 0)
+        S = pow5mult(S, s5);
+
+    /* Check for special case that d is a normalized power of 2. */
+
+    if (mode < 2) {
+        if (!getWord1(d) && !(getWord0(d) & Bndry_mask)
+#ifndef Sudden_Underflow
+            && getWord0(d) & Exp_mask
+#endif
+            ) {
+            /* The special case */
+            b2 += Log2P;
+            s2 += Log2P;
+            spec_case = 1;
+        }
+        else
+            spec_case = 0;
+    }
+
+    /* Arrange for convenient computation of quotients:
+     * shift left if necessary so divisor has 4 leading 0 bits.
+     *
+     * Perhaps we should just compute leading 28 bits of S once
+     * and for all and pass them and a shift to quorem, so it
+     * can do shifts and ors to compute the numerator for q.
+     */
+#ifdef Pack_32
+    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
+        i = 32 - i;
+#else
+    if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
+        i = 16 - i;
+#endif
+    if (i > 4) {
+        i -= 4;
+        b2 += i;
+        m2 += i;
+        s2 += i;
+    }
+    else if (i < 4) {
+        i += 28;
+        b2 += i;
+        m2 += i;
+        s2 += i;
+    }
+    if (b2 > 0)
+        b = lshift(b, b2);
+    if (s2 > 0)
+        S = lshift(S, s2);
+    if (k_check) {
+        if (cmp(b,S) < 0) {
+            k--;
+            b = multadd(b, 10, 0);        /* we botched the k estimate */
+            if (leftright)
+                mhi = multadd(mhi, 10, 0);
+            ilim = ilim1;
+        }
+    }
+    if (ilim <= 0 && mode > 2) {
+        if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
+            /* no digits, fcvt style */
+        no_digits:
+            k = -1 - ndigits;
+            goto ret;
+        }
+    one_digit:
+        *s++ = '1';
+        k++;
+        goto ret;
+    }
+    if (leftright) {
+        if (m2 > 0)
+            mhi = lshift(mhi, m2);
+
+        /* Compute mlo -- check for special case
+         * that d is a normalized power of 2.
+         */
+
+        mlo = mhi;
+        if (spec_case) {
+            mhi = Balloc(mhi->k);
+            Bcopy(mhi, mlo);
+            mhi = lshift(mhi, Log2P);
+        }
+
+        for(i = 1;;i++) {
+            dig = quorem(b,S) + '0';
+            /* Do we yet have the shortest decimal string
+             * that will round to d?
+             */
+            j = cmp(b, mlo);
+            delta = diff(S, mhi);
+            j1 = delta->sign ? 1 : cmp(b, delta);
+            Bfree(delta);
+#ifndef ROUND_BIASED
+            if (j1 == 0 && !mode && !(getWord1(d) & 1)) {
+                if (dig == '9')
+                    goto round_9_up;
+                if (j > 0)
+                    dig++;
+                *s++ = dig;
+                goto ret;
+            }
+#endif
+            if (j < 0 || (j == 0 && !mode
+#ifndef ROUND_BIASED
+                          && !(getWord1(d) & 1)
+#endif
+                          )) {
+                if (j1 > 0) {
+                    b = lshift(b, 1);
+                    j1 = cmp(b, S);
+                    if ((j1 > 0 || (j1 == 0 && dig & 1))
+                        && dig++ == '9')
+                        goto round_9_up;
+                }
+                *s++ = dig;
+                goto ret;
+            }
+            if (j1 > 0) {
+                if (dig == '9') { /* possible if i == 1 */
+                round_9_up:
+                    *s++ = '9';
+                    goto roundoff;
+                }
+                *s++ = dig + 1;
+                goto ret;
+            }
+            *s++ = dig;
+            if (i == ilim)
+                break;
+            b = multadd(b, 10, 0);
+            if (mlo == mhi)
+                mlo = mhi = multadd(mhi, 10, 0);
+            else {
+                mlo = multadd(mlo, 10, 0);
+                mhi = multadd(mhi, 10, 0);
+            }
+        }
+    }
+    else
+        for(i = 1;; i++) {
+            *s++ = dig = quorem(b,S) + '0';
+            if (i >= ilim)
+                break;
+            b = multadd(b, 10, 0);
+        }
+
+    /* Round off last digit */
+
+    b = lshift(b, 1);
+    j = cmp(b, S);
+    if (j > 0 || (j == 0 && dig & 1)) {
+    roundoff:
+        while(*--s == '9')
+            if (s == s0) {
+                k++;
+                *s++ = '1';
+                goto ret;
+            }
+        ++*s++;
+    }
+    else {
+        while(*--s == '0') {}
+        s++;
+    }
+ ret:
+    Bfree(S);
+    if (mhi) {
+        if (mlo && mlo != mhi)
+            Bfree(mlo);
+        Bfree(mhi);
+    }
+ ret1:
+    Bfree(b);
+    if (s == s0) {                                /* don't return empty string */
+        *s++ = '0';
+        k = 0;
+    }
+    *s = 0;
+    *decpt = k + 1;
+    if (rve)
+        *rve = s;
+    return s0;
+}
+#else
+// NOT thread safe!
+
+#include <errno.h>
+
+Q_CORE_EXPORT char *qdtoa( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+{
+    if(rve)
+      *rve = 0;
+
+    char *res;
+    if (mode == 0)
+        ndigits = 80;
+
+    if (mode == 3)
+        res = fcvt(d, ndigits, decpt, sign);
+    else
+        res = ecvt(d, ndigits, decpt, sign);
+
+    int n = qstrlen(res);
+    if (mode == 0) { // remove trailing 0's
+        const int stop = qMax(1, *decpt);
+        int i;
+        for (i = n-1; i >= stop; --i) {
+            if (res[i] != '0')
+                break;
+        }
+        n = i + 1;
+    }
+    *resultp = static_cast<char*>(malloc(n + 1));
+    Q_CHECK_PTR(resultp);
+    qstrncpy(*resultp, res, n + 1);
+    return *resultp;
+}
+
+Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
+{
+    double ret = strtod((char*)s00, (char**)se);
+    if (ok) {
+      if((ret == 0.0l && errno == ERANGE)
+         || ret == HUGE_VAL || ret == -HUGE_VAL)
+        *ok = false;
+      else
+        *ok = true; // the result will be that we don't report underflow in this case
+    }
+    return ret;
+}
+
+#endif // QT_QLOCALE_USES_FCVT
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_tools_p.h b/src/corelib/tools/qlocale_tools_p.h
new file mode 100644
index 0000000..07631d5
--- /dev/null
+++ b/src/corelib/tools/qlocale_tools_p.h
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QLOCALE_TOOLS_P_H
+#define QLOCALE_TOOLS_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 "qlocale_p.h"
+#include "qstring.h"
+
+#if !defined(QT_QLOCALE_NEEDS_VOLATILE)
+#  if defined(Q_CC_GNU)
+#    if  __GNUC__ == 4
+#      define QT_QLOCALE_NEEDS_VOLATILE
+#    elif defined(Q_OS_WIN)
+#      define QT_QLOCALE_NEEDS_VOLATILE
+#    endif
+#  endif
+#endif
+
+#if defined(QT_QLOCALE_NEEDS_VOLATILE)
+#   define NEEDS_VOLATILE volatile
+#else
+#   define NEEDS_VOLATILE
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QString qulltoa(qulonglong l, int base, const QChar _zero);
+QString qlltoa(qlonglong l, int base, const QChar zero);
+
+enum PrecisionMode {
+    PMDecimalDigits =             0x01,
+    PMSignificantDigits =   0x02,
+    PMChopTrailingZeros =   0x03
+};
+
+QString &decimalForm(QChar zero, QChar decimal, QChar group,
+                     QString &digits, int decpt, uint precision,
+                     PrecisionMode pm,
+                     bool always_show_decpt,
+                     bool thousands_group);
+QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
+                      QChar group, QChar plus, QChar minus,
+                      QString &digits, int decpt, uint precision,
+                      PrecisionMode pm,
+                      bool always_show_decpt);
+
+inline bool isZero(double d)
+{
+    uchar *ch = (uchar *)&d;
+#ifdef QT_ARMFPA
+        return !(ch[3] & 0x7F || ch[2] || ch[1] || ch[0] || ch[7] || ch[6] || ch[5] || ch[4]);
+#else
+    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+        return !(ch[0] & 0x7F || ch[1] || ch[2] || ch[3] || ch[4] || ch[5] || ch[6] || ch[7]);
+    } else {
+        return !(ch[7] & 0x7F || ch[6] || ch[5] || ch[4] || ch[3] || ch[2] || ch[1] || ch[0]);
+    }
+#endif
+}
+
+// Removes thousand-group separators in "C" locale.
+bool removeGroupSeparators(QLocalePrivate::CharBuff *num);
+
+Q_CORE_EXPORT char *qdtoa(double d, int mode, int ndigits, int *decpt,
+                          int *sign, char **rve, char **digits_str);
+Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
+qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok);
+qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok);
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
new file mode 100644
index 0000000..7d43726
--- /dev/null
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qlocale_p.h"
+
+#include "qdatetime.h"
+#include "qstringlist.h"
+#include "qvariant.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_SYSTEMLOCALE
+struct QSystemLocaleData
+{
+    QSystemLocaleData()
+        : lc_numeric(QLocale::C)
+         ,lc_time(QLocale::C)
+         ,lc_monetary(QLocale::C)
+         ,lc_messages(QLocale::C)
+    {
+        QByteArray all = qgetenv("LC_ALL");
+        QByteArray numeric  = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
+        QByteArray time     = all.isEmpty() ? qgetenv("LC_TIME") : all;
+        QByteArray monetary = all.isEmpty() ? qgetenv("LC_MONETARY") : all;
+        QByteArray messages = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
+        QByteArray lang = qgetenv("LANG");
+        if (numeric.isEmpty())
+            numeric = lang;
+        if (monetary.isEmpty())
+            monetary = lang;
+        if (messages.isEmpty())
+            messages = lang;
+        lc_numeric = QLocale(QString::fromAscii(numeric));
+        lc_time = QLocale(QString::fromAscii(time));
+        lc_monetary = QLocale(QString::fromAscii(monetary));
+        lc_messages = QLocale(QString::fromAscii(messages));
+    }
+
+    QLocale lc_numeric;
+    QLocale lc_time;
+    QLocale lc_monetary;
+    QLocale lc_messages;
+};
+Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
+#endif
+
+
+static uint unixGetSystemMeasurementSystem()
+{
+    QString meas_locale = QString::fromLocal8Bit(qgetenv("LC_ALL"));
+    if (meas_locale.isEmpty()) {
+        meas_locale = QString::fromLocal8Bit(qgetenv("LC_MEASUREMENT"));
+    }
+    if (meas_locale.isEmpty()) {
+        meas_locale = QString::fromLocal8Bit(qgetenv("LANG"));
+    }
+    if (meas_locale.isEmpty()) {
+        meas_locale = QString::fromLocal8Bit("C");
+    }
+
+    if (meas_locale.compare(QString::fromLocal8Bit("Metric"), Qt::CaseInsensitive) == 0)
+        return 0;
+    if (meas_locale.compare(QString::fromLocal8Bit("Other"), Qt::CaseInsensitive) == 0)
+        return 0;
+
+    const QLocalePrivate* locale = findLocale(meas_locale);
+    return locale->measurementSystem();
+}
+
+static QByteArray envVarLocale()
+{
+    static QByteArray lang = 0;
+#ifdef Q_OS_UNIX
+    lang = qgetenv("LC_ALL");
+    if (lang.isNull())
+        lang = qgetenv("LC_NUMERIC");
+    if (lang.isNull())
+#endif
+        lang = qgetenv("LANG");
+    return lang;
+}
+
+#ifndef QT_NO_SYSTEMLOCALE
+/*!
+    \internal
+*/
+QLocale QSystemLocale::fallbackLocale() const
+{
+    return QLocale(QLatin1String(envVarLocale()));
+}
+
+/*!
+    \internal
+*/
+QVariant QSystemLocale::query(QueryType type, QVariant in) const
+{
+    QSystemLocaleData *d = qSystemLocaleData();
+    const QLocale &lc_numeric = d->lc_numeric;
+    const QLocale &lc_time = d->lc_time;
+    const QLocale &lc_monetary = d->lc_monetary;
+
+    switch (type) {
+    case DecimalPoint:
+        return lc_numeric.decimalPoint();
+    case GroupSeparator:
+        return lc_numeric.groupSeparator();
+    case ZeroDigit:
+        return lc_numeric.zeroDigit();
+    case NegativeSign:
+        return lc_numeric.negativeSign();
+    case DateFormatLong:
+        return lc_time.dateFormat(QLocale::LongFormat);
+    case DateFormatShort:
+        return lc_time.dateFormat(QLocale::ShortFormat);
+    case TimeFormatLong:
+        return lc_time.timeFormat(QLocale::LongFormat);
+    case TimeFormatShort:
+        return lc_time.timeFormat(QLocale::ShortFormat);
+    case DayNameLong:
+        return lc_time.dayName(in.toInt(), QLocale::LongFormat);
+    case DayNameShort:
+        return lc_time.dayName(in.toInt(), QLocale::ShortFormat);
+    case MonthNameLong:
+        return lc_time.monthName(in.toInt(), QLocale::LongFormat);
+    case MonthNameShort:
+        return lc_time.monthName(in.toInt(), QLocale::ShortFormat);
+    case DateToStringLong:
+        return lc_time.toString(in.toDate(), QLocale::LongFormat);
+    case DateToStringShort:
+        return lc_time.toString(in.toDate(), QLocale::ShortFormat);
+    case TimeToStringLong:
+        return lc_time.toString(in.toTime(), QLocale::LongFormat);
+    case TimeToStringShort:
+        return lc_time.toString(in.toTime(), QLocale::ShortFormat);
+    case DateTimeFormatLong:
+        return lc_time.dateTimeFormat(QLocale::LongFormat);
+    case DateTimeFormatShort:
+        return lc_time.dateTimeFormat(QLocale::ShortFormat);
+    case DateTimeToStringLong:
+        return lc_time.toString(in.toDateTime(), QLocale::LongFormat);
+    case DateTimeToStringShort:
+        return lc_time.toString(in.toDateTime(), QLocale::ShortFormat);
+    case PositiveSign:
+        return lc_numeric.positiveSign();
+    case AMText:
+        return lc_time.amText();
+    case PMText:
+        return lc_time.pmText();
+    case FirstDayOfWeek:
+        return lc_time.firstDayOfWeek();
+    case CurrencySymbol:
+        return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
+    case FormatCurrency: {
+        switch (in.type()) {
+        case QVariant::Int:
+            return lc_monetary.toCurrencyString(in.toInt());
+        case QVariant::UInt:
+            return lc_monetary.toCurrencyString(in.toUInt());
+        case QVariant::Double:
+            return lc_monetary.toCurrencyString(in.toDouble());
+        case QVariant::LongLong:
+            return lc_monetary.toCurrencyString(in.toLongLong());
+        case QVariant::ULongLong:
+            return lc_monetary.toCurrencyString(in.toULongLong());
+        default:
+            break;
+        }
+        return QString();
+    }
+    case MeasurementSystem:
+        return QVariant(unixGetSystemMeasurementSystem());
+    case UILanguages: {
+        QString languages = QString::fromLocal8Bit(qgetenv("LANGUAGE"));
+        if (!languages.isEmpty()) {
+            QStringList lst = languages.split(QLatin1Char(':'));
+            for (int i = 0; i < lst.size();) {
+                const QString &name = lst.at(i);
+                QChar lang[3];
+                QChar cntry[3];
+                if (name.isEmpty() || !splitLocaleName(name, lang, cntry))
+                    lst.removeAt(i);
+                else
+                    ++i;
+            }
+            return lst;
+        }
+        QString name = QString::fromLocal8Bit(qgetenv("LC_ALL"));
+        if (name.isEmpty()) {
+            name = QString::fromLocal8Bit(qgetenv("LC_MESSAGES"));
+            if (name.isEmpty())
+                name = QString::fromLocal8Bit(qgetenv("LANG"));
+        }
+        if (!name.isEmpty()) {
+            QChar lang[3];
+            QChar cntry[3];
+            int lang_len, cntry_len;
+            if (splitLocaleName(name, lang, cntry, &lang_len, &cntry_len))
+                return QStringList(QString::fromRawData(lang, lang_len) % QLatin1Char('-') % QString::fromRawData(cntry, cntry_len));
+        }
+        return QVariant();
+    }
+    case QuotationBegin:
+    case QuotationEnd:
+        break; // TODO
+    default:
+        break;
+    }
+    return QVariant();
+}
+#endif // QT_NO_SYSTEMLOCALE
+
+QString timeZone()
+{
+    tzset();
+    return QString::fromLocal8Bit(tzname[1]);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
new file mode 100644
index 0000000..3605e44
--- /dev/null
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -0,0 +1,757 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qlocale_p.h"
+#include "qlocale_tools_p.h"
+
+#include "qstringlist.h"
+#include "qvariant.h"
+#include "qdatetime.h"
+
+#include "private/qsystemlibrary_p.h"
+
+#if defined(Q_WS_WIN)
+#   include "qt_windows.h"
+#   include <time.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifndef MUI_LANGUAGE_NAME
+#define MUI_LANGUAGE_NAME 0x8
+#endif
+
+static const char *winLangCodeToIsoName(int code);
+static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
+static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
+
+static QString getWinLocaleInfo(LCTYPE type)
+{
+    LCID id = GetUserDefaultLCID();
+    int cnt = GetLocaleInfo(id, type, 0, 0) * 2;
+
+    if (cnt == 0) {
+        qWarning("QLocale: empty windows locale info (%d)", (int)type);
+        return QString();
+    }
+
+    QByteArray buff(cnt, 0);
+
+    cnt = GetLocaleInfo(id, type, reinterpret_cast<wchar_t*>(buff.data()), buff.size() / 2);
+
+    if (cnt == 0) {
+        qWarning("QLocale: empty windows locale info (%d)", (int)type);
+        return QString();
+    }
+
+    return QString::fromWCharArray(reinterpret_cast<const wchar_t *>(buff.data()));
+}
+
+static QByteArray envVarLocale()
+{
+    static QByteArray lang = qgetenv("LANG");
+    return lang;
+}
+
+QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT)
+{
+    QByteArray result;
+    if (id == LOCALE_USER_DEFAULT) {
+        result = envVarLocale();
+        QChar lang[3];
+        QChar cntry[3];
+        if ( result == "C" || (!result.isEmpty()
+                && splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) ) {
+            long id = 0;
+            bool ok = false;
+            id = qstrtoll(result.data(), 0, 0, &ok);
+            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
+                return result;
+            else
+                return winLangCodeToIsoName( (int)id );
+        }
+    }
+
+#if defined(Q_OS_WINCE)
+    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
+#else
+    if (id == LOCALE_USER_DEFAULT)
+        id = GetUserDefaultLCID();
+    QString resultuage = winIso639LangName(id);
+    QString country = winIso3116CtryName(id);
+    result = resultuage.toLatin1();
+    if (!country.isEmpty()) {
+        result += '_';
+        result += country.toLatin1();
+    }
+#endif
+
+    return result;
+}
+
+Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
+{
+    return QLocale(QString::fromLatin1(getWinLocaleName(id)));
+}
+
+static QString winToQtFormat(const QString &sys_fmt)
+{
+    QString result;
+    int i = 0;
+
+    while (i < sys_fmt.size()) {
+        if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
+            QString text = readEscapedFormatString(sys_fmt, &i);
+            if (text == QLatin1String("'"))
+                result += QLatin1String("''");
+            else
+                result += QString(QLatin1Char('\'') + text + QLatin1Char('\''));
+            continue;
+        }
+
+        QChar c = sys_fmt.at(i);
+        int repeat = repeatCount(sys_fmt, i);
+
+        switch (c.unicode()) {
+            // Date
+            case 'y':
+                if (repeat > 5)
+                    repeat = 5;
+                else if (repeat == 3)
+                    repeat = 2;
+                switch (repeat) {
+                    case 1:
+                        result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
+                        break;
+                    case 5:
+                        result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
+                        break;
+                    default:
+                        result += QString(repeat, QLatin1Char('y'));
+                        break;
+                }
+                break;
+            case 'g':
+                if (repeat > 2)
+                    repeat = 2;
+                switch (repeat) {
+                    case 2:
+                        break; // no equivalent of "gg" in Qt
+                    default:
+                        result += QLatin1Char('g');
+                        break;
+                }
+                break;
+            case 't':
+                if (repeat > 2)
+                    repeat = 2;
+                result += QLatin1String("AP"); // "t" unsupported, use "AP"
+                break;
+            default:
+                result += QString(repeat, c);
+                break;
+        }
+
+        i += repeat;
+    }
+
+    return result;
+}
+
+
+
+static QString winDateToString(const QDate &date, DWORD flags)
+{
+    SYSTEMTIME st;
+    memset(&st, 0, sizeof(SYSTEMTIME));
+    st.wYear = date.year();
+    st.wMonth = date.month();
+    st.wDay = date.day();
+
+    LCID id = GetUserDefaultLCID();
+
+    wchar_t buf[255];
+    if (GetDateFormat(id, flags, &st, 0, buf, 255))
+        return QString::fromWCharArray(buf);
+
+    return QString();
+}
+
+static QString winTimeToString(const QTime &time)
+{
+    SYSTEMTIME st;
+    memset(&st, 0, sizeof(SYSTEMTIME));
+    st.wHour = time.hour();
+    st.wMinute = time.minute();
+    st.wSecond = time.second();
+    st.wMilliseconds = 0;
+
+    DWORD flags = 0;
+    LCID id = GetUserDefaultLCID();
+
+    wchar_t buf[255];
+    if (GetTimeFormat(id, flags, &st, 0, buf, 255))
+        return QString::fromWCharArray(buf);
+
+    return QString();
+}
+
+static QString winDayName(int day, bool short_format)
+{
+    static const LCTYPE short_day_map[]
+        = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
+            LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
+            LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7 };
+
+    static const LCTYPE long_day_map[]
+        = { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2,
+            LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
+            LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
+
+    day -= 1;
+
+    LCTYPE type = short_format
+                    ? short_day_map[day] : long_day_map[day];
+    return getWinLocaleInfo(type);
+}
+
+static QString winMonthName(int month, bool short_format)
+{
+    static const LCTYPE short_month_map[]
+        = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
+            LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
+            LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9,
+            LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
+
+    static const LCTYPE long_month_map[]
+        = { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
+            LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
+            LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
+            LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 };
+
+    month -= 1;
+    if (month < 0 || month > 11)
+    return QString();
+
+    LCTYPE type = short_format ? short_month_map[month] : long_month_map[month];
+    return getWinLocaleInfo(type);
+}
+
+static QLocale::MeasurementSystem winSystemMeasurementSystem()
+{
+    LCID id = GetUserDefaultLCID();
+    wchar_t output[2];
+
+    if (GetLocaleInfo(id, LOCALE_IMEASURE, output, 2)) {
+        QString iMeasure = QString::fromWCharArray(output);
+        if (iMeasure == QLatin1String("1")) {
+            return QLocale::ImperialSystem;
+        }
+    }
+
+    return QLocale::MetricSystem;
+}
+
+static QString winSystemAMText()
+{
+    LCID id = GetUserDefaultLCID();
+    wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
+
+    if (GetLocaleInfo(id, LOCALE_S1159, output, 15)) {
+        return QString::fromWCharArray(output);
+    }
+
+    return QString();
+}
+
+static QString winSystemPMText()
+{
+    LCID id = GetUserDefaultLCID();
+    wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
+
+    if (GetLocaleInfo(id, LOCALE_S2359, output, 15)) {
+        return QString::fromWCharArray(output);
+    }
+
+    return QString();
+}
+
+static quint8 winSystemFirstDayOfWeek()
+{
+    LCID id = GetUserDefaultLCID();
+    wchar_t output[4]; // maximum length including  terminating zero character for Win2003+
+
+    if (GetLocaleInfo(id, LOCALE_IFIRSTDAYOFWEEK, output, 4))
+        return QString::fromWCharArray(output).toUInt()+1;
+
+    return 1;
+}
+
+QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
+{
+    LCID lcid = GetUserDefaultLCID();
+    wchar_t buf[13];
+    switch (format) {
+    case QLocale::CurrencySymbol:
+        if (GetLocaleInfo(lcid, LOCALE_SCURRENCY, buf, 13))
+            return QString::fromWCharArray(buf);
+        break;
+    case QLocale::CurrencyIsoCode:
+        if (GetLocaleInfo(lcid, LOCALE_SINTLSYMBOL, buf, 9))
+            return QString::fromWCharArray(buf);
+        break;
+    case QLocale::CurrencyDisplayName: {
+        QVarLengthArray<wchar_t, 64> buf(64);
+        if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size())) {
+            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+                break;
+            buf.resize(255); // should be large enough, right?
+            if (!GetLocaleInfo(lcid, LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
+                break;
+        }
+        return QString::fromWCharArray(buf.data());
+    }
+    default:
+        break;
+    }
+    return QString();
+}
+
+static QString winFormatCurrency(const QVariant &in)
+{
+    QString value;
+    switch (in.type()) {
+    case QVariant::Int:
+        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
+                                                 in.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::UInt:
+        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
+                                                    in.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::Double:
+        value = QLocalePrivate::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
+                                               QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
+                                               in.toDouble(), -1, QLocalePrivate::DFDecimal, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::LongLong:
+        value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
+                                                 in.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    case QVariant::ULongLong:
+        value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
+                                                    in.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+        break;
+    default:
+        return QString();
+    }
+
+    QVarLengthArray<wchar_t, 64> out(64);
+    LCID lcid = GetUserDefaultLCID();
+    int ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                                  NULL, out.data(), out.size());
+    if (ret == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+        ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                                  NULL, out.data(), 0);
+        out.resize(ret);
+        ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
+                            NULL, out.data(), out.size());
+    }
+
+    return QString::fromWCharArray(out.data());
+}
+
+QStringList winUILanguages()
+{
+    if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) {
+        typedef BOOL (*GetUserPreferredUILanguagesFunc) (
+                    DWORD dwFlags,
+                    PULONG pulNumLanguages,
+                    PWSTR pwszLanguagesBuffer,
+                    PULONG pcchLanguagesBuffer);
+        static GetUserPreferredUILanguagesFunc GetUserPreferredUILanguages_ptr = 0;
+        if (!GetUserPreferredUILanguages_ptr) {
+            QSystemLibrary lib(QLatin1String("kernel32"));
+            if (lib.load())
+                GetUserPreferredUILanguages_ptr = (GetUserPreferredUILanguagesFunc)lib.resolve("GetUserPreferredUILanguages");
+        }
+        if (GetUserPreferredUILanguages_ptr) {
+            unsigned long cnt = 0;
+            QVarLengthArray<wchar_t, 64> buf(64);
+            unsigned long size = buf.size();
+            if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size)) {
+                size = 0;
+                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
+                    GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
+                    buf.resize(size);
+                    if (!GetUserPreferredUILanguages_ptr(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
+                        return QStringList();
+                }
+            }
+            QStringList result;
+            result.reserve(cnt);
+            const wchar_t *str = buf.constData();
+            for (; cnt > 0; --cnt) {
+                QString s = QString::fromWCharArray(str);
+                if (s.isEmpty())
+                    break; // something is wrong
+                result.append(s);
+                str += s.size()+1;
+            }
+            return result;
+        }
+    }
+
+    // old Windows before Vista
+    return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
+}
+
+#ifndef QT_NO_SYSTEMLOCALE
+
+/*!
+    \since 4.6
+    Returns the fallback locale obtained from the system.
+ */
+QLocale QSystemLocale::fallbackLocale() const
+{
+    return QLocale(QString::fromLatin1(getWinLocaleName()));
+}
+
+QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+{
+    LCTYPE locale_info = 0;
+    bool format_string = false;
+
+    switch(type) {
+//     case Name:
+//         return getWinLocaleName();
+    case DecimalPoint:
+        locale_info = LOCALE_SDECIMAL;
+        break;
+    case GroupSeparator:
+        locale_info = LOCALE_STHOUSAND;
+        break;
+    case NegativeSign:
+        locale_info = LOCALE_SNEGATIVESIGN;
+        break;
+    case PositiveSign:
+        locale_info = LOCALE_SPOSITIVESIGN;
+        break;
+    case DateFormatLong:
+        locale_info = LOCALE_SLONGDATE;
+        format_string = true;
+        break;
+    case DateFormatShort:
+        locale_info = LOCALE_SSHORTDATE;
+        format_string = true;
+        break;
+    case TimeFormatLong:
+    case TimeFormatShort:
+        locale_info = LOCALE_STIMEFORMAT;
+        format_string = true;
+        break;
+
+    case DateTimeFormatLong:
+    case DateTimeFormatShort:
+        return QString(query(type == DateTimeFormatLong ? DateFormatLong : DateFormatShort).toString()
+            + QLatin1Char(' ') + query(type == DateTimeFormatLong ? TimeFormatLong : TimeFormatShort).toString());
+    case DayNameLong:
+    case DayNameShort:
+        return winDayName(in.toInt(), (type == DayNameShort));
+    case MonthNameLong:
+    case MonthNameShort:
+        return winMonthName(in.toInt(), (type == MonthNameShort));
+    case DateToStringShort:
+    case DateToStringLong:
+        return winDateToString(in.toDate(), type == DateToStringShort ? DATE_SHORTDATE : DATE_LONGDATE);
+    case TimeToStringShort:
+    case TimeToStringLong:
+        return winTimeToString(in.toTime());
+    case DateTimeToStringShort:
+    case DateTimeToStringLong: {
+        const QDateTime dt = in.toDateTime();
+        return QString(winDateToString(dt.date(), type == DateTimeToStringShort ? DATE_SHORTDATE : DATE_LONGDATE)
+            + QLatin1Char(' ') + winTimeToString(dt.time())); }
+
+    case ZeroDigit:
+        locale_info = LOCALE_SNATIVEDIGITS;
+        break;
+
+    case LanguageId:
+    case CountryId: {
+        QString locale = QString::fromLatin1(getWinLocaleName());
+        QLocale::Language lang;
+        QLocale::Country cntry;
+        getLangAndCountry(locale, lang, cntry);
+        if (type == LanguageId)
+            return lang;
+        if (cntry == QLocale::AnyCountry)
+            return fallbackLocale().country();
+        return cntry;
+    }
+
+    case MeasurementSystem:
+        return QVariant(static_cast<int>(winSystemMeasurementSystem()));
+
+    case AMText:
+        return QVariant(winSystemAMText());
+    case PMText:
+        return QVariant(winSystemPMText());
+    case FirstDayOfWeek:
+        return QVariant(winSystemFirstDayOfWeek());
+    case CurrencySymbol:
+        return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+    case FormatCurrency:
+        return QVariant(winFormatCurrency(in));
+    case UILanguages:
+        return QVariant(winUILanguages());
+    default:
+        break;
+    }
+    if (locale_info) {
+        QString result = getWinLocaleInfo(locale_info);
+        if (format_string)
+            result = winToQtFormat(result);
+        if (!result.isEmpty())
+            return result;
+    }
+    return QVariant();
+}
+#endif // QT_NO_SYSTEMLOCALE
+
+struct WindowsToISOListElt {
+    ushort windows_code;
+    char iso_name[6];
+};
+
+/* NOTE: This array should be sorted by the first column! */
+static const WindowsToISOListElt windows_to_iso_list[] = {
+    { 0x0401, "ar_SA" },
+    { 0x0402, "bg\0  " },
+    { 0x0403, "ca\0  " },
+    { 0x0404, "zh_TW" },
+    { 0x0405, "cs\0  " },
+    { 0x0406, "da\0  " },
+    { 0x0407, "de\0  " },
+    { 0x0408, "el\0  " },
+    { 0x0409, "en_US" },
+    { 0x040a, "es\0  " },
+    { 0x040b, "fi\0  " },
+    { 0x040c, "fr\0  " },
+    { 0x040d, "he\0  " },
+    { 0x040e, "hu\0  " },
+    { 0x040f, "is\0  " },
+    { 0x0410, "it\0  " },
+    { 0x0411, "ja\0  " },
+    { 0x0412, "ko\0  " },
+    { 0x0413, "nl\0  " },
+    { 0x0414, "no\0  " },
+    { 0x0415, "pl\0  " },
+    { 0x0416, "pt_BR" },
+    { 0x0418, "ro\0  " },
+    { 0x0419, "ru\0  " },
+    { 0x041a, "hr\0  " },
+    { 0x041c, "sq\0  " },
+    { 0x041d, "sv\0  " },
+    { 0x041e, "th\0  " },
+    { 0x041f, "tr\0  " },
+    { 0x0420, "ur\0  " },
+    { 0x0421, "in\0  " },
+    { 0x0422, "uk\0  " },
+    { 0x0423, "be\0  " },
+    { 0x0425, "et\0  " },
+    { 0x0426, "lv\0  " },
+    { 0x0427, "lt\0  " },
+    { 0x0429, "fa\0  " },
+    { 0x042a, "vi\0  " },
+    { 0x042d, "eu\0  " },
+    { 0x042f, "mk\0  " },
+    { 0x0436, "af\0  " },
+    { 0x0438, "fo\0  " },
+    { 0x0439, "hi\0  " },
+    { 0x043e, "ms\0  " },
+    { 0x0458, "mt\0  " },
+    { 0x0801, "ar_IQ" },
+    { 0x0804, "zh_CN" },
+    { 0x0807, "de_CH" },
+    { 0x0809, "en_GB" },
+    { 0x080a, "es_MX" },
+    { 0x080c, "fr_BE" },
+    { 0x0810, "it_CH" },
+    { 0x0812, "ko\0  " },
+    { 0x0813, "nl_BE" },
+    { 0x0814, "no\0  " },
+    { 0x0816, "pt\0  " },
+    { 0x081a, "sr\0  " },
+    { 0x081d, "sv_FI" },
+    { 0x0c01, "ar_EG" },
+    { 0x0c04, "zh_HK" },
+    { 0x0c07, "de_AT" },
+    { 0x0c09, "en_AU" },
+    { 0x0c0a, "es\0  " },
+    { 0x0c0c, "fr_CA" },
+    { 0x0c1a, "sr\0  " },
+    { 0x1001, "ar_LY" },
+    { 0x1004, "zh_SG" },
+    { 0x1007, "de_LU" },
+    { 0x1009, "en_CA" },
+    { 0x100a, "es_GT" },
+    { 0x100c, "fr_CH" },
+    { 0x1401, "ar_DZ" },
+    { 0x1407, "de_LI" },
+    { 0x1409, "en_NZ" },
+    { 0x140a, "es_CR" },
+    { 0x140c, "fr_LU" },
+    { 0x1801, "ar_MA" },
+    { 0x1809, "en_IE" },
+    { 0x180a, "es_PA" },
+    { 0x1c01, "ar_TN" },
+    { 0x1c09, "en_ZA" },
+    { 0x1c0a, "es_DO" },
+    { 0x2001, "ar_OM" },
+    { 0x2009, "en_JM" },
+    { 0x200a, "es_VE" },
+    { 0x2401, "ar_YE" },
+    { 0x2409, "en\0  " },
+    { 0x240a, "es_CO" },
+    { 0x2801, "ar_SY" },
+    { 0x2809, "en_BZ" },
+    { 0x280a, "es_PE" },
+    { 0x2c01, "ar_JO" },
+    { 0x2c09, "en_TT" },
+    { 0x2c0a, "es_AR" },
+    { 0x3001, "ar_LB" },
+    { 0x300a, "es_EC" },
+    { 0x3401, "ar_KW" },
+    { 0x340a, "es_CL" },
+    { 0x3801, "ar_AE" },
+    { 0x380a, "es_UY" },
+    { 0x3c01, "ar_BH" },
+    { 0x3c0a, "es_PY" },
+    { 0x4001, "ar_QA" },
+    { 0x400a, "es_BO" },
+    { 0x440a, "es_SV" },
+    { 0x480a, "es_HN" },
+    { 0x4c0a, "es_NI" },
+    { 0x500a, "es_PR" }
+};
+
+static const int windows_to_iso_count
+    = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt);
+
+static const char *winLangCodeToIsoName(int code)
+{
+    int cmp = code - windows_to_iso_list[0].windows_code;
+    if (cmp < 0)
+        return 0;
+
+    if (cmp == 0)
+        return windows_to_iso_list[0].iso_name;
+
+    int begin = 0;
+    int end = windows_to_iso_count;
+
+    while (end - begin > 1) {
+        uint mid = (begin + end)/2;
+
+        const WindowsToISOListElt *elt = windows_to_iso_list + mid;
+        int cmp = code - elt->windows_code;
+        if (cmp < 0)
+            end = mid;
+        else if (cmp > 0)
+            begin = mid;
+        else
+            return elt->iso_name;
+    }
+
+    return 0;
+
+}
+
+static QString winIso639LangName(LCID id)
+{
+    QString result;
+
+    // Windows returns the wrong ISO639 for some languages, we need to detect them here using
+    // the language code
+    QString lang_code;
+    wchar_t out[256];
+    if (GetLocaleInfo(id, LOCALE_ILANGUAGE, out, 255))
+        lang_code = QString::fromWCharArray(out);
+
+    if (!lang_code.isEmpty()) {
+        const char *endptr;
+        bool ok;
+        QByteArray latin1_lang_code = lang_code.toLatin1();
+        int i = qstrtoull(latin1_lang_code, &endptr, 16, &ok);
+        if (ok && *endptr == '\0') {
+            switch (i) {
+                case 0x814:
+                    result = QLatin1String("nn"); // Nynorsk
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    if (!result.isEmpty())
+        return result;
+
+    // not one of the problematic languages - do the usual lookup
+    if (GetLocaleInfo(id, LOCALE_SISO639LANGNAME , out, 255))
+        result = QString::fromWCharArray(out);
+
+    return result;
+}
+
+static QString winIso3116CtryName(LCID id)
+{
+    QString result;
+
+    wchar_t out[256];
+    if (GetLocaleInfo(id, LOCALE_SISO3166CTRYNAME, out, 255))
+        result = QString::fromWCharArray(out);
+
+    return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 9d564a1..586a917 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -19,6 +19,7 @@ HEADERS +=  \
         tools/qlist.h \
         tools/qlocale.h \
         tools/qlocale_p.h \
+        tools/qlocale_tools_p.h \
         tools/qlocale_data_p.h \
         tools/qmap.h \
         tools/qmargins.h \
@@ -64,6 +65,7 @@ SOURCES += \
         tools/qlinkedlist.cpp \
         tools/qlist.cpp \
         tools/qlocale.cpp \
+        tools/qlocale_tools.cpp \
         tools/qpoint.cpp \
         tools/qmap.cpp \
         tools/qmargins.cpp \
@@ -82,12 +84,13 @@ SOURCES += \
         tools/qvector.cpp \
         tools/qvsnprintf.cpp
 
-symbian:SOURCES+=tools/qlocale_symbian.cpp
-
-!nacl:mac:SOURCES += tools/qelapsedtimer_mac.cpp
-else:symbian:SOURCES += tools/qelapsedtimer_symbian.cpp
-else:unix:SOURCES += tools/qelapsedtimer_unix.cpp
-else:win32:SOURCES += tools/qelapsedtimer_win.cpp
+!nacl:mac: {
+    SOURCES += tools/qelapsedtimer_mac.cpp
+    OBJECTIVE_SOURCES += tools/qlocale_mac.mm
+}
+else:symbian:SOURCES += tools/qelapsedtimer_symbian.cpp tools/qlocale_symbian.cpp
+else:unix:SOURCES += tools/qelapsedtimer_unix.cpp tools/qlocale_unix.cpp
+else:win32:SOURCES += tools/qelapsedtimer_win.cpp tools/qlocale_win.cpp
 else:SOURCES += tools/qelapsedtimer_generic.cpp
 
 contains(QT_CONFIG, zlib):include($$PWD/../../3rdparty/zlib.pri)
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index 9e5845c..50ae2cf 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -77,6 +77,7 @@ SOURCES += \
            ../../corelib/tools/qhash.cpp \
            ../../corelib/tools/qlist.cpp \
            ../../corelib/tools/qlocale.cpp \
+           ../../corelib/tools/qlocale_tools.cpp \
            ../../corelib/tools/qmap.cpp \
            ../../corelib/tools/qregexp.cpp \
            ../../corelib/tools/qstring.cpp \
@@ -97,6 +98,11 @@ win32:SOURCES += ../../corelib/io/qfilesystemengine_win.cpp \
                  ../../corelib/io/qfsfileengine_win.cpp \
                  ../../corelib/plugin/qsystemlibrary.cpp \
 
+mac: OBJECTIVE_SOURCES += ../../corelib/tools/qlocale_mac.mm
+else:symbian:SOURCES += ../../corelib/tools/qlocale_symbian.cpp
+else:unix:SOURCES += ../../corelib/tools/qlocale_unix.cpp
+else:win32:SOURCES += ../../corelib/tools/qlocale_win.cpp
+
 macx: {
    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4 #enables weak linking for 10.4 (exported)
    SOURCES += ../../corelib/io/qfilesystemengine_mac.cpp
-- 
cgit v0.12


From 2cbeb6c08cb7c79d6126f75c2cbc470679d671e1 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 24 Feb 2011 14:30:16 +0100
Subject: QLocale improvements on unix/linux.

There is no reason to re-read environment variables all the time.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp      | 38 ++++++---------
 src/corelib/tools/qlocale_unix.cpp | 94 +++++++++++++-------------------------
 tests/auto/qlocale/tst_qlocale.cpp |  3 ++
 3 files changed, 50 insertions(+), 85 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index c8291d7..7361b2a 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -94,17 +94,6 @@ QT_BEGIN_INCLUDE_NAMESPACE
 #include "qlocale_data_p.h"
 QT_END_INCLUDE_NAMESPACE
 
-QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
-{
-    for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
-        if (ImperialMeasurementSystems[i].languageId == m_language_id
-            && ImperialMeasurementSystems[i].countryId == m_country_id) {
-            return QLocale::ImperialSystem;
-        }
-    }
-    return QLocale::MetricSystem;
-}
-
 // Assumes that code is a
 // QChar code[3];
 // If the code is two-digit the third digit must be 0
@@ -1826,6 +1815,17 @@ Qt::DayOfWeek QLocale::firstDayOfWeek() const
     return static_cast<Qt::DayOfWeek>(d()->m_first_day_of_week);
 }
 
+QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
+{
+    for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
+        if (ImperialMeasurementSystems[i].languageId == m_language_id
+            && ImperialMeasurementSystems[i].countryId == m_country_id) {
+            return QLocale::ImperialSystem;
+        }
+    }
+    return QLocale::MetricSystem;
+}
+
 /*!
     \since 4.4
 
@@ -1833,25 +1833,15 @@ Qt::DayOfWeek QLocale::firstDayOfWeek() const
 */
 QLocale::MeasurementSystem QLocale::measurementSystem() const
 {
-    MeasurementSystem meas = MetricSystem;
-    bool found = false;
-
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
         QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
-        if (!res.isNull()) {
-            meas = MeasurementSystem(res.toInt());
-            found = true;
-        }
+        if (!res.isNull())
+            return MeasurementSystem(res.toInt());
     }
 #endif
 
-    if (!found) {
-        meas = d()->measurementSystem();
-        found = true;
-    }
-
-    return meas;
+    return d()->measurementSystem();
 }
 
 /*!
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 7d43726..b3bda3a 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -41,6 +41,7 @@
 
 #include "qlocale_p.h"
 
+#include "qstringbuilder.h"
 #include "qdatetime.h"
 #include "qstringlist.h"
 #include "qvariant.h"
@@ -60,71 +61,47 @@ struct QSystemLocaleData
         QByteArray numeric  = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
         QByteArray time     = all.isEmpty() ? qgetenv("LC_TIME") : all;
         QByteArray monetary = all.isEmpty() ? qgetenv("LC_MONETARY") : all;
-        QByteArray messages = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
+        lc_messages_var     = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
+        lc_measurement_var  = all.isEmpty() ? qgetenv("LC_MEASUREMENT") : all;
         QByteArray lang = qgetenv("LANG");
+        if (lang.isEmpty())
+            lang = QByteArray("C");
         if (numeric.isEmpty())
             numeric = lang;
         if (monetary.isEmpty())
             monetary = lang;
-        if (messages.isEmpty())
-            messages = lang;
-        lc_numeric = QLocale(QString::fromAscii(numeric));
-        lc_time = QLocale(QString::fromAscii(time));
-        lc_monetary = QLocale(QString::fromAscii(monetary));
-        lc_messages = QLocale(QString::fromAscii(messages));
+        if (lc_messages_var.isEmpty())
+            lc_messages_var = lang;
+        if (lc_measurement_var.isEmpty())
+            lc_measurement_var = lang;
+        lc_numeric = QLocale(QString::fromLatin1(numeric));
+        lc_time = QLocale(QString::fromLatin1(time));
+        lc_monetary = QLocale(QString::fromLatin1(monetary));
+        lc_messages = QLocale(QString::fromLatin1(lc_messages_var));
     }
 
     QLocale lc_numeric;
     QLocale lc_time;
     QLocale lc_monetary;
     QLocale lc_messages;
+    QByteArray lc_messages_var;
+    QByteArray lc_measurement_var;
 };
 Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
 #endif
 
-
-static uint unixGetSystemMeasurementSystem()
-{
-    QString meas_locale = QString::fromLocal8Bit(qgetenv("LC_ALL"));
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit(qgetenv("LC_MEASUREMENT"));
-    }
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit(qgetenv("LANG"));
-    }
-    if (meas_locale.isEmpty()) {
-        meas_locale = QString::fromLocal8Bit("C");
-    }
-
-    if (meas_locale.compare(QString::fromLocal8Bit("Metric"), Qt::CaseInsensitive) == 0)
-        return 0;
-    if (meas_locale.compare(QString::fromLocal8Bit("Other"), Qt::CaseInsensitive) == 0)
-        return 0;
-
-    const QLocalePrivate* locale = findLocale(meas_locale);
-    return locale->measurementSystem();
-}
-
-static QByteArray envVarLocale()
-{
-    static QByteArray lang = 0;
-#ifdef Q_OS_UNIX
-    lang = qgetenv("LC_ALL");
-    if (lang.isNull())
-        lang = qgetenv("LC_NUMERIC");
-    if (lang.isNull())
-#endif
-        lang = qgetenv("LANG");
-    return lang;
-}
-
 #ifndef QT_NO_SYSTEMLOCALE
 /*!
     \internal
 */
 QLocale QSystemLocale::fallbackLocale() const
 {
-    return QLocale(QLatin1String(envVarLocale()));
+    QByteArray lang = qgetenv("LC_ALL");
+    if (lang.isNull())
+        lang = qgetenv("LC_NUMERIC");
+    if (lang.isNull())
+        lang = qgetenv("LANG");
+    return QLocale(QLatin1String(lang));
 }
 
 /*!
@@ -205,10 +182,16 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
         }
         return QString();
     }
-    case MeasurementSystem:
-        return QVariant(unixGetSystemMeasurementSystem());
+    case MeasurementSystem: {
+        const QString meas_locale = QString::fromLatin1(d->lc_measurement_var.constData(), d->lc_measurement_var.size());
+        if (meas_locale.compare(QLatin1String("Metric"), Qt::CaseInsensitive) == 0)
+            return QLocale::MetricSystem;
+        if (meas_locale.compare(QLatin1String("Other"), Qt::CaseInsensitive) == 0)
+            return QLocale::MetricSystem;
+        return QVariant((int)QLocale(meas_locale).measurementSystem());
+    }
     case UILanguages: {
-        QString languages = QString::fromLocal8Bit(qgetenv("LANGUAGE"));
+        static QString languages = QString::fromLatin1(qgetenv("LANGUAGE"));
         if (!languages.isEmpty()) {
             QStringList lst = languages.split(QLatin1Char(':'));
             for (int i = 0; i < lst.size();) {
@@ -222,17 +205,12 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
             }
             return lst;
         }
-        QString name = QString::fromLocal8Bit(qgetenv("LC_ALL"));
-        if (name.isEmpty()) {
-            name = QString::fromLocal8Bit(qgetenv("LC_MESSAGES"));
-            if (name.isEmpty())
-                name = QString::fromLocal8Bit(qgetenv("LANG"));
-        }
-        if (!name.isEmpty()) {
+        if (!d->lc_messages_var.isEmpty()) {
             QChar lang[3];
             QChar cntry[3];
             int lang_len, cntry_len;
-            if (splitLocaleName(name, lang, cntry, &lang_len, &cntry_len))
+            if (splitLocaleName(QString::fromLatin1(d->lc_messages_var.constData(), d->lc_messages_var.size()),
+                                lang, cntry, &lang_len, &cntry_len))
                 return QStringList(QString::fromRawData(lang, lang_len) % QLatin1Char('-') % QString::fromRawData(cntry, cntry_len));
         }
         return QVariant();
@@ -247,10 +225,4 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
 }
 #endif // QT_NO_SYSTEMLOCALE
 
-QString timeZone()
-{
-    tzset();
-    return QString::fromLocal8Bit(tzname[1]);
-}
-
 QT_END_NAMESPACE
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 878a31e..afcc69f 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -1781,6 +1781,7 @@ void tst_QLocale::measurementSystems_data()
 
 void tst_QLocale::measurementSystems()
 {
+    QSKIP("Meh, skip the test as we do not reread the environment variables anymore", SkipAll);
     QFETCH(QString, localeName);
     QFETCH(int, mSystem);
 
@@ -1842,6 +1843,7 @@ void tst_QLocale::systemMeasurementSystems_data()
 
 void tst_QLocale::systemMeasurementSystems()
 {
+    QSKIP("Meh, skip the test as we do not reread the environment variables anymore", SkipAll);
     // Theoretically, we could include HPUX in this test, but its setenv implementation
     // stinks. It's called putenv, and it requires you to keep the variable you pass
     // to it around forever.
@@ -1964,6 +1966,7 @@ void tst_QLocale::queryMeasureSystem_data()
 
 void tst_QLocale::queryMeasureSystem()
 {
+    QSKIP("Meh, skip the test as we do not reread the environment variables anymore", SkipAll);
     // Theoretically, we could include HPUX in this test, but its setenv implementation
     // stinks. It's called putenv, and it requires you to keep the variable you pass
     // to it around forever.
-- 
cgit v0.12


From 172e9cda6a8e2a0fa853f3c76bc8345a55e496d8 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 11:35:39 +0100
Subject: QLocale: Compile fix for mac.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_mac.mm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index cdbf93d..5210a6e 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -339,6 +339,7 @@ static QString macFormatCurrency(const QVariant &in)
     return QCFString::toQString(result);
 }
 
+#ifndef QT_NO_SYSTEMLOCALE
 static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant &in)
 {
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@@ -365,6 +366,7 @@ static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant
 #endif
     return QVariant();
 }
+#endif //QT_NO_SYSTEMLOCALE
 
 static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
 {
-- 
cgit v0.12


From c4b61c27ad0e0af16f0bbf91e965646c82394584 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 11:53:05 +0100
Subject: Implemented retrieving AM/PM text on Mac.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_mac.mm | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 5210a6e..0126a28 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -449,8 +449,13 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(static_cast<int>(macMeasurementSystem()));
 
     case AMText:
-    case PMText:
-        break;
+    case PMText: {
+        QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
+        QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(NULL, locale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle);
+        QCFType<CFStringRef> value = static_cast<CFStringRef>(CFDateFormatterCopyProperty(formatter,
+            (type == AMText ? kCFDateFormatterAMSymbol : kCFDateFormatterPMSymbol)));
+        return QCFString::toQString(value);
+    }
     case FirstDayOfWeek:
         return QVariant(macFirstDayOfWeek());
     case CurrencySymbol:
-- 
cgit v0.12


From 4b09e9cbfce4df05f187e6f399738219d3f2853e Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 13:39:14 +0100
Subject: Improved QLocale api

Renames FormatCurrency enum value to CurrencyToString to match other enums.

Task-number: related to QTBUG-17100
Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp      | 6 +++---
 src/corelib/tools/qlocale.h        | 2 +-
 src/corelib/tools/qlocale.qdoc     | 2 +-
 src/corelib/tools/qlocale_mac.mm   | 2 +-
 src/corelib/tools/qlocale_unix.cpp | 2 +-
 src/corelib/tools/qlocale_win.cpp  | 2 +-
 6 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index bd23a22..e10ca8a 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2881,7 +2881,7 @@ QString QLocale::toCurrencyString(qlonglong value) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
         if (!res.isNull())
             return res.toString();
     }
@@ -2910,7 +2910,7 @@ QString QLocale::toCurrencyString(qulonglong value) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
         if (!res.isNull())
             return res.toString();
     }
@@ -2930,7 +2930,7 @@ QString QLocale::toCurrencyString(double value) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::FormatCurrency, value);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
         if (!res.isNull())
             return res.toString();
     }
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 40c7d7e..a733732 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -99,7 +99,7 @@ public:
         WeekendStart, // Qt::DayOfWeek
         WeekendEnd, // Qt::DayOfWeek
         CurrencySymbol, // QString in: format
-        FormatCurrency, // QString in: qlonglong, qulonglong or double
+        CurrencyToString, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
         QuotationBegin, // QString in: StandardQuotation or AlternateQuotation
         QuotationEnd // QString in: StandardQuotation or AlternateQuotation
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 8c036c3..5154324 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -708,7 +708,7 @@
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
   \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
-  \value FormatCurrency a localized string representation of a number with a currency symbol.
+  \value CurrencyToString a localized string representation of a number with a currency symbol.
   \value UILanguages a list of strings representing locale names that could be used for UI translation.
   \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
   \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 0126a28..b8420e0 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -460,7 +460,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(macFirstDayOfWeek());
     case CurrencySymbol:
         return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
-    case FormatCurrency:
+    case CurrencyToString:
         return macFormatCurrency(in);
     case UILanguages: {
         QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index b3bda3a..6faaf19 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -165,7 +165,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
         return lc_time.firstDayOfWeek();
     case CurrencySymbol:
         return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
-    case FormatCurrency: {
+    case CurrencyToString: {
         switch (in.type()) {
         case QVariant::Int:
             return lc_monetary.toCurrencyString(in.toInt());
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 3605e44..cf84094 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -539,7 +539,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return QVariant(winSystemFirstDayOfWeek());
     case CurrencySymbol:
         return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
-    case FormatCurrency:
+    case CurrencyToString:
         return QVariant(winFormatCurrency(in));
     case UILanguages:
         return QVariant(winUILanguages());
-- 
cgit v0.12


From 08868df5e94a5b89d9f8ce904e97b43a48313fc1 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Fri, 25 Feb 2011 15:42:51 +0100
Subject: fixed QLocale::quoteString() to allow for QSystemLocale
 implementation

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17096
---
 src/corelib/tools/qlocale.cpp      | 15 +++++++++------
 src/corelib/tools/qlocale.h        |  4 ++--
 src/corelib/tools/qlocale.qdoc     |  4 ++--
 src/corelib/tools/qlocale_mac.mm   | 29 +++++++++++++----------------
 src/corelib/tools/qlocale_p.h      |  3 +++
 src/corelib/tools/qlocale_unix.cpp |  8 +++++---
 6 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index e10ca8a..5027d00 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -651,7 +651,6 @@ QLocale::NumberOptions QLocale::numberOptions() const
 */
 QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
 {
-
     return quoteString(&str, qs);
 }
 
@@ -664,14 +663,18 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant quotationBegin = systemLocale()->query(QSystemLocale::QuotationBegin, QVariant(qs));
-        QVariant quotationEnd = systemLocale()->query(QSystemLocale::QuotationEnd, QVariant(qs));
-        if (!quotationBegin.isNull() && !quotationEnd.isNull())
-            return quotationBegin.toString() % str % quotationEnd.toString();
+        QVariant res;
+        if (qs == QLocale::StandardQuotation)
+            res = systemLocale()->query(QSystemLocale::StringToStandardQuotation, QVariant::fromValue(str));
+        else
+            res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation, QVariant::fromValue(str));
+
+        if (!res.isNull())
+            return res.toString();
     }
 #endif
 
-    if (qs == StandardQuotation)
+    if (qs == QLocale::StandardQuotation)
         return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
     else
         return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index a733732..7900c57 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -101,8 +101,8 @@ public:
         CurrencySymbol, // QString in: format
         CurrencyToString, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
-        QuotationBegin, // QString in: StandardQuotation or AlternateQuotation
-        QuotationEnd // QString in: StandardQuotation or AlternateQuotation
+        StringToStandardQuotation, // QString in: QStringRef to quote
+        StringToAlternateQuotation // QString in: QStringRef to quote
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 5154324..20f546d 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -710,8 +710,8 @@
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
   \value CurrencyToString a localized string representation of a number with a currency symbol.
   \value UILanguages a list of strings representing locale names that could be used for UI translation.
-  \value QuotationBegin a QString specifying the start of a quotation. the in variant contains a QLocale::QuotationStyle
-  \value QuotationEnd a QString specifying the end of a quotation. the in variant contains a QLocale::QuotationStyle
+  \value StringToStandardQuotation a QString containing a quoted version of the string ref stored in the in variant using standard quotes.
+  \value StringToAlternateQuotation a QString containing a quoted version of the string ref stored in the in variant using alternate quotes.
   \value WeekendStart a Qt::DayOfWeek enum specifying the first day of the weekend
   \value WeekendEnd a Qt::DayOfWeek enum specifying the last day of the weekend
 */
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index b8420e0..6c4829b 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -340,26 +340,23 @@ static QString macFormatCurrency(const QVariant &in)
 }
 
 #ifndef QT_NO_SYSTEMLOCALE
-static QVariant macQuotationSymbol(QSystemLocale::QueryType type, const QVariant &in)
+static QVariant macQuoteString(QSystemLocale::QueryType type, const QStringRef &str)
 {
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
     if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6)
         return QVariant();
 
+    QString begin, end;
     QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
     switch (type) {
-    case  QSystemLocale::QuotationBegin:
-        if (in.toInt() == QLocale::StandardQuotation)
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
-        else
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
-        break;
-    case QSystemLocale::QuotationEnd:
-        if (in.toInt() == QLocale::StandardQuotation)
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
-        else
-            return QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
-        break;
+    case QSystemLocale::StringToStandardQuotation:
+        begin = QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
+        end = QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
+        return QString(begin % str % end);
+    case QSystemLocale::StringToAlternateQuotation:
+        begin = QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
+        end = QCFString::toQString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
+        return QString(begin % str % end);
      default:
         break;
     }
@@ -478,9 +475,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         }
         return QVariant(result);
     }
-    case QuotationBegin:
-    case QuotationEnd:
-        return macQuotationSymbol(type,in);
+    case StringToStandardQuotation:
+    case StringToAlternateQuotation:
+        return macQuoteString(type, in.value<QStringRef>());
     default:
         break;
     }
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 68c66c1..636cc1d 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -55,6 +55,7 @@
 
 #include "QtCore/qstring.h"
 #include "QtCore/qvarlengtharray.h"
+#include "QtCore/qmetatype.h"
 
 #include "qlocale.h"
 
@@ -64,6 +65,8 @@ class CEnvironmentChangeNotifier;
 
 QT_BEGIN_NAMESPACE
 
+Q_DECLARE_METATYPE(QStringRef)
+
 struct Q_CORE_EXPORT QLocalePrivate
 {
 public:
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 6faaf19..74c8c85 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -113,6 +113,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
     const QLocale &lc_numeric = d->lc_numeric;
     const QLocale &lc_time = d->lc_time;
     const QLocale &lc_monetary = d->lc_monetary;
+    const QLocale &lc_messages = d->lc_messages;
 
     switch (type) {
     case DecimalPoint:
@@ -215,9 +216,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
         }
         return QVariant();
     }
-    case QuotationBegin:
-    case QuotationEnd:
-        break; // TODO
+    case StringToStandardQuotation:
+        return lc_messages.quoteString(in.value<QStringRef>());
+    case StringToAlternateQuotation:
+        return lc_messages.quoteString(in.value<QStringRef>(), QLocale::AlternateQuotation);
     default:
         break;
     }
-- 
cgit v0.12


From a722a716641d596b9a799e776e81167a47a261fa Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Feb 2011 16:52:04 +0000
Subject: Fix for read on "connected" UDP sockets

Symbian API RecvOneOrMore only supports stream oriented sockets.
So for UDP we use RecvFrom instead and discard the source address.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index b9537c1..e3b4a09 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1049,10 +1049,16 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     TPtr8 buffer((TUint8*)data, (int)maxSize);
     TSockXfrLength received = 0;
     TRequestStatus status;
-    d->nativeSocket.RecvOneOrMore(buffer, 0, status, received);
+    TSockAddr dummy;
+    if (d->socketType == QAbstractSocket::UdpSocket) {
+        //RecvOneOrMore() can only be used with stream-interfaced connected sockets; datagram interface sockets will return KErrNotSupported.
+        d->nativeSocket.RecvFrom(buffer, dummy, 0, status);
+    } else {
+        d->nativeSocket.RecvOneOrMore(buffer, 0, status, received);
+    }
     User::WaitForRequest(status); //Non blocking receive
     TInt err = status.Int();
-    int r = received();
+    int r = buffer.Length();
 
     if (err == KErrWouldBlock) {
         // No data was available for reading
@@ -1064,9 +1070,9 @@ qint64 QSymbianSocketEngine::read(char *data, qint64 maxSize)
     }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEngine::read(%p \"%s\", %llu) == %i",
+    qDebug("QSymbianSocketEngine::read(%p \"%s\", %llu) == %i (err = %d)",
            data, qt_prettyDebug(data, qMin(r, ssize_t(16)), r).data(),
-           maxSize, r);
+           maxSize, r, err);
 #endif
 
     return qint64(r);
-- 
cgit v0.12


From 37b6d6ef16606c11ba46ef4cb7c96e0989e78d7e Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Feb 2011 17:24:50 +0000
Subject: Make socks5 socket engine push session down to real sockets

This ensures the specified QNetworkSession from the QNetworkAccessManager
is used to route the packets, when using a SOCKS proxy.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsocks5socketengine.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index ab3d260..91dfdf3 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -556,6 +556,7 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
         udpData = new QSocks5UdpAssociateData;
         data = udpData;
         udpData->udpSocket = new QUdpSocket(q);
+        udpData->udpSocket->setProperty("_q_networksession", q->property("_q_networksession"));
         udpData->udpSocket->setProxy(QNetworkProxy::NoProxy);
         QObject::connect(udpData->udpSocket, SIGNAL(readyRead()),
                          q, SLOT(_q_udpSocketReadNotification()),
@@ -567,6 +568,7 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
     }
 
     data->controlSocket = new QTcpSocket(q);
+    data->controlSocket->setProperty("_q_networksession", q->property("_q_networksession"));
     data->controlSocket->setProxy(QNetworkProxy::NoProxy);
     QObject::connect(data->controlSocket, SIGNAL(connected()), q, SLOT(_q_controlSocketConnected()),
                      Qt::DirectConnection);
@@ -1376,6 +1378,7 @@ bool QSocks5SocketEngine::bind(const QHostAddress &address, quint16 port)
         d->udpData->associatePort = d->localPort;
         d->localPort = 0;
         QUdpSocket dummy;
+        dummy.setProperty("_q_networksession", property("_q_networksession"));
         dummy.setProxy(QNetworkProxy::NoProxy);
         if (!dummy.bind()
             || writeDatagram(0,0, d->data->controlSocket->localAddress(), dummy.localPort()) != 0
-- 
cgit v0.12


From 0c2ec3cef9f0a91b08d5103ac0bafd173f2a20df Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 16:08:57 +0100
Subject: Improved currency value to string conversion in QLocale.

Added a second, optional, argument to QLocale::toCurrencyString() that
represents a currency symbol that is supposed to be added to the formatted
string.

Task-number: QTBUG-17100
Reviewed-by: Zeno Albisser
Reviewed-by: Olivier Goffart
---
 src/corelib/tools/qlocale.cpp      | 58 ++++++++++++++++++-------------
 src/corelib/tools/qlocale.h        | 50 ++++++++++++++++-----------
 src/corelib/tools/qlocale_mac.mm   | 16 +++++----
 src/corelib/tools/qlocale_win.cpp  | 70 ++++++++++++++++++++++++++++++++------
 tests/auto/qlocale/tst_qlocale.cpp |  6 ++++
 tests/manual/qlocale/currency.cpp  | 29 +++++++++++-----
 tests/manual/qlocale/currency.h    |  4 ++-
 7 files changed, 163 insertions(+), 70 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 5027d00..4925129 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2802,7 +2802,7 @@ qulonglong QLocalePrivate::bytearrayToUnsLongLong(const char *num, int base, boo
 /*!
     \since 4.8
 
-    \enum QLocale::CurrencyFormat
+    \enum QLocale::CurrencySymbolFormat
 
     Specifies the format of the currency symbol.
 
@@ -2847,30 +2847,30 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
 }
 
 /*!
-    \fn QString QLocale::toCurrencyString(short) const
+    \fn QString QLocale::toCurrencyString(short, const QString &) const
     \since 4.8
     \overload
 */
 
 /*!
-    \fn QString QLocale::toCurrencyString(ushort) const
+    \fn QString QLocale::toCurrencyString(ushort, const QString &) const
     \since 4.8
     \overload
 */
 
 /*!
-    \fn QString QLocale::toCurrencyString(int) const
+    \fn QString QLocale::toCurrencyString(int, const QString &) const
     \since 4.8
     \overload
 */
 
 /*!
-    \fn QString QLocale::toCurrencyString(uint) const
+    \fn QString QLocale::toCurrencyString(uint, const QString &) const
     \since 4.8
     \overload
 */
 /*!
-    \fn QString QLocale::toCurrencyString(float) const
+    \fn QString QLocale::toCurrencyString(float, const QString &) const
     \since 4.8
     \overload
 */
@@ -2879,12 +2879,16 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
     \since 4.8
 
     Returns a localized string representation of \a value as a currency.
+    If the \a symbol is provided it is used instead of the default currency symbol.
+
+    \sa currencySymbol
 */
-QString QLocale::toCurrencyString(qlonglong value) const
+QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
+        QSystemLocale::CurrencyToStringArgument arg(value, symbol);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
         if (!res.isNull())
             return res.toString();
     }
@@ -2898,22 +2902,23 @@ QString QLocale::toCurrencyString(qlonglong value) const
         value = -value;
     }
     QString str = d->longLongToString(value);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    if (sym.isEmpty())
+        sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
+    return format.arg(str, sym);
 }
 
 /*!
     \since 4.8
     \overload
 */
-QString QLocale::toCurrencyString(qulonglong value) const
+QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
+        QSystemLocale::CurrencyToStringArgument arg(value, symbol);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
         if (!res.isNull())
             return res.toString();
     }
@@ -2922,18 +2927,23 @@ QString QLocale::toCurrencyString(qulonglong value) const
     quint8 idx = d->m_currency_format_idx;
     quint8 size = d->m_currency_format_size;
     QString str = d->unsLongLongToString(value);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    if (sym.isEmpty())
+        sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
+    return format.arg(str, sym);
 }
 
-QString QLocale::toCurrencyString(double value) const
+/*!
+    \since 4.8
+    \overload
+*/
+QString QLocale::toCurrencyString(double value, const QString &symbol) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, value);
+        QSystemLocale::CurrencyToStringArgument arg(value, symbol);
+        QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
         if (!res.isNull())
             return res.toString();
     }
@@ -2948,11 +2958,11 @@ QString QLocale::toCurrencyString(double value) const
     }
     QString str = d->doubleToString(value, d->m_currency_digits,
                                     QLocalePrivate::DFDecimal);
-    QString symbol = currencySymbol();
-    if (symbol.isEmpty())
-        symbol = currencySymbol(QLocale::CurrencyIsoCode);
+    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    if (sym.isEmpty())
+        sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
-    return format.arg(str, symbol);
+    return format.arg(str, sym);
 }
 
 /*!
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 7900c57..a5d5a17 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -42,6 +42,7 @@
 #ifndef QLOCALE_H
 #define QLOCALE_H
 
+#include <QtCore/qvariant.h>
 #include <QtCore/qstring.h>
 #include <QtCore/qobjectdefs.h>
 
@@ -68,6 +69,15 @@ public:
     QSystemLocale();
     virtual ~QSystemLocale();
 
+    struct CurrencyToStringArgument
+    {
+        CurrencyToStringArgument() { }
+        CurrencyToStringArgument(const QVariant &v, const QString &s)
+            : value(v), symbol(s) { }
+        QVariant value;
+        QString symbol;
+    };
+
     enum QueryType {
         LanguageId, // uint
         CountryId, // uint
@@ -98,7 +108,7 @@ public:
         FirstDayOfWeek, // Qt::DayOfWeek
         WeekendStart, // Qt::DayOfWeek
         WeekendEnd, // Qt::DayOfWeek
-        CurrencySymbol, // QString in: format
+        CurrencySymbol, // QString in: CurrencyToStringArgument
         CurrencyToString, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
         StringToStandardQuotation, // QString in: QStringRef to quote
@@ -690,14 +700,14 @@ public:
     Qt::LayoutDirection textDirection() const;
 
     QString currencySymbol(CurrencySymbolFormat = CurrencySymbol) const;
-    QString toCurrencyString(qlonglong) const;
-    QString toCurrencyString(qulonglong) const;
-    inline QString toCurrencyString(short) const;
-    inline QString toCurrencyString(ushort) const;
-    inline QString toCurrencyString(int) const;
-    inline QString toCurrencyString(uint) const;
-    QString toCurrencyString(double) const;
-    inline QString toCurrencyString(float) const;
+    QString toCurrencyString(qlonglong, const QString &symbol = QString()) const;
+    QString toCurrencyString(qulonglong, const QString &symbol = QString()) const;
+    inline QString toCurrencyString(short, const QString &symbol = QString()) const;
+    inline QString toCurrencyString(ushort, const QString &symbol = QString()) const;
+    inline QString toCurrencyString(int, const QString &symbol = QString()) const;
+    inline QString toCurrencyString(uint, const QString &symbol = QString()) const;
+    QString toCurrencyString(double, const QString &symbol = QString()) const;
+    inline QString toCurrencyString(float, const QString &symbol = QString()) const;
 
     QStringList uiLanguages() const;
 
@@ -753,16 +763,16 @@ inline bool QLocale::operator==(const QLocale &other) const
 inline bool QLocale::operator!=(const QLocale &other) const
     { return d() != other.d() || numberOptions() != other.numberOptions(); }
 
-inline QString QLocale::toCurrencyString(short i) const
-    { return toCurrencyString(qlonglong(i)); }
-inline QString QLocale::toCurrencyString(ushort i) const
-    { return toCurrencyString(qulonglong(i)); }
-inline QString QLocale::toCurrencyString(int i) const
-{ return toCurrencyString(qlonglong(i)); }
-inline QString QLocale::toCurrencyString(uint i) const
-{ return toCurrencyString(qulonglong(i)); }
-inline QString QLocale::toCurrencyString(float i) const
-{ return toCurrencyString(double(i)); }
+inline QString QLocale::toCurrencyString(short i, const QString &symbol) const
+    { return toCurrencyString(qlonglong(i), symbol); }
+inline QString QLocale::toCurrencyString(ushort i, const QString &symbol) const
+    { return toCurrencyString(qulonglong(i), symbol); }
+inline QString QLocale::toCurrencyString(int i, const QString &symbol) const
+{ return toCurrencyString(qlonglong(i), symbol); }
+inline QString QLocale::toCurrencyString(uint i, const QString &symbol) const
+{ return toCurrencyString(qulonglong(i), symbol); }
+inline QString QLocale::toCurrencyString(float i, const QString &symbol) const
+{ return toCurrencyString(double(i), symbol); }
 
 #ifndef QT_NO_DATASTREAM
 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLocale &);
@@ -771,6 +781,8 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLocale &);
 
 QT_END_NAMESPACE
 
+Q_DECLARE_METATYPE(QSystemLocale::CurrencyToStringArgument)
+
 QT_END_HEADER
 
 #endif // QLOCALE_H
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 6c4829b..68bb7c5 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -307,24 +307,24 @@ static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
     return QString();
 }
 
-static QString macFormatCurrency(const QVariant &in)
+static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
 {
     QCFType<CFNumberRef> value;
-    switch (in.type()) {
+    switch (arg.value.type()) {
     case QVariant::Int:
     case QVariant::UInt: {
-        int v = in.toInt();
+        int v = arg.value.toInt();
         value = CFNumberCreate(NULL, kCFNumberIntType, &v);
         break;
     }
     case QVariant::Double: {
-        double v = in.toInt();
+        double v = arg.value.toInt();
         value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
         break;
     }
     case QVariant::LongLong:
     case QVariant::ULongLong: {
-        qint64 v = in.toLongLong();
+        qint64 v = arg.value.toLongLong();
         value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
         break;
     }
@@ -335,6 +335,10 @@ static QString macFormatCurrency(const QVariant &in)
     QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
     QCFType<CFNumberFormatterRef> currencyFormatter =
             CFNumberFormatterCreate(NULL, locale, kCFNumberFormatterCurrencyStyle);
+    if (!arg.symbol.isEmpty()) {
+        CFNumberFormatterSetProperty(currencyFormatter, kCFNumberFormatterCurrencySymbol,
+                                     QCFString::toCFStringRef(arg.symbol));
+    }
     QCFType<CFStringRef> result = CFNumberFormatterCreateStringWithNumber(NULL, currencyFormatter, value);
     return QCFString::toQString(result);
 }
@@ -458,7 +462,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case CurrencySymbol:
         return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
     case CurrencyToString:
-        return macFormatCurrency(in);
+        return macFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>());
     case UILanguages: {
         QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
                  CFSTR("AppleLanguages"),
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index cf84094..cb191f2 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -48,6 +48,8 @@
 
 #include "private/qsystemlibrary_p.h"
 
+#include "qdebug.h"
+
 #if defined(Q_WS_WIN)
 #   include "qt_windows.h"
 #   include <time.h>
@@ -63,6 +65,21 @@ static const char *winLangCodeToIsoName(int code);
 static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
 static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
 
+static QString qt_getLocaleInfo(LCID lcid, LCTYPE type, int maxlen = 0)
+{
+    QVarLengthArray<wchar_t, 64> buf(maxlen ? maxlen : 64);
+    if (!GetLocaleInfo(lcid, type, buf.data(), buf.size()))
+        return QString();
+    return QString::fromWCharArray(buf.data());
+}
+static int qt_getLocaleInfo_int(LCID lcid, LCTYPE type, int maxlen = 0)
+{
+    QString str = qt_getLocaleInfo(lcid, type, maxlen);
+    bool ok = false;
+    int v = str.toInt(&ok);
+    return ok ? v : 0;
+}
+
 static QString getWinLocaleInfo(LCTYPE type)
 {
     LCID id = GetUserDefaultLCID();
@@ -355,30 +372,30 @@ QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
     return QString();
 }
 
-static QString winFormatCurrency(const QVariant &in)
+static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
 {
     QString value;
-    switch (in.type()) {
+    switch (arg.value.type()) {
     case QVariant::Int:
         value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
-                                                 in.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+                                                 arg.value.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
         break;
     case QVariant::UInt:
         value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
-                                                    in.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+                                                    arg.value.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
         break;
     case QVariant::Double:
         value = QLocalePrivate::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
                                                QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
-                                               in.toDouble(), -1, QLocalePrivate::DFDecimal, -1, QLocale::OmitGroupSeparator);
+                                               arg.value.toDouble(), -1, QLocalePrivate::DFDecimal, -1, QLocale::OmitGroupSeparator);
         break;
     case QVariant::LongLong:
         value = QLocalePrivate::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
-                                                 in.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+                                                 arg.value.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
         break;
     case QVariant::ULongLong:
         value = QLocalePrivate::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
-                                                    in.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+                                                    arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
         break;
     default:
         return QString();
@@ -386,14 +403,45 @@ static QString winFormatCurrency(const QVariant &in)
 
     QVarLengthArray<wchar_t, 64> out(64);
     LCID lcid = GetUserDefaultLCID();
+
+    QString decimalSep;
+    QString thousandSep;
+    CURRENCYFMT format;
+    CURRENCYFMT *pformat = NULL;
+    if (!arg.symbol.isEmpty()) {
+        format.NumDigits = qt_getLocaleInfo_int(lcid, LOCALE_ICURRDIGITS);
+        format.LeadingZero = qt_getLocaleInfo_int(lcid, LOCALE_ILZERO);
+        decimalSep = qt_getLocaleInfo(lcid, LOCALE_SMONDECIMALSEP);
+        format.lpDecimalSep = (wchar_t *)decimalSep.utf16();
+        thousandSep = qt_getLocaleInfo(lcid, LOCALE_SMONTHOUSANDSEP);
+        format.lpThousandSep = (wchar_t *)thousandSep.utf16();
+        format.NegativeOrder = qt_getLocaleInfo_int(lcid, LOCALE_INEGCURR);
+        format.PositiveOrder = qt_getLocaleInfo_int(lcid, LOCALE_ICURRENCY);
+        format.lpCurrencySymbol = (wchar_t *)arg.symbol.utf16();
+
+        // grouping is complicated and ugly:
+        // int(0)  == "123456789.00"    == string("0")
+        // int(3)  == "123,456,789.00"  == string("3;0")
+        // int(30) == "123456,789.00"   == string("3;0;0")
+        // int(32) == "12,34,56,789.00" == string("3;2;0")
+        // int(320)== "1234,56,789.00"  == string("3;2")
+        QString groupingStr = qt_getLocaleInfo(lcid, LOCALE_SMONGROUPING);
+        format.Grouping = groupingStr.remove(QLatin1Char(';')).toInt();
+        if (format.Grouping % 10 == 0) // magic
+            format.Grouping /= 10;
+        else
+            format.Grouping *= 10;
+        pformat = &format;
+    }
+
     int ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                                  NULL, out.data(), out.size());
+                                  pformat, out.data(), out.size());
     if (ret == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
         ret = ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                                  NULL, out.data(), 0);
+                                  pformat, out.data(), 0);
         out.resize(ret);
         ::GetCurrencyFormat(lcid, 0, reinterpret_cast<const wchar_t *>(value.utf16()),
-                            NULL, out.data(), out.size());
+                            pformat, out.data(), out.size());
     }
 
     return QString::fromWCharArray(out.data());
@@ -540,7 +588,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case CurrencySymbol:
         return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
     case CurrencyToString:
-        return QVariant(winFormatCurrency(in));
+        return QVariant(winFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>()));
     case UILanguages:
         return QVariant(winUILanguages());
     default:
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index d1b7193..7a3e339 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -2159,9 +2159,15 @@ void tst_QLocale::currency()
 
     const QLocale de_DE("de_DE");
     QCOMPARE(de_DE.toCurrencyString(qulonglong(1234)), QString::fromUtf8("1234\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(qulonglong(1234), QLatin1String("BAZ")), QString::fromUtf8("1234\xc2\xa0" "BAZ"));
     QCOMPARE(de_DE.toCurrencyString(qlonglong(-1234)), QString::fromUtf8("-1234\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(qlonglong(-1234), QLatin1String("BAZ")), QString::fromUtf8("-1234\xc2\xa0" "BAZ"));
     QCOMPARE(de_DE.toCurrencyString(double(1234.56)), QString::fromUtf8("1234,56\xc2\xa0\xe2\x82\xac"));
     QCOMPARE(de_DE.toCurrencyString(double(-1234.56)), QString::fromUtf8("-1234,56\xc2\xa0\xe2\x82\xac"));
+    QCOMPARE(de_DE.toCurrencyString(double(-1234.56), QLatin1String("BAZ")), QString::fromUtf8("-1234,56\xc2\xa0" "BAZ"));
+
+    const QLocale system = QLocale::system();
+    QVERIFY(system.toCurrencyString(1, QLatin1String("FOO")).contains(QLatin1String("FOO")));
 }
 
 void tst_QLocale::quoteString()
diff --git a/tests/manual/qlocale/currency.cpp b/tests/manual/qlocale/currency.cpp
index c55df3d..4ef157c 100644
--- a/tests/manual/qlocale/currency.cpp
+++ b/tests/manual/qlocale/currency.cpp
@@ -52,37 +52,48 @@ CurrencyWidget::CurrencyWidget()
     currencyName = new QLineEdit;
     currencyFormattingLabel = new QLabel("Currency formatting:");
     currencyFormattingValue = new QLineEdit(QString::number(1234.56, 'f', 2));
+    currencyFormattingSymbolLabel = new QLabel("currency:");
+    currencyFormattingSymbol = new QLineEdit;
     currencyFormatting = new QLineEdit;
 
+    currencyFormattingValue->setFixedWidth(150);
+    currencyFormattingSymbol->setFixedWidth(50);
+
     l->addWidget(currencySymbolLabel, 0, 0);
-    l->addWidget(currencySymbol, 0, 1, 1, 2);
+    l->addWidget(currencySymbol, 0, 1, 1, 4);
     l->addWidget(currencyISOLabel, 1, 0);
-    l->addWidget(currencyISO, 1, 1, 1, 2);
+    l->addWidget(currencyISO, 1, 1, 1, 4);
     l->addWidget(currencyNameLabel, 2, 0);
-    l->addWidget(currencyName, 2, 1, 1, 2);
+    l->addWidget(currencyName, 2, 1, 1, 4);
     l->addWidget(currencyFormattingLabel, 3, 0);
     l->addWidget(currencyFormattingValue, 3, 1);
-    l->addWidget(currencyFormatting, 3, 2);
+    l->addWidget(currencyFormattingSymbolLabel, 3, 2);
+    l->addWidget(currencyFormattingSymbol, 3, 3);
+    l->addWidget(currencyFormatting, 3, 4);
 
     QVBoxLayout *v = new QVBoxLayout(this);
     v->addLayout(l);
     v->addStretch();
 
+    connect(currencyFormattingSymbol, SIGNAL(textChanged(QString)),
+            this, SLOT(updateCurrencyFormatting()));
     connect(currencyFormattingValue, SIGNAL(textChanged(QString)),
-            this, SLOT(updateCurrencyFormatting(QString)));
+            this, SLOT(updateCurrencyFormatting()));
 }
 
-void CurrencyWidget::updateCurrencyFormatting(QString value)
+void CurrencyWidget::updateCurrencyFormatting()
 {
     QString result;
     bool ok;
+    QString symbol = currencyFormattingSymbol->text();
+    QString value = currencyFormattingValue->text();
     int i = value.toInt(&ok);
     if (ok) {
-        result = locale().toCurrencyString(i);
+        result = locale().toCurrencyString(i, symbol);
     } else {
         double d = value.toDouble(&ok);
         if (ok)
-            result = locale().toCurrencyString(d);
+            result = locale().toCurrencyString(d, symbol);
     }
     currencyFormatting->setText(result);
 }
@@ -93,6 +104,6 @@ void CurrencyWidget::localeChanged(QLocale locale)
     currencySymbol->setText(locale.currencySymbol());
     currencyISO->setText(locale.currencySymbol(QLocale::CurrencyIsoCode));
     currencyName->setText(locale.currencySymbol(QLocale::CurrencyDisplayName));
-    updateCurrencyFormatting(currencyFormattingValue->text());
+    updateCurrencyFormatting();
 }
 
diff --git a/tests/manual/qlocale/currency.h b/tests/manual/qlocale/currency.h
index 5e43689..3a12553 100644
--- a/tests/manual/qlocale/currency.h
+++ b/tests/manual/qlocale/currency.h
@@ -58,11 +58,13 @@ private:
     QLineEdit *currencyName;
     QLabel *currencyFormattingLabel;
     QLineEdit *currencyFormattingValue;
+    QLabel *currencyFormattingSymbolLabel;
+    QLineEdit *currencyFormattingSymbol;
     QLineEdit *currencyFormatting;
 
 private slots:
     void localeChanged(QLocale locale);
-    void updateCurrencyFormatting(QString);
+    void updateCurrencyFormatting();
 };
 
 #endif
-- 
cgit v0.12


From bdc74c482973c4658e6ac9d6889411bf0c791432 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 19:00:09 +0100
Subject: Fixed the generator script for qlocale after splitting the sources.

Reviewed-by: trustme
---
 util/local_database/qlocalexml2cpp.py | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 86adf90..ee66ba9 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -381,7 +381,7 @@ def main():
         usage()
     if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.h"):
         usage()
-    if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.cpp"):
+    if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.qdoc"):
         usage()
 
     (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p")
@@ -715,23 +715,23 @@ def main():
 
     os.rename(qlocaleh_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.h")
 
-    # qlocale.cpp
+    # qlocale.qdoc
 
-    (qlocalecpp_temp_file, qlocalecpp_temp_file_path) = tempfile.mkstemp("qlocale.cpp")
-    qlocalecpp_temp_file = os.fdopen(qlocalecpp_temp_file, "w")
-    qlocalecpp_file = open(qtsrcdir + "/src/corelib/tools/qlocale.cpp", "r")
-    s = qlocalecpp_file.readline()
+    (qlocaleqdoc_temp_file, qlocaleqdoc_temp_file_path) = tempfile.mkstemp("qlocale.qdoc")
+    qlocaleqdoc_temp_file = os.fdopen(qlocaleqdoc_temp_file, "w")
+    qlocaleqdoc_file = open(qtsrcdir + "/src/corelib/tools/qlocale.qdoc", "r")
+    s = qlocaleqdoc_file.readline()
     DOCSTRING="    QLocale's data is based on Common Locale Data Repository "
     while s:
         if DOCSTRING in s:
-            qlocalecpp_temp_file.write(DOCSTRING + "v" + cldr_version + ".\n")
+            qlocaleqdoc_temp_file.write(DOCSTRING + "v" + cldr_version + ".\n")
         else:
-            qlocalecpp_temp_file.write(s)
-        s = qlocalecpp_file.readline()
-    qlocalecpp_temp_file.close()
-    qlocalecpp_file.close()
+            qlocaleqdoc_temp_file.write(s)
+        s = qlocaleqdoc_file.readline()
+    qlocaleqdoc_temp_file.close()
+    qlocaleqdoc_file.close()
 
-    os.rename(qlocalecpp_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.cpp")
+    os.rename(qlocaleqdoc_temp_file_path, qtsrcdir + "/src/corelib/tools/qlocale.qdoc")
 
 if __name__ == "__main__":
     main()
-- 
cgit v0.12


From de27e9befdadfd425d13211108287652911b6093 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 19:04:12 +0100
Subject: Fixed documentation for QLocale

Also added a forgotten license header for qlocale.qdoc

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp         |  48 +++-------------
 src/corelib/tools/qlocale.h           |   4 +-
 src/corelib/tools/qlocale.qdoc        | 103 +++++++++++++++++++++++++++++++++-
 src/corelib/tools/qlocale_symbian.cpp |   7 ---
 src/corelib/tools/qlocale_unix.cpp    |   6 --
 src/corelib/tools/qlocale_win.cpp     |   4 --
 6 files changed, 112 insertions(+), 60 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 4925129..2e58361 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -643,15 +643,12 @@ QLocale::NumberOptions QLocale::numberOptions() const
 /*!
     \since 4.8
 
-    Returns \a str quoted according to the current locale.
-
-    If \a AlternateQuotation is used for \a QuoatationStyle
-    but the locale does not provide an alternate quotation,
-    we will fallback to the parent locale.
+    Returns \a str quoted according to the current locale using the given
+    quotation \a style.
 */
-QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
+QString QLocale::quoteString(const QString &str, QuotationStyle style) const
 {
-    return quoteString(&str, qs);
+    return quoteString(&str, style);
 }
 
 /*!
@@ -659,12 +656,12 @@ QString QLocale::quoteString(const QString &str, QuotationStyle qs) const
 
     \overload
 */
-QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
+QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
         QVariant res;
-        if (qs == QLocale::StandardQuotation)
+        if (style == QLocale::StandardQuotation)
             res = systemLocale()->query(QSystemLocale::StringToStandardQuotation, QVariant::fromValue(str));
         else
             res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation, QVariant::fromValue(str));
@@ -674,7 +671,7 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle qs) const
     }
 #endif
 
-    if (qs == QLocale::StandardQuotation)
+    if (style == QLocale::StandardQuotation)
         return QChar(d()->m_quotation_start) % str % QChar(d()->m_quotation_end);
     else
         return QChar(d()->m_alternate_quotation_start) % str % QChar(d()->m_alternate_quotation_end);
@@ -2847,41 +2844,12 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
 }
 
 /*!
-    \fn QString QLocale::toCurrencyString(short, const QString &) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(ushort, const QString &) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(int, const QString &) const
-    \since 4.8
-    \overload
-*/
-
-/*!
-    \fn QString QLocale::toCurrencyString(uint, const QString &) const
-    \since 4.8
-    \overload
-*/
-/*!
-    \fn QString QLocale::toCurrencyString(float, const QString &) const
-    \since 4.8
-    \overload
-*/
-
-/*!
     \since 4.8
 
     Returns a localized string representation of \a value as a currency.
     If the \a symbol is provided it is used instead of the default currency symbol.
 
-    \sa currencySymbol
+    \sa currencySymbol()
 */
 QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
 {
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index a5d5a17..37c43b0 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -727,8 +727,8 @@ public:
     NumberOptions numberOptions() const;
 
     enum QuotationStyle { StandardQuotation, AlternateQuotation };
-    QString quoteString(const QString &str, QuotationStyle qs = StandardQuotation) const;
-    QString quoteString(const QStringRef &str, QuotationStyle qs = StandardQuotation) const;
+    QString quoteString(const QString &str, QuotationStyle style = StandardQuotation) const;
+    QString quoteString(const QStringRef &str, QuotationStyle style = StandardQuotation) const;
 
 //private:                        // this should be private, but can't be
     struct Data {
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 20f546d..dcabcd9 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -1,3 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
 
 /*!
     \class QLocale
@@ -708,7 +734,7 @@
   \value PMText a string that represents the system PM designator associated with a 12-hour clock.
   \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
   \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
-  \value CurrencyToString a localized string representation of a number with a currency symbol.
+  \value CurrencyToString a localized string representation of a number with a currency symbol. Converts a QSystemLocale::CurrencyToStringArgument stored in the in variant to a QString.
   \value UILanguages a list of strings representing locale names that could be used for UI translation.
   \value StringToStandardQuotation a QString containing a quoted version of the string ref stored in the in variant using standard quotes.
   \value StringToAlternateQuotation a QString containing a quoted version of the string ref stored in the in variant using alternate quotes.
@@ -717,6 +743,52 @@
 */
 
 /*!
+    \fn QLocale QSystemLocale::fallbackLocale() const
+
+    \since 4.6
+    Returns the fallback locale obtained from the system.
+*/
+
+/*!
+    \fn QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
+
+    Generic query method for locale data. Provides indirection.
+    Denotes the \a type of the query
+    with \a in as input data depending on the query.
+
+    \sa QSystemLocale::QueryType
+*/
+
+/*!
+    \class QSystemLocale::CurrencyToStringArgument
+
+    A helper class that provides arguments for the QSystemLocale::query()
+    function with query type QSystemLocale::CurrencyToString.
+
+    \sa QSystemLocale::QueryType
+    \since 4.8
+*/
+
+/*!
+    \fn QSystemLocale::CurrencyToStringArgument::CurrencyToStringArgument()
+    \internal
+*/
+/*!
+    \variable QSystemLocale::CurrencyToStringArgument::value
+
+    An input value that should be converted to its string representation.
+    Contains one of QVariant::LongLong, QVariant::ULongLong or QVariant::Double
+    types.
+*/
+/*!
+    \variable QSystemLocale::CurrencyToStringArgument::symbol
+
+    An optional argument containing a currency symbol to be used in the
+    currency string.
+*/
+
+
+/*!
 \fn QString QLocale::toString(short i) const
 
 \overload
@@ -773,3 +845,32 @@
 
 \sa toDouble()
 */
+
+/*!
+    \fn QString QLocale::toCurrencyString(short value, const QString &symbol) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(ushort value, const QString &symbol) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(int value, const QString &symbol) const
+    \since 4.8
+    \overload
+*/
+
+/*!
+    \fn QString QLocale::toCurrencyString(uint value, const QString &symbol) const
+    \since 4.8
+    \overload
+*/
+/*!
+    \fn QString QLocale::toCurrencyString(float value, const QString &symbol) const
+    \since 4.8
+    \overload
+*/
diff --git a/src/corelib/tools/qlocale_symbian.cpp b/src/corelib/tools/qlocale_symbian.cpp
index 4d84de5..85ffb9e 100644
--- a/src/corelib/tools/qlocale_symbian.cpp
+++ b/src/corelib/tools/qlocale_symbian.cpp
@@ -825,13 +825,6 @@ QLocale QSystemLocale::fallbackLocale() const
     return QLocale(locale);
 }
 
-/*!
-    Generic query method for locale data. Provides indirection.
-    Denotes the \a type of the query
-    with \a in as input data depending on the query.
-
-    \sa QSystemLocale::QueryType
-*/
 QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
 {
     switch(type) {
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 74c8c85..72eefd5 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -91,9 +91,6 @@ Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
 #endif
 
 #ifndef QT_NO_SYSTEMLOCALE
-/*!
-    \internal
-*/
 QLocale QSystemLocale::fallbackLocale() const
 {
     QByteArray lang = qgetenv("LC_ALL");
@@ -104,9 +101,6 @@ QLocale QSystemLocale::fallbackLocale() const
     return QLocale(QLatin1String(lang));
 }
 
-/*!
-    \internal
-*/
 QVariant QSystemLocale::query(QueryType type, QVariant in) const
 {
     QSystemLocaleData *d = qSystemLocaleData();
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index cb191f2..ec63d1a 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -494,10 +494,6 @@ QStringList winUILanguages()
 
 #ifndef QT_NO_SYSTEMLOCALE
 
-/*!
-    \since 4.6
-    Returns the fallback locale obtained from the system.
- */
 QLocale QSystemLocale::fallbackLocale() const
 {
     return QLocale(QString::fromLatin1(getWinLocaleName()));
-- 
cgit v0.12


From 75939234d6f6ea046ebe525d671cd25d23675e1e Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 25 Feb 2011 19:57:01 +0100
Subject: Compile fix.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 37c43b0..280e040 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -781,7 +781,9 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLocale &);
 
 QT_END_NAMESPACE
 
+#ifndef QT_NO_SYSTEMLOCALE
 Q_DECLARE_METATYPE(QSystemLocale::CurrencyToStringArgument)
+#endif
 
 QT_END_HEADER
 
-- 
cgit v0.12


From 7858c1e457a0e47029e60339b863808356caafd6 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 12:22:19 +0100
Subject: Compile fix for Qt in namespace.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_p.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 636cc1d..2e95096 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -65,8 +65,6 @@ class CEnvironmentChangeNotifier;
 
 QT_BEGIN_NAMESPACE
 
-Q_DECLARE_METATYPE(QStringRef)
-
 struct Q_CORE_EXPORT QLocalePrivate
 {
 public:
@@ -262,4 +260,6 @@ void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Co
 
 QT_END_NAMESPACE
 
+Q_DECLARE_METATYPE(QStringRef)
+
 #endif // QLOCALE_P_H
-- 
cgit v0.12


From fbf982dd12483b70947131fee1e863d9d9859a42 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 12:52:17 +0100
Subject: Fixed querying QLocale::uiLanguage on Linux.

Handle the case when the LC_MESSAGES only contains the language but not the
country code.

Also fixes qstring conversion - we cannot use fromRawData as the data is a
local array that will be destroyed.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_unix.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 72eefd5..c4aafa0 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -205,8 +205,11 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
             QChar cntry[3];
             int lang_len, cntry_len;
             if (splitLocaleName(QString::fromLatin1(d->lc_messages_var.constData(), d->lc_messages_var.size()),
-                                lang, cntry, &lang_len, &cntry_len))
-                return QStringList(QString::fromRawData(lang, lang_len) % QLatin1Char('-') % QString::fromRawData(cntry, cntry_len));
+                                lang, cntry, &lang_len, &cntry_len)) {
+                if (!cntry_len && lang_len)
+                    return QStringList(QString(lang, lang_len));
+                return QStringList(QString(lang, lang_len) % QLatin1Char('-') % QString(cntry, cntry_len));
+            }
         }
         return QVariant();
     }
-- 
cgit v0.12


From 52b92a21c473c5d92add91bd3e3820ebbbc619ce Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 12:56:19 +0100
Subject: Compile fix on Mac for QLocale.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_mac.mm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 68bb7c5..8a527e4 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -307,6 +307,7 @@ static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
     return QString();
 }
 
+#ifndef QT_NO_SYSTEMLOCALE
 static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
 {
     QCFType<CFNumberRef> value;
@@ -343,7 +344,6 @@ static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
     return QCFString::toQString(result);
 }
 
-#ifndef QT_NO_SYSTEMLOCALE
 static QVariant macQuoteString(QSystemLocale::QueryType type, const QStringRef &str)
 {
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
-- 
cgit v0.12


From 6c57e9a681bf82b9bcb4b0659d151a76ecd1455e Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Feb 2011 17:59:40 +0000
Subject: Change an error code for behavioural compatibility

qtcpsocket autotest checks for a specific error

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index e3b4a09..5dec4ee 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -368,7 +368,7 @@ bool QSymbianSocketEngine::initialize(int socketDescriptor, QAbstractSocket::Soc
 
     if (!QSymbianSocketManager::instance().lookupSocket(socketDescriptor, d->nativeSocket)) {
         qWarning("QSymbianSocketEngine::initialize - socket descriptor not found");
-        d->setError(QAbstractSocket::SocketResourceError,
+        d->setError(QAbstractSocket::UnsupportedSocketOperationError,
             QSymbianSocketEnginePrivate::InvalidSocketErrorString);
         return false;
     }
-- 
cgit v0.12


From 8d74ddeba364785bf3d0d0659e5bb91ab950540d Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Feb 2011 18:01:58 +0000
Subject: Do not error socket when writeDatagram would block

When starting a connection implicitly, datagrams fail with KErrWouldBlock
on S60 5.0 and earlier. On symbian 3, they are dropped without error, but
the bytes written is set to 0.
Due to an apparent bug in symbian, the first packet is failed/dropped on
a UDP socket even if the bearer is up due to existing TCP connection.
With blocking sockets or explicit RConnection usage, this doesn't happen.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 5dec4ee..18ce5e0 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -845,8 +845,19 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
     User::WaitForRequest(status); //Non blocking send
     TInt err = status.Int(); 
 
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug("QSymbianSocketEngine::writeDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli (err=%d)", data,
+           qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
+           port, (qint64) sentBytes(), err);
+#endif
+
     if (err) {
         switch (err) {
+        case KErrWouldBlock:
+            // do not error the socket. (otherwise socket layer is reset)
+            // On symbian^1 and earlier, KErrWouldBlock is returned when interface is not up yet
+            // On symbian^3, KErrNone is returned but sentBytes = 0
+            return 0;
         case KErrTooBig:
             d->setError(QAbstractSocket::DatagramTooLargeError, d->DatagramTooLargeErrorString);
             break;
@@ -855,13 +866,7 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
         }
     }
 
-#if defined (QNATIVESOCKETENGINE_DEBUG)
-    qDebug("QSymbianSocketEnginePrivate::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
-           qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
-           port, (qint64) sentBytes());
-#endif
-
-    return qint64(sentBytes());
+    return (err < 0) ? -1 : len;
 }
 
 // FIXME check where the native socket engine called that..
-- 
cgit v0.12


From 45531aceba4d0b2114942c49f4c256b70af58cf8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Feb 2011 18:22:06 +0000
Subject: Move UDP send length workaround from generic code to symbian engine

Symbian workarounds are better in the symbian socket engine than
generic layer, where this is possible.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp |  9 ++++++++-
 src/network/socket/qudpsocket.cpp           | 10 ----------
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 18ce5e0..dac50d4 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -864,9 +864,16 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
         default:
             d->setError(QAbstractSocket::NetworkError, d->SendDatagramErrorString);
         }
+        return -1;
     }
 
-    return (err < 0) ? -1 : len;
+    if (QSysInfo::s60Version() <= QSysInfo::SV_S60_5_0) {
+        // This is evil hack, but for some reason native RSocket::SendTo returns 0,
+        // for large datagrams (such as 600 bytes). Based on comments from Open C team
+        // this should happen only in platforms <= S60 5.0.
+        return len;
+    }
+    return sentBytes();
 }
 
 // FIXME check where the native socket engine called that..
diff --git a/src/network/socket/qudpsocket.cpp b/src/network/socket/qudpsocket.cpp
index 6a62b12..4334f68 100644
--- a/src/network/socket/qudpsocket.cpp
+++ b/src/network/socket/qudpsocket.cpp
@@ -504,16 +504,6 @@ qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddre
         return -1;
 
     qint64 sent = d->socketEngine->writeDatagram(data, size, address, port);
-#ifdef Q_OS_SYMBIAN
-    if( QSysInfo::s60Version() <= QSysInfo::SV_S60_5_0 ) {
-        // This is evil hack, but for some reason native RSocket::SendTo returns 0,
-        // for large datagrams (such as 600 bytes). Based on comments from Open C team
-        // this should happen only in platforms <= S60 5.0.
-        // As an workaround, we just set sent = size
-        if( sent == 0 )
-            sent = size;
-    }
-#endif
     d->cachedSocketDescriptor = d->socketEngine->socketDescriptor();
 
     if (sent >= 0) {
-- 
cgit v0.12


From 9cb1ebb9096aedc04f01154cecd7b21a062339a6 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 13:40:48 +0100
Subject: QLocale: Compile fix for Windows.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_win.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index ec63d1a..d62c4eb 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -372,6 +372,7 @@ QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
     return QString();
 }
 
+#ifndef QT_NO_SYSTEMLOCALE
 static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
 {
     QString value;
@@ -492,8 +493,6 @@ QStringList winUILanguages()
     return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
 }
 
-#ifndef QT_NO_SYSTEMLOCALE
-
 QLocale QSystemLocale::fallbackLocale() const
 {
     return QLocale(QString::fromLatin1(getWinLocaleName()));
-- 
cgit v0.12


From 803c374749fb0ab37512be0ad625d9823d93067b Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 1 Mar 2011 12:05:47 +0100
Subject: Fixed CLDR to QLocale generator.

Create temp files on the same device as the QTDIR so that rename() will work
properly.

Reviewed-by: Liang Qi
---
 util/local_database/qlocalexml2cpp.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index ee66ba9..8b68984 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -384,7 +384,7 @@ def main():
     if not os.path.isfile(qtsrcdir + "/src/corelib/tools/qlocale.qdoc"):
         usage()
 
-    (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p")
+    (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p", dir=qtsrcdir)
     data_temp_file = os.fdopen(data_temp_file, "w")
     qlocaledata_file = open(qtsrcdir + "/src/corelib/tools/qlocale_data_p.h", "r")
     s = qlocaledata_file.readline()
@@ -667,7 +667,7 @@ def main():
 
     # qlocale.h
 
-    (qlocaleh_temp_file, qlocaleh_temp_file_path) = tempfile.mkstemp("qlocale.h")
+    (qlocaleh_temp_file, qlocaleh_temp_file_path) = tempfile.mkstemp("qlocale.h", dir=qtsrcdir)
     qlocaleh_temp_file = os.fdopen(qlocaleh_temp_file, "w")
     qlocaleh_file = open(qtsrcdir + "/src/corelib/tools/qlocale.h", "r")
     s = qlocaleh_file.readline()
@@ -717,7 +717,7 @@ def main():
 
     # qlocale.qdoc
 
-    (qlocaleqdoc_temp_file, qlocaleqdoc_temp_file_path) = tempfile.mkstemp("qlocale.qdoc")
+    (qlocaleqdoc_temp_file, qlocaleqdoc_temp_file_path) = tempfile.mkstemp("qlocale.qdoc", dir=qtsrcdir)
     qlocaleqdoc_temp_file = os.fdopen(qlocaleqdoc_temp_file, "w")
     qlocaleqdoc_file = open(qtsrcdir + "/src/corelib/tools/qlocale.qdoc", "r")
     s = qlocaleqdoc_file.readline()
-- 
cgit v0.12


From 010471faf918cfab75032a569aab8e510e47a72a Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 1 Mar 2011 16:08:39 +0100
Subject: Use the localized represantion of AM/PM string when converting time.

Reviewed-by: Liang Qi
---
 src/corelib/tools/qlocale.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 2e58361..0a67daf 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2103,7 +2103,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDate *dat
                 } else {
                     repeat = 1;
                 }
-                result.append(am_pm == AM ? QLatin1String("am") : QLatin1String("pm"));
+                result.append(am_pm == AM ? q->amText().toLower() : q->pmText().toLower());
                 break;
 
             case 'A':
@@ -2113,7 +2113,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDate *dat
                 } else {
                     repeat = 1;
                 }
-                result.append(am_pm == AM ? QLatin1String("AM") : QLatin1String("PM"));
+                result.append(am_pm == AM ? q->amText().toUpper() : q->pmText().toUpper());
                 break;
 
             case 'z':
-- 
cgit v0.12


From 440394d05989e1d20f82071045106117e907a378 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 18:48:36 +0100
Subject: Added writing script support to QLocale.

Task-number: QTBUG-17105
Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp          | 427 ++++++++++++++++++++++++---------
 src/corelib/tools/qlocale.h            |  23 +-
 src/corelib/tools/qlocale.qdoc         |   1 +
 src/corelib/tools/qlocale_mac.mm       |  15 +-
 src/corelib/tools/qlocale_p.h          |  28 ++-
 src/corelib/tools/qlocale_symbian.cpp  |   8 +-
 src/corelib/tools/qlocale_unix.cpp     |  17 +-
 src/corelib/tools/qlocale_win.cpp      |  10 +-
 tests/auto/qlocale/tst_qlocale.cpp     |  39 ++-
 tests/manual/qlocale/window.cpp        |  28 ++-
 util/local_database/cldr2qlocalexml.py |  31 ++-
 util/local_database/enumdata.py        |  20 ++
 util/local_database/qlocalexml2cpp.py  | 148 ++++++++++--
 13 files changed, 613 insertions(+), 182 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 0a67daf..efa1f6c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -94,14 +94,14 @@ QT_BEGIN_INCLUDE_NAMESPACE
 #include "qlocale_data_p.h"
 QT_END_INCLUDE_NAMESPACE
 
-// Assumes that code is a
-// QChar code[3];
-// If the code is two-digit the third digit must be 0
-QLocale::Language codeToLanguage(const QChar *code)
+QLocale::Language QLocalePrivate::codeToLanguage(const QString &code)
 {
-    ushort uc1 = code[0].unicode();
-    ushort uc2 = code[1].unicode();
-    ushort uc3 = code[2].unicode();
+    int len = code.length();
+    if (len != 2 && len != 3)
+        return QLocale::C;
+    ushort uc1 = len-- > 0 ? code[0].toLower().unicode() : 0;
+    ushort uc2 = len-- > 0 ? code[1].toLower().unicode() : 0;
+    ushort uc3 = len-- > 0 ? code[2].toLower().unicode() : 0;
 
     if (uc1 == 'n' && uc2 == 'o' && uc3 == 0)
         uc2 = 'b';
@@ -115,13 +115,34 @@ QLocale::Language codeToLanguage(const QChar *code)
     return QLocale::C;
 }
 
-// Assumes that code is a
-// QChar code[3];
-QLocale::Country codeToCountry(const QChar *code)
+QLocale::Script QLocalePrivate::codeToScript(const QString &code)
 {
-    ushort uc1 = code[0].unicode();
-    ushort uc2 = code[1].unicode();
-    ushort uc3 = code[2].unicode();
+    int len = code.length();
+    if (len != 4)
+        return QLocale::AnyScript;
+
+    // script is titlecased in our data
+    unsigned char c0 = code.at(0).toUpper().toLatin1();
+    unsigned char c1 = code.at(1).toLower().toLatin1();
+    unsigned char c2 = code.at(2).toLower().toLatin1();
+    unsigned char c3 = code.at(3).toLower().toLatin1();
+
+    const unsigned char *c = script_code_list;
+    for (int i = 0; i < QLocale::LastScript; ++i, c += 4) {
+        if (c0 == c[0] && c1 == c[1] && c2 == c[2] && c3 == c[3])
+            return QLocale::Script(i);
+    }
+    return QLocale::AnyScript;
+}
+
+QLocale::Country QLocalePrivate::codeToCountry(const QString &code)
+{
+    int len = code.length();
+    if (len != 2 && len != 3)
+        return QLocale::AnyCountry;
+    ushort uc1 = len-- > 0 ? code[0].toUpper().unicode() : 0;
+    ushort uc2 = len-- > 0 ? code[1].toUpper().unicode() : 0;
+    ushort uc3 = len-- > 0 ? code[2].toUpper().unicode() : 0;
 
     const unsigned char *c = country_code_list;
     for (; *c != 0; c += 3) {
@@ -132,12 +153,14 @@ QLocale::Country codeToCountry(const QChar *code)
     return QLocale::AnyCountry;
 }
 
-QString languageToCode(QLocale::Language language)
+QString QLocalePrivate::languageCode() const
 {
-    if (language == QLocale::C)
+    if (m_language_id == QLocale::AnyLanguage)
+        return QString();
+    if (m_language_id == QLocale::C)
         return QLatin1String("C");
 
-    const unsigned char *c = language_code_list + 3*(uint(language));
+    const unsigned char *c = language_code_list + 3*(uint(m_language_id));
 
     QString code(c[2] == 0 ? 2 : 3, Qt::Uninitialized);
 
@@ -149,12 +172,20 @@ QString languageToCode(QLocale::Language language)
     return code;
 }
 
-QString countryToCode(QLocale::Country country)
+QString QLocalePrivate::scriptCode() const
 {
-    if (country == QLocale::AnyCountry)
+    if (m_script_id == QLocale::AnyScript || m_script_id > QLocale::LastScript)
         return QString();
+    const unsigned char *c = script_code_list + 4*(uint(m_script_id));
+    return QString::fromLatin1((const char *)c, 4);
+}
 
-    const unsigned char *c = country_code_list + 3*(uint(country));
+QString QLocalePrivate::countryCode() const
+{
+    if (m_country_id == QLocale::AnyCountry)
+        return QString();
+
+    const unsigned char *c = country_code_list + 3*(uint(m_country_id));
 
     QString code(c[2] == 0 ? 2 : 3, Qt::Uninitialized);
 
@@ -166,10 +197,46 @@ QString countryToCode(QLocale::Country country)
     return code;
 }
 
-const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country country)
+QString QLocalePrivate::bcp47Name() const
 {
-    unsigned language_id = language;
-    unsigned country_id = country;
+    if (m_language_id == QLocale::AnyLanguage)
+        return QString();
+    if (m_language_id == QLocale::C)
+        return QLatin1String("C");
+    const unsigned char *lang = language_code_list + 3*(uint(m_language_id));
+    const unsigned char *script =
+            (m_script_id != QLocale::AnyScript ? script_code_list + 4*(uint(m_script_id)) : 0);
+    const unsigned char *country =
+            (m_country_id != QLocale::AnyCountry  ? country_code_list + 3*(uint(m_country_id)) : 0);
+    char len = (lang[2] != 0 ? 3 : 2) + (script ? 4+1 : 0) + (country ? (country[2] != 0 ? 3 : 2)+1 : 0);
+    QString name(len, Qt::Uninitialized);
+    QChar *uc = name.data();
+    *uc++ = ushort(lang[0]);
+    *uc++ = ushort(lang[1]);
+    if (lang[2] != 0)
+        *uc++ = ushort(lang[2]);
+    if (script) {
+        *uc++ = QLatin1Char('-');
+        *uc++ = ushort(script[0]);
+        *uc++ = ushort(script[1]);
+        *uc++ = ushort(script[2]);
+        *uc++ = ushort(script[3]);
+    }
+    if (country) {
+        *uc++ = QLatin1Char('-');
+        *uc++ = ushort(country[0]);
+        *uc++ = ushort(country[1]);
+        if (country[2] != 0)
+            *uc++ = ushort(country[2]);
+    }
+    return name;
+}
+
+const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Script script, QLocale::Country country)
+{
+    const unsigned language_id = language;
+    const unsigned script_id = script;
+    const unsigned country_id = country;
 
     uint idx = locale_index[language_id];
 
@@ -178,111 +245,133 @@ const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country co
     if (idx == 0) // default language has no associated country
         return d;
 
-    if (country == QLocale::AnyCountry)
+    if (script == QLocale::AnyScript && country == QLocale::AnyCountry)
         return d;
 
     Q_ASSERT(d->languageId() == language_id);
 
-    while (d->languageId() == language_id
-                && d->countryId() != country_id)
-        ++d;
-
-    if (d->countryId() == country_id
-            && d->languageId() == language_id)
-        return d;
+    if (country == QLocale::AnyCountry) {
+        while (d->m_language_id == language_id && d->m_script_id != script_id)
+            ++d;
+        if (d->m_language_id == language_id && d->m_script_id == script_id)
+            return d;
+    } else if (script == QLocale::AnyScript) {
+        while (d->m_language_id == language_id) {
+            if (d->m_script_id == script_id && d->m_country_id == country_id)
+                return d;
+            ++d;
+        }
+    } else {
+        // both script and country are explicitely specified
+        while (d->m_language_id == language_id) {
+            if (d->m_script_id == script_id && d->m_country_id == country_id)
+                return d;
+            ++d;
+        }
+    }
 
     return locale_data + idx;
 }
 
-bool splitLocaleName(const QString &name,
-                     QChar *lang_begin, QChar *cntry_begin,
-                     int *lang_len, int *cntry_len)
+static bool parse_locale_tag(const QString &input, int &i, QString *result, const QString &separators)
 {
-    for (int i = 0; i < 3; ++i)
-        lang_begin[i] = 0;
-    for (int i = 0; i < 3; ++i)
-        cntry_begin[i] = 0;
-    if (lang_len)
-        *lang_len = 0;
-    if (cntry_len)
-        *cntry_len = 0;
+    *result = QString(8, Qt::Uninitialized); // worst case according to BCP47
+    QChar *pch = result->data();
+    const QChar *uc = input.data() + i;
+    const int l = input.length();
+    int size = 0;
+    for (; i < l && size < 5; ++i, ++size) {
+        if (separators.contains(*uc))
+            break;
+        if (uc->unicode() > 0xFF) // latin only
+            return false;
+        *pch++ = *uc++;
+    }
+    result->truncate(size);
+    return true;
+}
 
-    int l = name.length();
+bool splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry)
+{
+    const int length = name.length();
 
-    QChar *lang = lang_begin;
-    QChar *cntry = cntry_begin;
+    lang = script = cntry = QString();
 
-    int state = 0;
-    const QChar *uc = name.unicode();
-    for (int i = 0; i < l; ++i) {
-        if (uc->unicode() == '.' || uc->unicode() == '@')
+    const QString separators = QLatin1String("_-.@");
+    enum ParserState { NoState, LangState, ScriptState, CountryState };
+    ParserState state = LangState;
+    for (int i = 0; i < length && state != NoState; ) {
+        QString value;
+        if (!parse_locale_tag(name, i, &value, separators) ||value.isEmpty())
             break;
-
+        QChar sep = i < length ? name.at(i) : QChar();
         switch (state) {
-            case 0:
-                // parsing language
-                if (uc->unicode() == '_' || uc->unicode() == '-') {
-                    state = 1;
-                    break;
-                }
-                if (lang - lang_begin == 3)
-                    return false;
-                if (uc->unicode() < 'a' || uc->unicode() > 'z')
-                    return false;
-
-                *lang = *uc;
-                ++lang;
-                break;
-            case 1:
-                // parsing country
-                if (cntry - cntry_begin == 3) {
-                    cntry_begin[0] = 0;
-                    break;
-                }
-
-                *cntry = *uc;
-                ++cntry;
+        case LangState:
+            lang = value;
+            if (i == length) {
+                // just language was specified
+                state = NoState;
                 break;
+            }
+            state = ScriptState;
+            break;
+        case ScriptState: {
+            QString scripts = QString::fromLatin1((const char *)script_code_list, sizeof(script_code_list));
+            if (value.length() == 4 && scripts.indexOf(value) % 4 == 0) {
+                // script name is always 4 characters
+                script = value;
+                state = CountryState;
+            } else {
+                // it wasn't a script, maybe it is a country then?
+                cntry = value;
+                state = NoState;
+            }
+            break;
         }
-
-        ++uc;
+        case CountryState:
+            cntry = value;
+            state = NoState;
+            break;
+        case NoState:
+            // shouldn't happen
+            qWarning("QLocale: This should never happen");
+            break;
+        }
+        ++i;
     }
-
-    if (lang_len)
-        *lang_len = lang - lang_begin;
-    if (cntry_len)
-        *cntry_len = cntry - cntry_begin;
-
-    int lang_length = lang - lang_begin;
-    return lang_length == 2 || lang_length == 3;
+    return lang.length() == 2 || lang.length() == 3;
 }
 
-void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Country &cntry)
+void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &lang,
+                                       QLocale::Script &script, QLocale::Country &cntry)
 {
     lang = QLocale::C;
+    script = QLocale::AnyScript;
     cntry = QLocale::AnyCountry;
 
-    QChar lang_code[3];
-    QChar cntry_code[3];
-    if (!splitLocaleName(name, lang_code, cntry_code))
+    QString lang_code;
+    QString script_code;
+    QString cntry_code;
+    if (!splitLocaleName(name, lang_code, script_code, cntry_code))
         return;
 
-    lang = codeToLanguage(lang_code);
+    lang = QLocalePrivate::codeToLanguage(lang_code);
     if (lang == QLocale::C)
         return;
-
-    if (cntry_code[0].unicode() != 0)
-        cntry = codeToCountry(cntry_code);
+    script = QLocalePrivate::codeToScript(script_code);
+    cntry = QLocalePrivate::codeToCountry(cntry_code);
 }
 
 const QLocalePrivate *findLocale(const QString &name)
 {
     QLocale::Language lang;
+    QLocale::Script script;
     QLocale::Country cntry;
-    getLangAndCountry(name, lang, cntry);
+    QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
 
-    return findLocale(lang, cntry);
+    return findLocale(lang, script, cntry);
 }
+
 QString readEscapedFormatString(const QString &format, int *idx)
 {
     int &i = *idx;
@@ -389,11 +478,18 @@ void QLocalePrivate::updateSystemPrivate()
 #endif
 
     QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
-    if (!res.isNull())
+    if (!res.isNull()) {
         system_lp->m_language_id = res.toInt();
+        system_lp->m_script_id = QLocale::AnyScript; // default for compatibility
+    }
     res = sys_locale->query(QSystemLocale::CountryId, QVariant());
-    if (!res.isNull())
+    if (!res.isNull()) {
         system_lp->m_country_id = res.toInt();
+        system_lp->m_script_id = QLocale::AnyScript; // default for compatibility
+    }
+    res = sys_locale->query(QSystemLocale::ScriptId, QVariant());
+    if (!res.isNull())
+        system_lp->m_script_id = res.toInt();
 
     res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
     if (!res.isNull())
@@ -510,11 +606,12 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
 /*!
     Constructs a QLocale object with the specified \a name,
     which has the format
-    "language[_-country][.codeset][@modifier]" or "C", where:
+    "language[_script][_country][.codeset][@modifier]" or "C", where:
 
     \list
     \i language is a lowercase, two-letter, ISO 639 language code,
-    \i territory is an uppercase, two-letter, ISO 3166 country code,
+    \i script is a titlecase, four-letter, ISO 15924 script code,
+    \i country is an uppercase, two- or three-letter, ISO 3166 country code (also "419" as defined by United Nations),
     \i and codeset and modifier are ignored.
     \endlist
 
@@ -525,12 +622,12 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
     is not present, or is not a valid ISO 3166 code, the most
     appropriate country is chosen for the specified language.
 
-    The language and country codes are converted to their respective
-    \c Language and \c Country enums. After this conversion is
-    performed the constructor behaves exactly like QLocale(Country,
+    The language, script and country codes are converted to their respective
+    \c Language, \c Script and \c Country enums. After this conversion is
+    performed the constructor behaves exactly like QLocale(Country, Script,
     Language).
 
-    This constructor is much slower than QLocale(Country, Language).
+    This constructor is much slower than QLocale(Country, Script, Language).
 
     \sa name()
 */
@@ -579,7 +676,46 @@ QLocale::QLocale()
 QLocale::QLocale(Language language, Country country)
     : v(0)
 {
-    const QLocalePrivate *d = findLocale(language, country);
+    const QLocalePrivate *d = findLocale(language, QLocale::AnyScript, country);
+
+    // If not found, should default to system
+    if (d->languageId() == QLocale::C && language != QLocale::C) {
+        p.numberOptions = default_number_options;
+        p.index = localePrivateIndex(defaultPrivate());
+    } else {
+        p.numberOptions = 0;
+        p.index = localePrivateIndex(d);
+    }
+}
+\
+/*!
+    \since 4.8
+
+    Constructs a QLocale object with the specified \a language, \a script and
+    \a country.
+
+    \list
+    \i If the language/script/country is found in the database, it is used.
+    \i If both \a script is AnyScript and \a country is AnyCountry, the
+       language is used with the most appropriate available script and country
+       (for example, Germany for German),
+    \i If either \a script is AnyScript or \a country is AnyCountry, the
+       language is used with the first locale that matches the given \a script
+       and \a country.
+    \i If neither the language nor the country are found, QLocale
+       defaults to the default locale (see setDefault()).
+    \endlist
+
+    The language, script and country that are actually used can be queried
+    using language(), script() and country().
+
+    \sa setDefault() language() script() country()
+*/
+
+QLocale::QLocale(Language language, Script script, Country country)
+    : v(0)
+{
+    const QLocalePrivate *d = findLocale(language, script, country);
 
     // If not found, should default to system
     if (d->languageId() == QLocale::C && language != QLocale::C) {
@@ -708,6 +844,11 @@ QLocale::Language QLocale::language() const
     return Language(d()->languageId());
 }
 
+QLocale::Script QLocale::script() const
+{
+    return Script(d()->m_script_id);
+}
+
 /*!
     Returns the country of this locale.
 
@@ -722,16 +863,20 @@ QLocale::Country QLocale::country() const
     Returns the language and country of this locale as a
     string of the form "language_country", where
     language is a lowercase, two-letter ISO 639 language code,
-    and country is an uppercase, two-letter ISO 3166 country code.
+    and country is an uppercase, two- or three-letter ISO 3166 country code.
 
-    \sa language(), country()
+    Note that even if QLocale object was constructed with a specific script,
+    name() will ignore it for compatibility reasons. Use bcp47Name() instead
+    if you need a full locale name.
+
+    \sa QLocale(const QString &), language(), country(), bcp47Name()
 */
 
 QString QLocale::name() const
 {
     Language l = language();
 
-    QString result = languageToCode(l);
+    QString result = d()->languageCode();
 
     if (l == C)
         return result;
@@ -741,15 +886,30 @@ QString QLocale::name() const
         return result;
 
     result.append(QLatin1Char('_'));
-    result.append(countryToCode(c));
+    result.append(d()->countryCode());
 
     return result;
 }
 
 /*!
+    \since 4.8
+
+    Returns the dash-separated language, script and country (and possibly other BCP47 fields)
+    of this locale as a string.
+
+    This function tries to conform the locale name to BCP47.
+
+    \sa language(), country(), script()
+*/
+QString QLocale::bcp47Name() const
+{
+    return d()->bcp47Name();
+}
+
+/*!
     Returns a QString containing the name of \a language.
 
-    \sa countryToString(), name()
+    \sa countryToString(), scriptToString(), bcp47Name()
 */
 
 QString QLocale::languageToString(Language language)
@@ -762,7 +922,7 @@ QString QLocale::languageToString(Language language)
 /*!
     Returns a QString containing the name of \a country.
 
-    \sa country(), name()
+    \sa languageToString(), scriptToString(), country(), bcp47Name()
 */
 
 QString QLocale::countryToString(Country country)
@@ -773,6 +933,20 @@ QString QLocale::countryToString(Country country)
 }
 
 /*!
+    \since 4.8
+
+    Returns a QString containing the name of \a script.
+
+    \sa languageToString(), countryToString(), script(), bcp47Name()
+*/
+QString QLocale::scriptToString(QLocale::Script script)
+{
+    if (uint(script) > uint(QLocale::LastScript))
+        return QLatin1String("Unknown");
+    return QLatin1String(script_name_list + script_name_index[script]);
+}
+
+/*!
     Returns the short int represented by the localized string \a s,
     using base \a base. If \a base is 0 the base is determined
     automatically using the following rules: If the string begins with
@@ -1579,12 +1753,47 @@ QLocale QLocale::system()
     return result;
 }
 
+
+/*!
+    \since 4.8
+
+    Returns the list of valid locale names that match the given \a language, \a
+    script and \a country.
+
+    Getting a list of all locales:
+    QStringList allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
+*/
+QStringList QLocale::matchingLocales(QLocale::Language language,
+                                     QLocale::Script script,
+                                     QLocale::Country country)
+{
+    if (uint(language) > QLocale::LastLanguage || uint(script) > QLocale::LastScript ||
+            uint(country) > QLocale::LastCountry)
+        return QStringList();
+
+    QStringList result;
+    const QLocalePrivate *d = locale_data;
+    if (language == QLocale::AnyLanguage && script == QLocale::AnyScript && country == QLocale::AnyCountry)
+        result.reserve(locale_data_size);
+    if (language != QLocale::C)
+        d += locale_index[language];
+    while ( (d != locale_data + locale_data_size)
+            && (language == QLocale::AnyLanguage || d->m_language_id == uint(language))) {
+        result.append(d->bcp47Name());
+        ++d;
+    }
+    return result;
+}
+
 /*!
+    \obsolete
     \since 4.3
 
     Returns the list of countries that have entires for \a language in Qt's locale
     database. If the result is an empty list, then \a language is not represented in
     Qt's locale database.
+
+    \sa matchingLocales
 */
 QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
 {
@@ -2939,7 +3148,7 @@ QString QLocale::toCurrencyString(double value, const QString &symbol) const
     Returns a sorted list of locale names that could be used for translation
     of messages presented to the user.
 
-    \sa QTranslator
+    \sa QTranslator, bcp47Name()
 */
 QStringList QLocale::uiLanguages() const
 {
@@ -2953,7 +3162,7 @@ QStringList QLocale::uiLanguages() const
         }
     }
 #endif
-    return QStringList(name());
+    return QStringList(bcp47Name());
 }
 
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 280e040..d5c41d0 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -112,7 +112,8 @@ public:
         CurrencyToString, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
         StringToStandardQuotation, // QString in: QStringRef to quote
-        StringToAlternateQuotation // QString in: QStringRef to quote
+        StringToAlternateQuotation, // QString in: QStringRef to quote
+        ScriptId // uint
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -140,6 +141,7 @@ public:
 // GENERATED PART STARTS HERE
 // see qlocale_data_p.h for more info on generated data
     enum Language {
+        AnyLanguage = 0,
         C = 1,
         Abkhazian = 2,
         Afan = 3,
@@ -359,6 +361,19 @@ public:
         LastLanguage = Shambala
     };
 
+    enum Script {
+        AnyScript = 0,
+        ArabicScript = 1,
+        CyrillicScript = 2,
+        DeseretScript = 3,
+        GurmukhiScript = 4,
+        SimplifiedHanScript = 5,
+        TraditionalHanScript = 6,
+        LatinScript = 7,
+        MongolianScript = 8,
+        TifinaghScript = 9,
+        LastScript = TifinaghScript
+    };
     enum Country {
         AnyCountry = 0,
         Afghanistan = 1,
@@ -629,14 +644,18 @@ public:
     QLocale();
     QLocale(const QString &name);
     QLocale(Language language, Country country = AnyCountry);
+    QLocale(Language language, Script script, Country country);
     QLocale(const QLocale &other);
 
     QLocale &operator=(const QLocale &other);
 
     Language language() const;
+    Script script() const;
     Country country() const;
     QString name() const;
 
+    QString bcp47Name() const;
+
     short toShort(const QString &s, bool *ok = 0, int base = 0) const;
     ushort toUShort(const QString &s, bool *ok = 0, int base = 0) const;
     int toInt(const QString &s, bool *ok = 0, int base = 0) const;
@@ -716,11 +735,13 @@ public:
 
     static QString languageToString(Language language);
     static QString countryToString(Country country);
+    static QString scriptToString(Script script);
     static void setDefault(const QLocale &locale);
 
     static QLocale c() { return QLocale(C); }
     static QLocale system();
 
+    static QStringList matchingLocales(QLocale::Language language, QLocale::Script script, QLocale::Country country);
     static QList<Country> countriesForLanguage(Language lang);
 
     void setNumberOptions(NumberOptions options);
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index dcabcd9..4f5e0e5 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -707,6 +707,7 @@
   the type of information to return from the query() method is listed.
 
   \value LanguageId a uint specifying the language.
+  \value ScriptId a uint specifying the script.
   \value CountryId a uint specifying the country.
   \value DecimalPoint a QString specifying the decimal point.
   \value GroupSeparator a QString specifying the group separator.
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 8a527e4..ba7ca7d 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -73,10 +73,9 @@ static QByteArray getMacLocaleName()
 {
     QByteArray result = envVarLocale();
 
-    QChar lang[3];
-    QChar cntry[3];
+    QString lang, script, cntry;
     if (result.isEmpty() || result != "C"
-            && !splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) {
+            && !splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) {
         QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
         CFStringRef locale = CFLocaleGetIdentifier(l);
         result = QCFString::toQString(locale).toUtf8();
@@ -436,15 +435,17 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case LanguageId:
     case CountryId: {
         QString preferredLanguage;
-        QString preferredCountry(3, QChar()); // codeToCountry assumes QChar[3]
+        QString preferredCountry;
         getMacPreferredLanguageAndCountry(&preferredLanguage, &preferredCountry);
-        QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : codeToLanguage(preferredLanguage.data()));
-        QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : codeToCountry(preferredCountry.data()));
-        const QLocalePrivate *d = findLocale(languageCode, countryCode);
+        QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : QLocalePrivate::codeToLanguage(preferredLanguage));
+        QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : QLocalePrivate::codeToCountry(preferredCountry));
+        const QLocalePrivate *d = findLocale(languageCode, QLocale::AnyScript, countryCode);
         if (type == LanguageId)
             return (QLocale::Language)d->languageId();
         return (QLocale::Country)d->countryId();
     }
+    case ScriptId:
+        return QVariant(QLocale::AnyScript);
 
     case MeasurementSystem:
         return QVariant(static_cast<int>(macMeasurementSystem()));
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 2e95096..1f73982 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -77,8 +77,20 @@ public:
     QChar minus() const { return QChar(m_minus); }
     QChar exponential() const { return QChar(m_exponential); }
 
-    quint32 languageId() const { return m_language_id; }
-    quint32 countryId() const { return m_country_id; }
+    quint16 languageId() const { return m_language_id; }
+    quint16 countryId() const { return m_country_id; }
+
+    QString bcp47Name() const;
+
+    QString languageCode() const; // ### QByteArray::fromRawData would be more optimal
+    QString scriptCode() const;
+    QString countryCode() const;
+
+    static QLocale::Language codeToLanguage(const QString &code);
+    static QLocale::Script codeToScript(const QString &code);
+    static QLocale::Country codeToCountry(const QString &code);
+    static void getLangAndCountry(const QString &name, QLocale::Language &lang,
+                                  QLocale::Script &script, QLocale::Country &cntry);
 
     QLocale::MeasurementSystem measurementSystem() const;
 
@@ -161,7 +173,7 @@ public:
     QString dateTimeToString(const QString &format, const QDate *date, const QTime *time,
                              const QLocale *q) const;
 
-    quint16 m_language_id, m_country_id;
+    quint16 m_language_id, m_script_id, m_country_id;
 
     quint16 m_decimal, m_group, m_list, m_percent,
         m_zero, m_minus, m_plus, m_exponential;
@@ -248,15 +260,13 @@ private:
 };
 #endif
 
-const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Country country);
+const QLocalePrivate *findLocale(QLocale::Language language,
+                                 QLocale::Script script,
+                                 QLocale::Country country);
 const QLocalePrivate *findLocale(const QString &name);
 QString readEscapedFormatString(const QString &format, int *idx);
-bool splitLocaleName(const QString &name, QChar *lang_begin, QChar *cntry_begin,
-                     int *lang_len = 0, int *cntry_len = 0);
+bool splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
 int repeatCount(const QString &s, int i);
-QLocale::Language codeToLanguage(const QChar *code);
-QLocale::Country codeToCountry(const QChar *code);
-void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Country &cntry);
 
 QT_END_NAMESPACE
 
diff --git a/src/corelib/tools/qlocale_symbian.cpp b/src/corelib/tools/qlocale_symbian.cpp
index 85ffb9e..09d74d0 100644
--- a/src/corelib/tools/qlocale_symbian.cpp
+++ b/src/corelib/tools/qlocale_symbian.cpp
@@ -57,9 +57,6 @@
 
 QT_BEGIN_NAMESPACE
 
-// Located in qlocale.cpp
-extern void getLangAndCountry(const QString &name, QLocale::Language &lang, QLocale::Country &cntry);
-
 static TExtendedLocale _s60Locale;
 
 // Type definitions for runtime resolved function pointers
@@ -872,8 +869,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
                 TLanguage language = User::Language();
                 QString locale = QLatin1String(qt_symbianLocaleName(language));
                 QLocale::Language lang;
+                QLocale::Script script;
                 QLocale::Country cntry;
-                getLangAndCountry(locale, lang, cntry);
+                QLocalePrivate::getLangAndCountry(locale, lang, script, cntry);
                 if (type == LanguageId)
                     return lang;
                 // few iso codes have no country and will use this
@@ -882,6 +880,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
 
                 return cntry;
             }
+        case ScriptId:
+            return QVariant(QLocale::AnyScript);
         case NegativeSign:
         case PositiveSign:
             break;
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index c4aafa0..3701b2b 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -191,9 +191,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
             QStringList lst = languages.split(QLatin1Char(':'));
             for (int i = 0; i < lst.size();) {
                 const QString &name = lst.at(i);
-                QChar lang[3];
-                QChar cntry[3];
-                if (name.isEmpty() || !splitLocaleName(name, lang, cntry))
+                QString lang, script, cntry;
+                if (name.isEmpty() || !splitLocaleName(name, lang, script, cntry))
                     lst.removeAt(i);
                 else
                     ++i;
@@ -201,14 +200,12 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
             return lst;
         }
         if (!d->lc_messages_var.isEmpty()) {
-            QChar lang[3];
-            QChar cntry[3];
-            int lang_len, cntry_len;
+            QString lang, script, cntry;
             if (splitLocaleName(QString::fromLatin1(d->lc_messages_var.constData(), d->lc_messages_var.size()),
-                                lang, cntry, &lang_len, &cntry_len)) {
-                if (!cntry_len && lang_len)
-                    return QStringList(QString(lang, lang_len));
-                return QStringList(QString(lang, lang_len) % QLatin1Char('-') % QString(cntry, cntry_len));
+                                lang, script, cntry)) {
+                if (!cntry.length() && lang.length())
+                    return QStringList(lang);
+                return QStringList(lang % QLatin1Char('-') % cntry);
             }
         }
         return QVariant();
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index d62c4eb..10e9ba1 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -113,10 +113,9 @@ QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT)
     QByteArray result;
     if (id == LOCALE_USER_DEFAULT) {
         result = envVarLocale();
-        QChar lang[3];
-        QChar cntry[3];
+        QString lang, script, cntry;
         if ( result == "C" || (!result.isEmpty()
-                && splitLocaleName(QString::fromLocal8Bit(result), lang, cntry)) ) {
+                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
             long id = 0;
             bool ok = false;
             id = qstrtoll(result.data(), 0, 0, &ok);
@@ -562,14 +561,17 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case CountryId: {
         QString locale = QString::fromLatin1(getWinLocaleName());
         QLocale::Language lang;
+        QLocale::Script script;
         QLocale::Country cntry;
-        getLangAndCountry(locale, lang, cntry);
+        getLangAndCountry(locale, lang, script, cntry);
         if (type == LanguageId)
             return lang;
         if (cntry == QLocale::AnyCountry)
             return fallbackLocale().country();
         return cntry;
     }
+    case ScriptId:
+        return QVariant(QLocale::AnyScript);
 
     case MeasurementSystem:
         return QVariant(static_cast<int>(winSystemMeasurementSystem()));
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index 7a3e339..cb69d54 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -185,6 +185,7 @@ void tst_QLocale::ctor()
         QCOMPARE(l.language(), QLocale::C);
         QCOMPARE(l.country(), QLocale::AnyCountry);
     }
+    TEST_CTOR(AnyLanguage, AnyCountry, default_lang, default_country)
     TEST_CTOR(C, AnyCountry, QLocale::C, QLocale::AnyCountry)
     TEST_CTOR(Aymara, AnyCountry, default_lang, default_country)
     TEST_CTOR(Aymara, France, default_lang, default_country)
@@ -310,6 +311,7 @@ void tst_QLocale::ctor()
     TEST_CTOR("en@", English, UnitedStates)
     TEST_CTOR("en.@", English, UnitedStates)
     TEST_CTOR("en_", English, UnitedStates)
+    TEST_CTOR("en_U", English, UnitedStates)
     TEST_CTOR("en_.", English, UnitedStates)
     TEST_CTOR("en_.@", English, UnitedStates)
     TEST_CTOR("en.bla", English, UnitedStates)
@@ -335,11 +337,35 @@ void tst_QLocale::ctor()
     TEST_CTOR("es-419", Spanish, LatinAmericaAndTheCaribbean)
 
     // test default countries for languages
+    TEST_CTOR("zh", Chinese, China)
+    TEST_CTOR("zh-Hans", Chinese, China)
     TEST_CTOR("mn", Mongolian, Mongolia)
     TEST_CTOR("ne", Nepali, Nepal)
 
 #undef TEST_CTOR
+#define TEST_CTOR(req_lc, exp_lang, exp_script, exp_country) \
+    { \
+    QLocale l(req_lc); \
+    QVERIFY2(l.language() == QLocale::exp_lang \
+        && l.script() == QLocale::exp_script \
+        && l.country() == QLocale::exp_country, \
+        QString("requested: \"" + QString(req_lc) + "\", got: " \
+        + QLocale::languageToString(l.language()) \
+        + "/" + QLocale::scriptToString(l.script()) \
+        + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+    }
+
+    TEST_CTOR("zh_CN", Chinese, AnyScript, China)
+    TEST_CTOR("zh_Hans_CN", Chinese, SimplifiedHanScript, China)
+    TEST_CTOR("zh_Hans", Chinese, SimplifiedHanScript, China)
+    TEST_CTOR("zh_Hant", Chinese, TraditionalHanScript, HongKong)
+    TEST_CTOR("zh_Hans_MO", Chinese, SimplifiedHanScript, Macau)
+    TEST_CTOR("zh_Hant_MO", Chinese, TraditionalHanScript, Macau)
+    TEST_CTOR("az_Latn_AZ", Azerbaijani, LatinScript, Azerbaijan)
+    TEST_CTOR("ha_Arab_NG", Hausa, ArabicScript, Nigeria)
+    TEST_CTOR("ha_Latn_NG", Hausa, LatinScript, Nigeria)
 
+#undef TEST_CTOR
 }
 
 void tst_QLocale::emptyCtor()
@@ -412,11 +438,12 @@ void tst_QLocale::emptyCtor()
     TEST_CTOR("nb_NO", "nb_NO")
     TEST_CTOR("nn_NO", "nn_NO")
 
+    TEST_CTOR("DE", "de_DE");
+    TEST_CTOR("EN", "en_US");
+
     TEST_CTOR("en/", defaultLoc)
-    TEST_CTOR("DE", defaultLoc);
     TEST_CTOR("asdfghj", defaultLoc);
     TEST_CTOR("123456", defaultLoc);
-    TEST_CTOR("EN", defaultLoc);
 
 #undef TEST_CTOR
 #endif
@@ -2086,6 +2113,10 @@ void tst_QLocale::monthName()
     QCOMPARE(ru.monthName(1, QLocale::LongFormat), QString::fromUtf8("\321\217\320\275\320\262\320\260\321\200\321\217"));
     QCOMPARE(ru.monthName(1, QLocale::ShortFormat), QString::fromUtf8("\321\217\320\275\320\262\56"));
     QCOMPARE(ru.monthName(1, QLocale::NarrowFormat), QString::fromUtf8("\320\257"));
+
+    // check that our CLDR scripts handle surrogate pairs correctly
+    QLocale dsrt("en-Dsrt-US");
+    QCOMPARE(dsrt.monthName(1, QLocale::LongFormat), QString::fromUtf8("\xf0\x90\x90\x96\xf0\x90\x90\xb0\xf0\x90\x91\x8c\xf0\x90\x90\xb7\xf0\x90\x90\xad\xf0\x90\x90\xaf\xf0\x90\x91\x89\xf0\x90\x90\xa8"));
 }
 
 void tst_QLocale::standaloneMonthName()
@@ -2191,11 +2222,11 @@ void tst_QLocale::uiLanguages()
 
     const QLocale en_US("en_US");
     QCOMPARE(en_US.uiLanguages().size(), 1);
-    QCOMPARE(en_US.uiLanguages().at(0), QLatin1String("en_US"));
+    QCOMPARE(en_US.uiLanguages().at(0), QLatin1String("en-US"));
 
     const QLocale ru_RU("ru_RU");
     QCOMPARE(ru_RU.uiLanguages().size(), 1);
-    QCOMPARE(ru_RU.uiLanguages().at(0), QLatin1String("ru_RU"));
+    QCOMPARE(ru_RU.uiLanguages().at(0), QLatin1String("ru-RU"));
 }
 
 void tst_QLocale::weekendDays()
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index ed66c57..fae88a3 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -46,19 +46,19 @@ Window::Window()
 
     localeCombo->addItem("System", QLocale::system());
 
-    int index = 0;
-    for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {
-        QLocale::Language lang = static_cast<QLocale::Language>(_lang);
-        QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);
-        for (int i = 0; i < countries.count(); ++i) {
-            QLocale::Country country = countries.at(i);
-            QString label = QLocale::languageToString(lang);
+    QStringList locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
+    foreach (const QString &name, locales) {
+        QLocale locale(name);
+        QString label = QLocale::languageToString(locale.language());
+        label += QLatin1Char('/');
+        if (locale.script() != QLocale::AnyScript) {
+            label += QLocale::scriptToString(locale.script());
             label += QLatin1Char('/');
-            label += QLocale::countryToString(country);
-            localeCombo->addItem(label, QLocale(lang, country));
-            ++index;
         }
+        label += QLocale::countryToString(locale.country());
+        localeCombo->addItem(label, locale);
     }
+
     connect(localeCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(localeChanged(int)));
 
@@ -102,15 +102,19 @@ void Window::systemLocaleChanged()
 {
     QLocale l = QLocale::system();
     QString lang = QLocale::languageToString(l.language());
+    QString script = QLocale::scriptToString(l.script());
     QString country = QLocale::countryToString(l.country());
-    localeCombo->setItemText(0, QString("System: %1/%2").arg(lang, country));
+    if (l.script() != QLocale::AnyScript)
+        localeCombo->setItemText(0, QString("System: %1-%2-%3").arg(lang, script, country));
+    else
+        localeCombo->setItemText(0, QString("System: %1-%2").arg(lang, country));
     emit localeChanged(0);
 }
 
 void Window::localeChanged(int idx)
 {
     QLocale locale = localeCombo->itemData(idx).toLocale();
-    localeName->setText(QString("Locale: %1").arg(locale.name()));
+    localeName->setText(QString("Locale: %1 (%2)").arg(locale.bcp47Name(), locale.name()));
     emit localeChanged(locale);
 }
 
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index c70cf18..fb0e5db 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -120,8 +120,10 @@ def generateLocaleInfo(path):
     if not country_code:
         return {}
 
-    # we do not support scripts and variants
-    if variant_code or script_code:
+    # we do not support variants
+    # ### actually there is only one locale with variant: en_US_POSIX
+    #     does anybody care about it at all?
+    if variant_code:
         return {}
 
     language_id = enumdata.languageCodeToId(language_code)
@@ -130,6 +132,14 @@ def generateLocaleInfo(path):
         return {}
     language = enumdata.language_list[language_id][0]
 
+    script_id = enumdata.scriptCodeToId(script_code)
+    if script_code == -1:
+        sys.stderr.write("unnknown script code \"" + script_code + "\"\n")
+        return {}
+    script = "AnyScript"
+    if script_id != -1:
+        script = enumdata.script_list[script_id][0]
+
     country_id = enumdata.countryCodeToId(country_code)
     country = ""
     if country_id != -1:
@@ -146,12 +156,14 @@ def generateLocaleInfo(path):
 
     result = {}
     result['language'] = language
+    result['script'] = script
     result['country'] = country
     result['language_code'] = language_code
     result['country_code'] = country_code
     result['script_code'] = script_code
     result['variant_code'] = variant_code
     result['language_id'] = language_id
+    result['script_id'] = script_id
     result['country_id'] = country_id
 
     supplementalPath = dir_name + "/../supplemental/supplementalData.xml"
@@ -511,7 +523,7 @@ for file in cldr_files:
         sys.stderr.write("skipping file \"" + file + "\"\n")
         continue
 
-    locale_database[(l['language_id'], l['country_id'], l['script_code'], l['variant_code'])] = l
+    locale_database[(l['language_id'], l['script_id'], l['country_id'], l['variant_code'])] = l
 
 integrateWeekData(cldr_dir+"/../supplemental/supplementalData.xml")
 locale_keys = locale_database.keys()
@@ -535,6 +547,16 @@ for id in enumdata.language_list:
     print "        </language>"
 print "    </languageList>"
 
+print "    <scriptList>"
+for id in enumdata.script_list:
+    l = enumdata.script_list[id]
+    print "        <script>"
+    print "            <name>" + l[0] + "</name>"
+    print "            <id>" + str(id) + "</id>"
+    print "            <code>" + l[1] + "</code>"
+    print "        </script>"
+print "    </scriptList>"
+
 print "    <countryList>"
 for id in enumdata.country_list:
     l = enumdata.country_list[id]
@@ -653,6 +675,7 @@ print "    <localeList>"
 print \
 "        <locale>\n\
             <language>C</language>\n\
+            <script>AnyScript</script>\n\
             <country>AnyCountry</country>\n\
             <decimal>46</decimal>\n\
             <group>44</group>\n\
@@ -701,8 +724,10 @@ for key in locale_keys:
 
     print "        <locale>"
     print "            <language>" + l['language']        + "</language>"
+    print "            <script>" + l['script']        + "</script>"
     print "            <country>"  + l['country']         + "</country>"
     print "            <languagecode>" + l['language_code']        + "</languagecode>"
+    print "            <scriptcode>" + l['script_code']        + "</scriptcode>"
     print "            <countrycode>"  + l['country_code']         + "</countrycode>"
     print "            <decimal>"  + ordStr(l['decimal']) + "</decimal>"
     print "            <group>"    + ordStr(l['group'])   + "</group>"
diff --git a/util/local_database/enumdata.py b/util/local_database/enumdata.py
index e957349..9e0d7d8 100644
--- a/util/local_database/enumdata.py
+++ b/util/local_database/enumdata.py
@@ -45,6 +45,7 @@
 # need to be *appended* to this list.
 
 language_list = {
+    0 : [ "AnyLanguage",          "  " ],
     1 : [ "C",                    "  " ],
     2 : [ "Abkhazian",            "ab" ],
     3 : [ "Afan",                 "om" ],
@@ -511,6 +512,19 @@ country_list = {
     246 : [ "LatinAmericaAndTheCaribbean",              "419" ]
 }
 
+script_list = {
+    0   : [ "AnyScript",         "" ],
+    1   : [ "Arabic",            "Arab" ],
+    2   : [ "Cyrillic",          "Cyrl" ],
+    3   : [ "Deseret",           "Dsrt" ],
+    4   : [ "Gurmukhi",          "Guru" ],
+    5   : [ "Simplified Han",    "Hans" ],
+    6   : [ "Traditional Han",   "Hant" ],
+    7   : [ "Latin",             "Latn" ],
+    8   : [ "Mongolian",         "Mong" ],
+    9   : [ "Tifinagh",          "Tfng" ]
+}
+
 def countryCodeToId(code):
     for country_id in country_list:
         if country_list[country_id][1] == code:
@@ -522,3 +536,9 @@ def languageCodeToId(code):
         if language_list[language_id][1] == code:
             return language_id
     return -1
+
+def scriptCodeToId(code):
+    for script_id in script_list:
+        if script_list[script_id][1] == code:
+            return script_id
+    return -1
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index 8b68984..b8e4e89 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -46,6 +46,12 @@ import tempfile
 import datetime
 import xml.dom.minidom
 
+class Error:
+    def __init__(self, msg):
+        self.msg = msg
+    def __str__(self):
+        return self.msg
+
 def check_static_char_array_length(name, array):
     # some compilers like VC6 doesn't allow static arrays more than 64K bytes size.
     size = reduce(lambda x, y: x+len(escapedString(y)), array, 0)
@@ -103,6 +109,20 @@ def loadLanguageMap(doc):
 
     return result
 
+def loadScriptMap(doc):
+    result = {}
+
+    script_list_elt = firstChildElt(doc.documentElement, "scriptList")
+    script_elt = firstChildElt(script_list_elt, "script")
+    while script_elt:
+        script_id = int(eltText(firstChildElt(script_elt, "id")))
+        script_name = eltText(firstChildElt(script_elt, "name"))
+        script_code = eltText(firstChildElt(script_elt, "code"))
+        result[script_id] = (script_name, script_code)
+        script_elt = nextSiblingElt(script_elt, "script")
+
+    return result
+
 def loadCountryMap(doc):
     result = {}
 
@@ -129,6 +149,15 @@ def loadDefaultMap(doc):
         elt = nextSiblingElt(elt, "defaultCountry");
     return result
 
+def fixedScriptName(name, dupes):
+    name = name.replace(" ", "")
+    if name[-6:] != "Script":
+        name = name + "Script";
+    if name in dupes:
+        sys.stderr.write("\n\n\nERROR: The script name '%s' is messy" % name)
+        sys.exit(1);
+    return name
+
 def fixedCountryName(name, dupes):
     if name in dupes:
         return name.replace(" ", "") + "Country"
@@ -150,6 +179,12 @@ def languageNameToId(name, language_map):
             return key
     return -1
 
+def scriptNameToId(name, script_map):
+    for key in script_map.keys():
+        if script_map[key][0] == name:
+            return key
+    return -1
+
 def countryNameToId(name, country_map):
     for key in country_map.keys():
         if country_map[key][0] == name:
@@ -202,6 +237,7 @@ def assertSingleChar(string):
 class Locale:
     def __init__(self, elt):
         self.language = eltText(firstChildElt(elt, "language"))
+        self.script = eltText(firstChildElt(elt, "script"))
         self.country = eltText(firstChildElt(elt, "country"))
         self.decimal = int(eltText(firstChildElt(elt, "decimal")))
         self.group = int(eltText(firstChildElt(elt, "group")))
@@ -244,7 +280,7 @@ class Locale:
         self.currencyFormat = eltText(firstChildElt(elt, "currencyFormat"))
         self.currencyNegativeFormat = eltText(firstChildElt(elt, "currencyNegativeFormat"))
 
-def loadLocaleMap(doc, language_map, country_map):
+def loadLocaleMap(doc, language_map, script_map, country_map):
     result = {}
 
     locale_list_elt = firstChildElt(doc.documentElement, "localeList")
@@ -253,11 +289,14 @@ def loadLocaleMap(doc, language_map, country_map):
         locale = Locale(locale_elt)
         language_id = languageNameToId(locale.language, language_map)
         if language_id == -1:
-            sys.stderr.write("Cannot find a language id for %s\n" % locale.language)
+            sys.stderr.write("Cannot find a language id for '%s'\n" % locale.language)
+        script_id = scriptNameToId(locale.script, script_map)
+        if script_id == -1:
+            sys.stderr.write("Cannot find a script id for '%s'\n" % locale.script)
         country_id = countryNameToId(locale.country, country_map)
         if country_id == -1:
-            sys.stderr.write("Cannot find a country id for %s\n" % locale.country)
-        result[(language_id, country_id)] = locale
+            sys.stderr.write("Cannot find a country id for '%s'\n" % locale.country)
+        result[(language_id, script_id, country_id)] = locale
 
         locale_elt = nextSiblingElt(locale_elt, "locale")
 
@@ -273,14 +312,17 @@ def compareLocaleKeys(key1, key2):
 
         if l1.language in compareLocaleKeys.default_map:
             default = compareLocaleKeys.default_map[l1.language]
-            if l1.country == default:
+            if l1.country == default and key1[1] == 0:
                 return -1
-            if l2.country == default:
+            if l2.country == default and key2[1] == 0:
                 return 1
+
+        if key1[1] != key2[1]:
+            return key1[1] - key2[1]
     else:
         return key1[0] - key2[0]
 
-    return key1[1] - key2[1]
+    return key1[2] - key2[2]
 
 
 def languageCount(language_id, locale_map):
@@ -290,8 +332,25 @@ def languageCount(language_id, locale_map):
             result += 1
     return result
 
+def unicode2hex(s):
+    lst = []
+    for x in s:
+        v = ord(x)
+        if v > 0xFFFF:
+            # make a surrogate pair
+            # copied from qchar.h
+            high = (v >> 10) + 0xd7c0
+            low = (v % 0x400 + 0xdc00)
+            lst.append(hex(high))
+            lst.append(hex(low))
+        else:
+            lst.append(hex(v))
+    return lst
+
 class StringDataToken:
     def __init__(self, index, length):
+        if index > 0xFFFF or length > 0xFFFF:
+            raise Error("Position exceeds ushort range: %d,%d " % (index, length))
         self.index = index
         self.length = length
     def __str__(self):
@@ -305,9 +364,9 @@ class StringData:
         if s in self.hash:
             return self.hash[s]
 
-        lst = map(lambda x: hex(ord(x)), s)
+        lst = unicode2hex(s)
         index = len(self.data)
-        if index >= 65535:
+        if index > 65535:
             print "\n\n\n#error Data index is too big!"
             sys.stderr.write ("\n\n\nERROR: index exceeds the uint16 range! index = %d\n" % index)
             sys.exit(1)
@@ -316,7 +375,12 @@ class StringData:
             print "\n\n\n#error Data is too big!"
             sys.stderr.write ("\n\n\nERROR: data size exceeds the uint16 range! size = %d\n" % size)
             sys.exit(1)
-        token = StringDataToken(index, size)
+        token = None
+        try:
+            token = StringDataToken(index, size)
+        except Error as e:
+            sys.stderr.write("\n\n\nERROR: %s: on data '%s'" % (e, s))
+            sys.exit(1)
         self.hash[s] = token
         self.data += lst
         return token
@@ -395,9 +459,10 @@ def main():
 
     doc = xml.dom.minidom.parse(localexml)
     language_map = loadLanguageMap(doc)
+    script_map = loadScriptMap(doc)
     country_map = loadCountryMap(doc)
     default_map = loadDefaultMap(doc)
-    locale_map = loadLocaleMap(doc, language_map, country_map)
+    locale_map = loadLocaleMap(doc, language_map, script_map, country_map)
     dupes = findDupes(language_map, country_map)
 
     cldr_version = eltText(firstChildElt(doc.documentElement, "version"))
@@ -416,7 +481,6 @@ def main():
 
     # Locale index
     data_temp_file.write("static const quint16 locale_index[] = {\n")
-    data_temp_file.write("     0, // unused\n")
     index = 0
     for key in language_map.keys():
         i = 0
@@ -443,7 +507,7 @@ def main():
 
     # Locale data
     data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
-    data_temp_file.write("//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
+    data_temp_file.write("//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
 
     locale_keys = locale_map.keys()
     compareLocaleKeys.default_map = default_map
@@ -452,9 +516,8 @@ def main():
 
     for key in locale_keys:
         l = locale_map[key]
-
-        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s\n" \
-                    % (key[0], key[1],
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s/%s\n" \
+                    % (key[0], key[1], key[2],
                         l.decimal,
                         l.group,
                         l.listDelim,
@@ -496,8 +559,9 @@ def main():
                         l.weekendStart,
                         l.weekendEnd,
                         l.language,
+                        l.script,
                         l.country))
-    data_temp_file.write("    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
     data_temp_file.write("};\n")
 
     data_temp_file.write("\n")
@@ -586,6 +650,8 @@ def main():
     data_temp_file.write("static const char language_name_list[] =\n")
     data_temp_file.write("\"Default\\0\"\n")
     for key in language_map.keys():
+        if key == 0:
+            continue
         data_temp_file.write("\"" + language_map[key][0] + "\\0\"\n")
     data_temp_file.write(";\n")
 
@@ -593,9 +659,11 @@ def main():
 
     # Language name index
     data_temp_file.write("static const quint16 language_name_index[] = {\n")
-    data_temp_file.write("     0, // Unused\n")
+    data_temp_file.write("     0, // AnyLanguage\n")
     index = 8
     for key in language_map.keys():
+        if key == 0:
+            continue
         language = language_map[key][0]
         data_temp_file.write("%6d, // %s\n" % (index, language))
         index += len(language) + 1
@@ -603,6 +671,31 @@ def main():
 
     data_temp_file.write("\n")
 
+    # Script name list
+    data_temp_file.write("static const char script_name_list[] =\n")
+    data_temp_file.write("\"Default\\0\"\n")
+    for key in script_map.keys():
+        if key == 0:
+            continue
+        data_temp_file.write("\"" + script_map[key][0] + "\\0\"\n")
+    data_temp_file.write(";\n")
+
+    data_temp_file.write("\n")
+
+    # Script name index
+    data_temp_file.write("static const quint16 script_name_index[] = {\n")
+    data_temp_file.write("     0, // AnyScript\n")
+    index = 8
+    for key in script_map.keys():
+        if key == 0:
+            continue
+        script = script_map[key][0]
+        data_temp_file.write("%6d, // %s\n" % (index, script))
+        index += len(script) + 1
+    data_temp_file.write("};\n")
+
+    data_temp_file.write("\n")
+
     # Country name list
     data_temp_file.write("static const char country_name_list[] =\n")
     data_temp_file.write("\"Default\\0\"\n")
@@ -630,7 +723,6 @@ def main():
 
     # Language code list
     data_temp_file.write("static const unsigned char language_code_list[] =\n")
-    data_temp_file.write("\"  \\0\" // Unused\n")
     for key in language_map.keys():
         code = language_map[key][1]
         if len(code) == 2:
@@ -640,6 +732,15 @@ def main():
 
     data_temp_file.write("\n")
 
+    # Script code list
+    data_temp_file.write("static const unsigned char script_code_list[] =\n")
+    for key in script_map.keys():
+        code = script_map[key][1]
+        for i in range(4 - len(code)):
+            code += "\\0"
+        data_temp_file.write("\"%2s\" // %s\n" % (code, script_map[key][0]))
+    data_temp_file.write(";\n")
+
     # Country code list
     data_temp_file.write("static const unsigned char country_code_list[] =\n")
     for key in country_map.keys():
@@ -691,6 +792,15 @@ def main():
 
     qlocaleh_temp_file.write("\n")
 
+    # Script enum
+    qlocaleh_temp_file.write("    enum Script {\n")
+    script = ""
+    for key in script_map.keys():
+        script = fixedScriptName(script_map[key][0], dupes)
+        qlocaleh_temp_file.write("        " + script + " = " + str(key) + ",\n")
+    qlocaleh_temp_file.write("        LastScript = " + script + "\n")
+    qlocaleh_temp_file.write("    };\n")
+
     # Country enum
     qlocaleh_temp_file.write("    enum Country {\n")
     country = ""
-- 
cgit v0.12


From 1d81a3041384072337063e5b61947693507ce311 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Feb 2011 20:43:01 +0100
Subject: Updated CLDR data for QLocale.

This is a temporary commit and meant to be removed before merging the branch
into Qt as we don't want to bloat the repository size by updating CLDR every
time we make a small change to QLocale, but do that only once when we are done.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 8217 ++++++++++++++++++------------------
 1 file changed, 4194 insertions(+), 4023 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index 706dde9..a13255d 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -75,7 +75,7 @@ static const int ImperialMeasurementSystemsCount =
 // GENERATED PART STARTS HERE
 
 /*
-    This part of the file was generated on 2011-02-23 from the
+    This part of the file was generated on 2011-03-02 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -86,7 +86,7 @@ static const int ImperialMeasurementSystemsCount =
 
 
 static const quint16 locale_index[] = {
-     0, // unused
+     0, // AnyLanguage
      0, // C
      0, // Abkhazian
      1, // Afan
@@ -100,537 +100,581 @@ static const quint16 locale_index[] = {
      0, // Aymara
     29, // Azerbaijani
      0, // Bashkir
-    31, // Basque
-    32, // Bengali
-    34, // Bhutani
+    34, // Basque
+    35, // Bengali
+    37, // Bhutani
      0, // Bihari
      0, // Bislama
-    35, // Breton
-    36, // Bulgarian
-    37, // Burmese
-    38, // Byelorussian
-    39, // Cambodian
-    40, // Catalan
-    41, // Chinese
+    38, // Breton
+    39, // Bulgarian
+    40, // Burmese
+    41, // Byelorussian
+    42, // Cambodian
+    43, // Catalan
+    44, // Chinese
      0, // Corsican
-    46, // Croatian
-    47, // Czech
-    48, // Danish
-    49, // Dutch
-    51, // English
+    56, // Croatian
+    57, // Czech
+    58, // Danish
+    59, // Dutch
+    61, // English
      0, // Esperanto
-    78, // Estonian
-    79, // Faroese
+    89, // Estonian
+    90, // Faroese
      0, // Fiji
-    80, // Finnish
-    81, // French
+    91, // Finnish
+    92, // French
      0, // Frisian
      0, // Gaelic
-   100, // Galician
-   101, // Georgian
-   102, // German
-   108, // Greek
-   110, // Greenlandic
+   111, // Galician
+   112, // Georgian
+   113, // German
+   119, // Greek
+   121, // Greenlandic
      0, // Guarani
-   111, // Gujarati
-   112, // Hausa
-   116, // Hebrew
-   117, // Hindi
-   118, // Hungarian
-   119, // Icelandic
-   120, // Indonesian
+   122, // Gujarati
+   123, // Hausa
+   132, // Hebrew
+   133, // Hindi
+   134, // Hungarian
+   135, // Icelandic
+   136, // Indonesian
      0, // Interlingua
      0, // Interlingue
      0, // Inuktitut
      0, // Inupiak
-   121, // Irish
-   122, // Italian
-   124, // Japanese
+   137, // Irish
+   138, // Italian
+   140, // Japanese
      0, // Javanese
-   125, // Kannada
+   141, // Kannada
      0, // Kashmiri
-   126, // Kazakh
-   127, // Kinyarwanda
-   128, // Kirghiz
-   129, // Korean
-   130, // Kurdish
+   142, // Kazakh
+   144, // Kinyarwanda
+   145, // Kirghiz
+   146, // Korean
+   147, // Kurdish
      0, // Kurundi
-   134, // Laothian
+   155, // Laothian
      0, // Latin
-   135, // Latvian
-   136, // Lingala
-   138, // Lithuanian
-   139, // Macedonian
-   140, // Malagasy
-   141, // Malay
-   143, // Malayalam
-   144, // Maltese
-   145, // Maori
-   146, // Marathi
+   156, // Latvian
+   157, // Lingala
+   159, // Lithuanian
+   160, // Macedonian
+   161, // Malagasy
+   162, // Malay
+   164, // Malayalam
+   165, // Maltese
+   166, // Maori
+   167, // Marathi
      0, // Moldavian
-   147, // Mongolian
+   168, // Mongolian
      0, // Nauru
-   149, // Nepali
-   151, // Norwegian
-   152, // Occitan
-   153, // Oriya
-   154, // Pashto
-   155, // Persian
-   157, // Polish
-   158, // Portuguese
-   162, // Punjabi
+   172, // Nepali
+   174, // Norwegian
+   175, // Occitan
+   176, // Oriya
+   177, // Pashto
+   178, // Persian
+   180, // Polish
+   181, // Portuguese
+   185, // Punjabi
      0, // Quechua
-   164, // RhaetoRomance
-   165, // Romanian
-   167, // Russian
+   189, // RhaetoRomance
+   190, // Romanian
+   192, // Russian
      0, // Samoan
-   170, // Sangho
-   171, // Sanskrit
-   172, // Serbian
-   177, // SerboCroatian
-   180, // Sesotho
-   182, // Setswana
-   183, // Shona
+   195, // Sangho
+   196, // Sanskrit
+   197, // Serbian
+   212, // SerboCroatian
+   215, // Sesotho
+   217, // Setswana
+   218, // Shona
      0, // Sindhi
-   184, // Singhalese
-   185, // Siswati
-   187, // Slovak
-   188, // Slovenian
-   189, // Somali
-   193, // Spanish
+   219, // Singhalese
+   220, // Siswati
+   222, // Slovak
+   223, // Slovenian
+   224, // Somali
+   228, // Spanish
      0, // Sundanese
-   215, // Swahili
-   217, // Swedish
+   250, // Swahili
+   252, // Swedish
      0, // Tagalog
-   219, // Tajik
-   220, // Tamil
-   222, // Tatar
-   223, // Telugu
-   224, // Thai
-   225, // Tibetan
-   227, // Tigrinya
-   229, // Tonga
-   230, // Tsonga
-   231, // Turkish
+   254, // Tajik
+   256, // Tamil
+   258, // Tatar
+   259, // Telugu
+   260, // Thai
+   261, // Tibetan
+   263, // Tigrinya
+   265, // Tonga
+   266, // Tsonga
+   267, // Turkish
      0, // Turkmen
      0, // Twi
-   232, // Uigur
-   233, // Ukrainian
-   234, // Urdu
-   236, // Uzbek
-   238, // Vietnamese
+   268, // Uigur
+   270, // Ukrainian
+   271, // Urdu
+   273, // Uzbek
+   278, // Vietnamese
      0, // Volapuk
-   239, // Welsh
-   240, // Wolof
-   241, // Xhosa
+   279, // Welsh
+   280, // Wolof
+   282, // Xhosa
      0, // Yiddish
-   242, // Yoruba
+   283, // Yoruba
      0, // Zhuang
-   243, // Zulu
-   244, // Nynorsk
-   245, // Bosnian
-   246, // Divehi
-   247, // Manx
-   248, // Cornish
-   249, // Akan
-   250, // Konkani
-   251, // Ga
-   252, // Igbo
-   253, // Kamba
-   254, // Syriac
-   255, // Blin
-   256, // Geez
-   258, // Koro
-   259, // Sidamo
-   260, // Atsam
-   261, // Tigre
-   262, // Jju
-   263, // Friulian
-   264, // Venda
-   265, // Ewe
-   267, // Walamo
-   268, // Hawaiian
-   269, // Tyap
-   270, // Chewa
-   271, // Filipino
-   272, // Swiss German
-   273, // Sichuan Yi
-   274, // Kpelle
-   276, // Low German
-   277, // South Ndebele
-   278, // Northern Sotho
-   279, // Northern Sami
-   281, // Taroko
-   282, // Gusii
-   283, // Taita
-   284, // Fulah
-   285, // Kikuyu
-   286, // Samburu
-   287, // Sena
-   288, // North Ndebele
-   289, // Rombo
-   290, // Tachelhit
-   291, // Kabyle
-   292, // Nyankole
-   293, // Bena
-   294, // Vunjo
-   295, // Bambara
-   296, // Embu
-   297, // Cherokee
-   298, // Morisyen
-   299, // Makonde
-   300, // Langi
-   301, // Ganda
-   302, // Bemba
-   303, // Kabuverdianu
-   304, // Meru
-   305, // Kalenjin
-   306, // Nama
-   307, // Machame
-   308, // Colognian
-   309, // Masai
-   311, // Soga
-   312, // Luyia
-   313, // Asu
-   314, // Teso
-   316, // Saho
-   317, // Koyra Chiini
-   318, // Rwa
-   319, // Luo
-   320, // Chiga
-   321, // Central Morocco Tamazight
-   322, // Koyraboro Senni
-   323, // Shambala
+   284, // Zulu
+   285, // Nynorsk
+   286, // Bosnian
+   287, // Divehi
+   288, // Manx
+   289, // Cornish
+   290, // Akan
+   291, // Konkani
+   292, // Ga
+   293, // Igbo
+   294, // Kamba
+   295, // Syriac
+   296, // Blin
+   297, // Geez
+   299, // Koro
+   300, // Sidamo
+   301, // Atsam
+   302, // Tigre
+   303, // Jju
+   304, // Friulian
+   305, // Venda
+   306, // Ewe
+   308, // Walamo
+   309, // Hawaiian
+   310, // Tyap
+   311, // Chewa
+   312, // Filipino
+   313, // Swiss German
+   314, // Sichuan Yi
+   315, // Kpelle
+   317, // Low German
+   318, // South Ndebele
+   319, // Northern Sotho
+   320, // Northern Sami
+   322, // Taroko
+   323, // Gusii
+   324, // Taita
+   325, // Fulah
+   326, // Kikuyu
+   327, // Samburu
+   328, // Sena
+   329, // North Ndebele
+   330, // Rombo
+   331, // Tachelhit
+   334, // Kabyle
+   335, // Nyankole
+   336, // Bena
+   337, // Vunjo
+   338, // Bambara
+   339, // Embu
+   340, // Cherokee
+   341, // Morisyen
+   342, // Makonde
+   343, // Langi
+   344, // Ganda
+   345, // Bemba
+   346, // Kabuverdianu
+   347, // Meru
+   348, // Kalenjin
+   349, // Nama
+   350, // Machame
+   351, // Colognian
+   352, // Masai
+   354, // Soga
+   355, // Luyia
+   356, // Asu
+   357, // Teso
+   359, // Saho
+   360, // Koyra Chiini
+   361, // Rwa
+   362, // Luo
+   363, // Chiga
+   364, // Central Morocco Tamazight
+   366, // Koyraboro Senni
+   367, // Shambala
      0 // trailing 0
 };
 
 static const QLocalePrivate locale_data[] = {
-//      lang   terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyCountry
-    {      3,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/Ethiopia
-    {      3,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/Kenya
-    {      4,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/Djibouti
-    {      4,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/Eritrea
-    {      4,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/Ethiopia
-    {      5,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/SouthAfrica
-    {      5,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/Namibia
-    {      6,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/Albania
-    {      7,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/Ethiopia
-    {      8,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/SaudiArabia
-    {      8,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/Algeria
-    {      8,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Bahrain
-    {      8,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Egypt
-    {      8,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/Iraq
-    {      8,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Jordan
-    {      8,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/Kuwait
-    {      8,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/Lebanon
-    {      8,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/LibyanArabJamahiriya
-    {      8,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Morocco
-    {      8,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/Oman
-    {      8,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/Qatar
-    {      8,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/Sudan
-    {      8,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/SyrianArabRepublic
-    {      8,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/Tunisia
-    {      8,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/UnitedArabEmirates
-    {      8,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/Yemen
-    {      9,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/Armenia
-    {     10,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/India
-    {     12,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Azerbaijan
-    {     12,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Iran
-    {     14,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1785,48 , 1833,93 , 1926,24 , 1785,48 , 1833,93 , 1926,24 , 1000,21 , 1021,68 , 798,14 , 1000,21 , 1021,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/Spain
-    {     15,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {66,68,84},  110,1 , 1457,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/Bangladesh
-    {     15,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 1950,90 , 1950,90 , 2040,33 , 1950,90 , 1950,90 , 2040,33 , 1089,37 , 1126,58 , 1184,18 , 1089,37 , 1126,58 , 1184,18 , 25,9 , 24,7 , {73,78,82},  111,4 , 1478,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/India
-    {     16,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2073,75 , 2148,205 , 1483,27 , 2073,75 , 2148,205 , 134,27 , 1202,34 , 1236,79 , 798,14 , 1202,34 , 1236,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  115,3 , 1497,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/Bhutan
-    {     19,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/France
-    {     20,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2353,59 , 2412,82 , 2494,24 , 2353,59 , 2412,82 , 2494,24 , 1315,21 , 1336,55 , 1391,14 , 1315,21 , 1336,55 , 1391,14 , 34,7 , 31,7 , {66,71,78},  118,3 , 1524,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/Bulgaria
-    {     21,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2518,43 , 2561,88 , 2649,24 , 2518,43 , 2561,88 , 2649,24 , 1405,25 , 1430,54 , 1484,14 , 1405,25 , 1430,54 , 1484,14 , 0,2 , 0,2 , {77,77,75},  121,1 , 1571,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/Myanmar
-    {     22,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2673,48 , 2721,99 , 2820,24 , 2673,48 , 2721,95 , 2816,24 , 1498,21 , 1519,56 , 1575,14 , 1498,21 , 1519,56 , 1575,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1589,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/Belarus
-    {     23,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2844,27 , 2871,71 , 1483,27 , 2840,27 , 2867,71 , 134,27 , 1589,19 , 1608,76 , 798,14 , 1589,19 , 1608,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  122,1 , 1612,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/Cambodia
-    {     24,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 2942,60 , 3002,82 , 3084,24 , 2938,93 , 3031,115 , 3146,24 , 1684,21 , 1705,60 , 1765,14 , 1779,28 , 1807,60 , 1867,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/Spain
-    {     25,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {67,78,89},  123,1 , 1643,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/China
-    {     25,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {72,75,68},  124,1 , 1653,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/HongKong
-    {     25,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {77,79,80},  125,4 , 1662,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Macau
-    {     25,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3108,38 , 3108,38 , 3146,39 , 3170,39 , 3170,39 , 3170,39 , 1881,21 , 1902,28 , 1930,14 , 1881,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {83,71,68},  129,2 , 1672,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Singapore
-    {     25,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3108,38 , 3108,38 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 1944,21 , 1902,28 , 1930,14 , 1944,21 , 1902,28 , 1930,14 , 60,2 , 60,2 , {84,87,68},  131,3 , 1683,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Taiwan
-    {     27,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3185,49 , 3234,94 , 3328,39 , 3209,49 , 3258,98 , 3356,39 , 1965,28 , 1993,58 , 2051,14 , 1965,28 , 1993,58 , 2051,14 , 0,2 , 0,2 , {72,82,75},  134,2 , 1693,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/Croatia
-    {     28,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3328,39 , 3367,82 , 3449,24 , 134,27 , 3395,84 , 3479,24 , 2065,21 , 2086,49 , 2135,14 , 2065,21 , 2086,49 , 2135,14 , 62,4 , 62,4 , {67,90,75},  136,2 , 1720,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/CzechRepublic
-    {     29,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3473,48 , 3521,84 , 134,24 , 3503,59 , 3562,84 , 320,24 , 2149,28 , 2177,51 , 2228,14 , 2149,28 , 2177,51 , 2228,14 , 66,4 , 66,4 , {68,75,75},  138,2 , 1739,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/Denmark
-    {     30,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/Netherlands
-    {     30,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3605,48 , 3653,88 , 134,24 , 3646,59 , 3705,88 , 320,24 , 2242,21 , 2263,59 , 2322,14 , 2242,21 , 2263,59 , 2322,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1781,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/Belgium
-    {     31,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/UnitedStates
-    {     31,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AmericanSamoa
-    {     31,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  124,1 , 1835,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Australia
-    {     31,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Belgium
-    {     31,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  124,1 , 1914,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Belize
-    {     31,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  140,1 , 1961,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Botswana
-    {     31,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2011,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Canada
-    {     31,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Guam
-    {     31,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  124,1 , 2064,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/HongKong
-    {     31,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 2120,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/India
-    {     31,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Ireland
-    {     31,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  124,1 , 2164,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Jamaica
-    {     31,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Malta
-    {     31,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/MarshallIslands
-    {     31,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 2217,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/Mauritius
-    {     31,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  124,1 , 2270,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/Namibia
-    {     31,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  124,1 , 2323,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/NewZealand
-    {     31,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/NorthernMarianaIslands
-    {     31,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  147,1 , 2385,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/Pakistan
-    {     31,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 2438,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Philippines
-    {     31,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  124,1 , 2480,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Singapore
-    {     31,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2536,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/SouthAfrica
-    {     31,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  124,1 , 2597,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/TrinidadAndTobago
-    {     31,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 2683,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/UnitedKingdom
-    {     31,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/UnitedStatesMinorOutlyingIslands
-    {     31,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/USVirginIslands
-    {     31,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  124,1 , 1800,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/Zimbabwe
-    {     33,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 3741,59 , 3800,91 , 3891,24 , 3793,59 , 3852,91 , 3943,24 , 2336,14 , 2350,63 , 2336,14 , 2336,14 , 2350,63 , 2336,14 , 70,14 , 70,16 , {69,69,75},  138,2 , 2757,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/Estonia
-    {     34,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 3915,48 , 3963,83 , 134,24 , 3967,48 , 4015,83 , 320,24 , 2413,28 , 2441,74 , 2515,14 , 2413,28 , 2441,74 , 2515,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 2798,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/FaroeIslands
-    {     36,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4046,69 , 4115,105 , 4220,24 , 4098,129 , 4098,129 , 4227,24 , 2529,21 , 2550,67 , 2617,14 , 2529,21 , 2631,81 , 2617,14 , 84,3 , 86,3 , {69,85,82},  109,1 , 2840,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/Finland
-    {     37,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/France
-    {     37,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Belgium
-    {     37,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Cameroon
-    {     37,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,65,68},  124,1 , 2916,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/Canada
-    {     37,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,65,70},  150,3 , 2860,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/CentralAfricanRepublic
-    {     37,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/IvoryCoast
-    {     37,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Guadeloupe
-    {     37,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {71,78,70},  156,3 , 3029,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Guinea
-    {     37,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Luxembourg
-    {     37,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3077,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Madagascar
-    {     37,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Mali
-    {     37,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Martinique
-    {     37,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Monaco
-    {     37,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Niger
-    {     37,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Reunion
-    {     37,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 2970,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/Senegal
-    {     37,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {67,72,70},  159,3 , 3131,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/Switzerland
-    {     37,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Saint Barthelemy
-    {     37,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4244,63 , 4307,85 , 134,24 , 4251,63 , 4314,85 , 320,24 , 2712,35 , 2747,52 , 2799,14 , 2712,35 , 2747,52 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1623,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/Saint Martin
-    {     40,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4392,48 , 4440,87 , 4527,24 , 4399,48 , 4447,87 , 4534,24 , 2813,28 , 2841,49 , 2890,14 , 2813,28 , 2841,49 , 2890,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/Spain
-    {     41,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4551,48 , 4599,99 , 4698,24 , 4558,48 , 4606,99 , 4705,24 , 2904,28 , 2932,62 , 2994,14 , 2904,28 , 2932,62 , 2994,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3176,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/Georgia
-    {     42,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Germany
-    {     42,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 4722,52 , 4857,83 , 134,24 , 4860,48 , 4908,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Austria
-    {     42,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3131,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Belgium
-    {     42,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/Liechtenstein
-    {     42,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {69,85,82},  109,1 , 3195,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/Luxembourg
-    {     42,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 4722,52 , 4774,83 , 134,24 , 4729,48 , 4777,83 , 320,24 , 3008,21 , 3029,60 , 3089,14 , 3103,28 , 3029,60 , 3089,14 , 87,5 , 89,6 , {67,72,70},  0,0 , 3214,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/Switzerland
-    {     43,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/Greece
-    {     43,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 4940,50 , 4990,115 , 5105,24 , 4991,50 , 5041,115 , 5156,24 , 3159,28 , 3187,55 , 3242,14 , 3159,28 , 3187,55 , 3242,14 , 92,4 , 95,4 , {69,85,82},  109,1 , 3255,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/Cyprus
-    {     44,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3473,48 , 5129,96 , 134,24 , 5180,48 , 5228,96 , 320,24 , 3256,28 , 3284,98 , 3382,14 , 3256,28 , 3284,98 , 3382,14 , 0,2 , 0,2 , {68,75,75},  138,2 , 3274,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/Greenland
-    {     46,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5225,67 , 5292,87 , 5379,31 , 5324,67 , 5391,87 , 5478,31 , 3396,32 , 3428,53 , 3481,19 , 3396,32 , 3428,53 , 3481,19 , 96,14 , 99,14 , {73,78,82},  162,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/India
-    {     47,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Ghana
-    {     47,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 3298,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Niger
-    {     47,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5410,48 , 5458,85 , 5543,24 , 5509,48 , 5557,85 , 5642,24 , 3500,21 , 3521,52 , 3573,14 , 3500,21 , 3521,52 , 3573,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 3334,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Nigeria
-    {     47,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5567,55 , 5622,99 , 5543,24 , 5666,55 , 5721,99 , 5642,24 , 3587,31 , 3618,57 , 3573,14 , 3587,31 , 3618,57 , 3573,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3346,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Sudan
-    {     48,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 5721,58 , 5779,72 , 1483,27 , 5820,48 , 5868,72 , 134,27 , 3675,46 , 3721,65 , 3786,14 , 3675,46 , 3721,65 , 3786,14 , 110,6 , 113,5 , {73,76,83},  168,1 , 3366,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/Israel
-    {     49,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 5851,75 , 5851,75 , 5926,30 , 5940,75 , 5940,75 , 6015,30 , 3800,38 , 3838,57 , 3895,19 , 3800,38 , 3838,57 , 3895,19 , 116,9 , 118,7 , {73,78,82},  169,3 , 3387,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/India
-    {     50,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 5956,64 , 6020,98 , 6118,25 , 6045,64 , 6109,98 , 6207,25 , 3914,19 , 3933,52 , 3985,17 , 3914,19 , 3933,52 , 3985,17 , 125,3 , 125,3 , {72,85,70},  172,2 , 3406,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/Hungary
-    {     51,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6143,48 , 6191,82 , 6273,24 , 6232,48 , 6280,82 , 6362,24 , 4002,28 , 4030,81 , 4111,14 , 4002,28 , 4030,81 , 4125,14 , 128,4 , 128,4 , {73,83,75},  138,2 , 3426,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/Iceland
-    {     52,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6297,48 , 6345,87 , 134,24 , 6386,48 , 6434,87 , 320,24 , 4139,28 , 4167,43 , 4210,14 , 4139,28 , 4167,43 , 4210,14 , 0,2 , 0,2 , {73,68,82},  174,2 , 3474,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/Indonesia
-    {     57,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6432,62 , 6494,107 , 6601,24 , 6521,62 , 6583,107 , 6690,24 , 4224,37 , 4261,75 , 4336,14 , 4224,37 , 4261,75 , 4336,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 3497,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/Ireland
-    {     58,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/Italy
-    {     58,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6625,48 , 6673,94 , 6767,24 , 6714,48 , 6762,94 , 6856,24 , 4350,28 , 4378,57 , 4435,14 , 4350,28 , 4449,57 , 4435,14 , 132,2 , 132,2 , {67,72,70},  0,0 , 3508,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/Switzerland
-    {     59,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3146,39 , 3146,39 , 1483,27 , 3170,39 , 3170,39 , 134,27 , 4506,14 , 4520,28 , 4506,14 , 4506,14 , 4520,28 , 4506,14 , 134,2 , 134,2 , {74,80,89},  123,1 , 3530,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/Japan
-    {     61,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 6791,86 , 6791,86 , 6877,31 , 6880,86 , 6880,86 , 6966,31 , 4548,28 , 4576,53 , 4629,19 , 4548,28 , 4576,53 , 4629,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/India
-    {     63,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 6908,61 , 6969,83 , 1483,27 , 6997,61 , 7058,83 , 134,27 , 4648,28 , 4676,54 , 798,14 , 4648,28 , 4676,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  178,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Kazakhstan
-    {     64,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7052,60 , 7112,101 , 1483,27 , 7141,60 , 7201,101 , 134,27 , 4730,35 , 4765,84 , 798,14 , 4730,35 , 4765,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  182,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/Rwanda
-    {     65,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  184,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/Kyrgyzstan
-    {     66,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7213,39 , 7213,39 , 7213,39 , 7302,39 , 7302,39 , 7302,39 , 4849,14 , 4863,28 , 4849,14 , 4849,14 , 4863,28 , 4849,14 , 138,2 , 138,2 , {75,82,87},  187,1 , 3540,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/RepublicOfKorea
-    {     67,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Iran
-    {     67,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 4891,42 , 4891,42 , 4933,14 , 4891,42 , 4891,42 , 4933,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Iraq
-    {     67,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {83,89,80},  188,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/SyrianArabRepublic
-    {     67,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7252,41 , 7293,51 , 7344,27 , 7341,41 , 7382,51 , 7433,27 , 4947,20 , 4967,39 , 5006,14 , 4947,20 , 4967,39 , 5006,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Turkey
-    {     69,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7371,63 , 7434,75 , 1483,27 , 7460,63 , 7523,75 , 134,27 , 5020,24 , 5044,57 , 798,14 , 5020,24 , 5044,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  193,1 , 3553,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/Lao
-    {     71,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7509,65 , 7574,101 , 134,24 , 7598,65 , 7663,101 , 320,24 , 5101,21 , 5122,72 , 5194,14 , 5101,21 , 5122,72 , 5194,14 , 140,14 , 140,11 , {76,86,76},  194,2 , 3563,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/Latvia
-    {     72,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  196,1 , 3583,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/DemocraticRepublicOfCongo
-    {     72,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 7675,39 , 7714,203 , 1483,27 , 7764,39 , 7803,203 , 134,27 , 5208,23 , 5231,98 , 798,14 , 5208,23 , 5231,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  197,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/PeoplesRepublicOfCongo
-    {     73,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 7917,69 , 7986,96 , 8082,24 , 8006,48 , 8054,96 , 8150,24 , 5329,17 , 5346,89 , 5435,14 , 5449,21 , 5346,89 , 5435,14 , 154,9 , 151,6 , {76,84,76},  201,2 , 3605,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/Lithuania
-    {     74,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8106,63 , 8169,85 , 8254,24 , 8174,63 , 8237,85 , 8322,24 , 5470,34 , 5504,54 , 1391,14 , 5470,34 , 5504,54 , 1391,14 , 163,10 , 157,8 , {77,75,68},  0,0 , 3659,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/Macedonia
-    {     75,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8278,48 , 8326,92 , 134,24 , 8346,48 , 8394,92 , 320,24 , 5558,34 , 5592,60 , 5652,14 , 5558,34 , 5592,60 , 5652,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3682,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/Madagascar
-    {     76,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  203,2 , 3695,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/Malaysia
-    {     76,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8418,49 , 8467,82 , 1483,27 , 8486,49 , 8535,82 , 134,27 , 5666,28 , 5694,43 , 798,14 , 5666,28 , 5694,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/BruneiDarussalam
-    {     77,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8549,66 , 8615,101 , 8716,31 , 8617,66 , 8683,101 , 8784,31 , 5737,47 , 5784,70 , 5854,22 , 5737,47 , 5784,70 , 5854,22 , 173,6 , 165,10 , {73,78,82},  205,2 , 3718,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/India
-    {     78,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 8747,48 , 8795,86 , 8881,24 , 8815,48 , 8863,86 , 8949,24 , 5876,28 , 5904,63 , 5967,14 , 5876,28 , 5904,63 , 5967,14 , 179,2 , 175,2 , {69,85,82},  109,1 , 3764,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/Malta
-    {     79,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 8905,83 , 8905,83 , 1483,27 , 8973,83 , 8973,83 , 134,27 , 5981,48 , 5981,48 , 798,14 , 5981,48 , 5981,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  207,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/NewZealand
-    {     80,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 8988,86 , 8988,86 , 9074,32 , 9056,86 , 9056,86 , 9142,32 , 6029,32 , 6061,53 , 3895,19 , 6029,32 , 6061,53 , 3895,19 , 136,2 , 136,2 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/India
-    {     82,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  210,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Mongolia
-    {     82,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9106,48 , 9154,66 , 1483,27 , 9174,48 , 9222,66 , 134,27 , 6114,21 , 6135,43 , 798,14 , 6114,21 , 6135,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/China
-    {     84,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9276,85 , 9361,27 , 9288,56 , 9344,85 , 9429,27 , 6178,33 , 6211,54 , 6265,14 , 6178,33 , 6211,54 , 6265,14 , 181,14 , 177,14 , {78,80,82},  214,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/Nepal
-    {     84,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9220,56 , 9388,80 , 9361,27 , 9288,56 , 9456,80 , 9429,27 , 6178,33 , 6279,54 , 6265,14 , 6178,33 , 6279,54 , 6265,14 , 116,9 , 118,7 , {73,78,82},  141,2 , 3775,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/India
-    {     85,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9468,59 , 9527,83 , 134,24 , 9536,59 , 9595,83 , 320,24 , 6333,28 , 2177,51 , 2228,14 , 6361,35 , 2177,51 , 2228,14 , 0,2 , 0,2 , {78,79,75},  138,2 , 3824,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/Norway
-    {     86,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9610,83 , 9610,83 , 1483,27 , 9678,83 , 9678,83 , 134,27 , 6396,57 , 6396,57 , 798,14 , 6396,57 , 6396,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 1513,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/France
-    {     87,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 9693,89 , 9693,89 , 9782,32 , 9761,89 , 9761,89 , 9850,32 , 6453,33 , 6486,54 , 6540,18 , 6453,33 , 6486,54 , 6540,18 , 136,2 , 136,2 , {73,78,82},  141,2 , 3868,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/India
-    {     88,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 9814,68 , 9814,68 , 1483,27 , 9882,68 , 9882,68 , 134,27 , 6558,49 , 6558,49 , 798,14 , 6558,49 , 6558,49 , 798,14 , 195,4 , 191,4 , {65,70,78},  218,1 , 3879,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/Afghanistan
-    {     89,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 9882,71 , 9953,70 , 10023,25 , 9950,71 , 10021,73 , 10094,25 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {73,82,82},  219,1 , 3892,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/Iran
-    {     89,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10048,63 , 9953,70 , 10111,24 , 10119,63 , 10182,68 , 10250,24 , 6558,49 , 6558,49 , 6607,14 , 6558,49 , 6558,49 , 6607,14 , 199,10 , 195,10 , {65,70,78},  218,1 , 3909,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/Afghanistan
-    {     90,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10135,48 , 10183,97 , 10280,24 , 10274,48 , 10322,99 , 10421,24 , 6621,34 , 6655,59 , 6714,14 , 6621,34 , 6655,59 , 6714,14 , 0,2 , 0,2 , {80,76,78},  220,2 , 3932,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/Poland
-    {     91,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10304,48 , 10352,89 , 134,24 , 10445,48 , 10493,89 , 320,24 , 6728,28 , 6756,79 , 6835,14 , 6728,28 , 6756,79 , 6835,14 , 209,17 , 205,18 , {69,85,82},  109,1 , 1894,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/Portugal
-    {     91,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {66,82,76},  222,2 , 3992,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/Brazil
-    {     91,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 4046,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/GuineaBissau
-    {     91,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10441,48 , 10489,89 , 134,24 , 10582,48 , 10630,89 , 320,24 , 6728,28 , 6849,79 , 6835,14 , 6728,28 , 6849,79 , 6835,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 4108,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/Mozambique
-    {     92,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10578,68 , 10578,68 , 10646,27 , 10719,68 , 10719,68 , 10787,27 , 6928,38 , 6966,55 , 7021,23 , 6928,38 , 6966,55 , 7021,23 , 226,5 , 223,4 , {73,78,82},  227,3 , 4180,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/India
-    {     92,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10673,67 , 10673,67 , 10646,27 , 10814,67 , 10814,67 , 10787,27 , 6928,38 , 7044,37 , 7021,23 , 6928,38 , 7044,37 , 7021,23 , 226,5 , 223,4 , {80,75,82},  230,1 , 4192,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Pakistan
-    {     94,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 10740,67 , 10807,92 , 10899,24 , 10881,67 , 10948,92 , 11040,24 , 7081,23 , 7104,56 , 7160,14 , 7081,23 , 7104,56 , 7160,14 , 136,2 , 227,2 , {67,72,70},  0,0 , 4205,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/Switzerland
-    {     95,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4225,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/Moldova
-    {     95,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 10923,60 , 10983,98 , 11081,24 , 11064,60 , 11124,98 , 11222,24 , 7174,21 , 7195,48 , 2799,14 , 7174,21 , 7195,48 , 2799,14 , 0,2 , 0,2 , {82,79,78},  231,3 , 4279,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/Romania
-    {     96,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {82,85,66},  234,4 , 4295,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/RussianFederation
-    {     96,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4384,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/Moldova
-    {     96,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11105,62 , 11167,80 , 11247,24 , 11246,63 , 11309,82 , 11391,24 , 7243,21 , 7264,62 , 7326,14 , 7243,21 , 7340,62 , 7326,14 , 0,2 , 0,2 , {85,65,72},  238,1 , 4405,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/Ukraine
-    {     98,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11271,48 , 11319,91 , 11410,24 , 11415,48 , 11463,91 , 11554,24 , 7402,28 , 7430,66 , 7496,14 , 7402,28 , 7430,66 , 7496,14 , 231,2 , 229,2 , {88,65,70},  197,4 , 4429,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/CentralAfricanRepublic
-    {     99,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  176,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/India
-    {    100,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/SerbiaAndMontenegro
-    {    100,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11434,48 , 11563,83 , 8254,24 , 11578,48 , 11707,83 , 8322,24 , 7604,28 , 7632,54 , 7590,14 , 7604,28 , 7632,54 , 7590,14 , 233,9 , 231,7 , {66,65,77},  239,3 , 4454,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/BosniaAndHerzegowina
-    {    100,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Yugoslavia
-    {    100,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {69,85,82},  109,1 , 4649,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Montenegro
-    {    100,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11434,48 , 11482,81 , 8254,24 , 11578,48 , 11626,81 , 8322,24 , 7510,28 , 7538,52 , 7590,14 , 7510,28 , 7538,52 , 7590,14 , 233,9 , 231,7 , {82,83,68},  242,4 , 4676,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Serbia
-    {    101,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/SerbiaAndMontenegro
-    {    101,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {66,65,77},  246,2 , 4747,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/BosniaAndHerzegowina
-    {    101,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11646,48 , 11694,81 , 11775,24 , 11790,48 , 11838,81 , 11919,24 , 7686,28 , 7714,54 , 2051,14 , 7686,28 , 7714,54 , 2051,14 , 242,9 , 238,7 , {0,0,0},  0,0 , 4454,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/Yugoslavia
-    {    102,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/Lesotho
-    {    102,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11799,48 , 11847,105 , 1483,27 , 11943,48 , 11991,105 , 134,27 , 7768,27 , 7795,61 , 798,14 , 7768,27 , 7795,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/SouthAfrica
-    {    103,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 11952,48 , 12000,117 , 1483,27 , 12096,48 , 12144,117 , 134,27 , 7856,27 , 7883,64 , 798,14 , 7856,27 , 7883,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/SouthAfrica
-    {    104,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12117,47 , 12164,100 , 12264,24 , 12261,47 , 12308,100 , 12408,24 , 7947,32 , 7979,55 , 8034,14 , 7947,32 , 7979,55 , 8034,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 4965,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/Zimbabwe
-    {    106,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12288,54 , 12342,92 , 12434,32 , 12432,54 , 12486,92 , 12578,32 , 8048,30 , 8078,62 , 8140,19 , 8048,30 , 8078,62 , 8140,19 , 251,5 , 245,4 , {76,75,82},  251,5 , 4987,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/SriLanka
-    {    107,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/SouthAfrica
-    {    107,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12466,48 , 12514,114 , 1483,27 , 12610,48 , 12658,114 , 134,27 , 8159,27 , 8186,68 , 798,14 , 8159,27 , 8186,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  256,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/Swaziland
-    {    108,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12628,48 , 12676,82 , 11775,24 , 12772,48 , 12820,89 , 11919,24 , 8254,21 , 8275,52 , 8327,14 , 8254,21 , 8275,52 , 8327,14 , 256,10 , 249,9 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/Slovakia
-    {    109,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11646,48 , 12758,86 , 11775,24 , 11790,48 , 12909,86 , 11919,24 , 8341,28 , 8369,52 , 8421,14 , 8341,28 , 8369,52 , 8421,14 , 62,4 , 258,4 , {69,85,82},  109,1 , 5006,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/Slovenia
-    {    110,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {83,79,83},  257,3 , 5034,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/Somalia
-    {    110,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {68,74,70},  5,3 , 5056,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/Djibouti
-    {    110,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {69,84,66},  0,2 , 5077,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/Ethiopia
-    {    110,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 12844,48 , 12892,189 , 13081,24 , 12995,48 , 13043,189 , 13232,24 , 8435,28 , 8463,47 , 8510,14 , 8435,28 , 8463,47 , 8510,14 , 266,3 , 262,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/Kenya
-    {    111,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {69,85,82},  109,1 , 1623,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Spain
-    {    111,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {65,82,83},  124,1 , 5099,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/Argentina
-    {    111,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {66,79,66},  260,2 , 5150,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Bolivia
-    {    111,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,76,80},  124,1 , 5185,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/Chile
-    {    111,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,79,80},  124,1 , 5230,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/Colombia
-    {    111,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {67,82,67},  262,1 , 5284,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/CostaRica
-    {    111,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {68,79,80},  263,3 , 5351,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/DominicanRepublic
-    {    111,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/Ecuador
-    {    111,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  248,3 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/ElSalvador
-    {    111,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {88,65,70},  197,4 , 5475,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/EquatorialGuinea
-    {    111,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {71,84,81},  266,1 , 5497,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Guatemala
-    {    111,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {72,78,76},  267,1 , 5567,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Honduras
-    {    111,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {77,88,78},  124,1 , 5627,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Mexico
-    {    111,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {78,73,79},  268,2 , 5675,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Nicaragua
-    {    111,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,65,66},  270,3 , 5756,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Panama
-    {    111,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,89,71},  273,1 , 5810,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/Paraguay
-    {    111,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {80,69,78},  274,3 , 5871,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/Peru
-    {    111,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/PuertoRico
-    {    111,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,83,68},  124,1 , 5405,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/UnitedStates
-    {    111,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {85,89,85},  124,1 , 5933,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/Uruguay
-    {    111,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {86,69,70},  277,5 , 5981,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/Venezuela
-    {    111,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13105,48 , 13153,89 , 13242,24 , 13256,48 , 13304,89 , 13393,24 , 8524,28 , 8552,53 , 2799,14 , 8524,28 , 8552,53 , 2799,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4454,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/LatinAmericaAndTheCaribbean
-    {    113,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {75,69,83},  2,3 , 6067,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/Kenya
-    {    113,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 13314,84 , 134,24 , 13417,48 , 13465,84 , 320,24 , 8605,22 , 8627,60 , 8687,14 , 8605,22 , 8627,60 , 8687,14 , 269,7 , 265,7 , {84,90,83},  282,3 , 6091,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/Tanzania
-    {    114,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {83,69,75},  138,2 , 6118,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/Sweden
-    {    114,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3473,48 , 13398,86 , 134,24 , 5180,48 , 13549,86 , 320,24 , 8701,29 , 8730,50 , 2228,14 , 8701,29 , 8730,50 , 2228,14 , 276,2 , 272,2 , {69,85,82},  109,1 , 6163,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/Finland
-    {    116,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 13532,71 , 1483,27 , 13635,48 , 13683,71 , 134,27 , 8780,28 , 8808,55 , 798,14 , 8780,28 , 8808,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  184,3 , 6182,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Tajikistan
-    {    117,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {73,78,82},  285,2 , 6195,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/India
-    {    117,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13603,58 , 13661,88 , 13749,31 , 13754,58 , 13812,88 , 13900,31 , 8863,20 , 8883,49 , 8863,20 , 8863,20 , 8883,49 , 8863,20 , 136,2 , 136,2 , {76,75,82},  287,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/SriLanka
-    {    118,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/RussianFederation
-    {    119,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 13780,86 , 13780,86 , 13866,30 , 13931,86 , 13931,86 , 14017,30 , 8932,32 , 8964,60 , 9024,18 , 8932,32 , 8964,60 , 9024,18 , 278,1 , 274,2 , {73,78,82},  291,3 , 6208,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/India
-    {    120,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 13896,63 , 13959,98 , 13896,63 , 14047,63 , 14110,98 , 14208,24 , 9042,23 , 9065,68 , 9133,14 , 9042,23 , 9065,68 , 9133,14 , 279,10 , 276,10 , {84,72,66},  294,1 , 6221,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/Thailand
-    {    121,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {67,78,89},  211,3 , 6234,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/China
-    {    121,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14057,63 , 14120,158 , 1483,27 , 14232,63 , 14295,158 , 134,27 , 9147,49 , 9196,77 , 9273,21 , 9147,49 , 9196,77 , 9273,21 , 289,7 , 286,8 , {73,78,82},  141,2 , 6247,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/India
-    {    122,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14278,46 , 14324,54 , 1034,24 , 14453,46 , 14499,54 , 1061,24 , 9294,29 , 9294,29 , 9323,14 , 9294,29 , 9294,29 , 9323,14 , 296,7 , 294,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/Eritrea
-    {    122,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9337,29 , 9337,29 , 9323,14 , 9337,29 , 9337,29 , 9323,14 , 296,7 , 294,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/Ethiopia
-    {    123,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14378,51 , 14429,87 , 14516,24 , 14553,51 , 14604,87 , 14691,24 , 9366,29 , 9395,60 , 9455,14 , 9366,29 , 9395,60 , 9455,14 , 0,2 , 0,2 , {84,79,80},  295,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/Tonga
-    {    124,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14540,48 , 14588,122 , 1483,27 , 14715,48 , 14763,122 , 134,27 , 9469,27 , 9496,72 , 798,14 , 9469,27 , 9496,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/SouthAfrica
-    {    125,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 14710,48 , 14758,75 , 14833,24 , 14885,48 , 14933,75 , 15008,24 , 9568,28 , 9596,54 , 9650,14 , 9568,28 , 9596,54 , 9650,14 , 0,2 , 0,2 , {84,82,89},  191,2 , 6269,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/Turkey
-    {    128,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/China
-    {    129,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 14857,48 , 14905,95 , 15000,24 , 15032,67 , 15099,87 , 15186,24 , 9664,21 , 9685,56 , 9741,14 , 9664,21 , 9685,56 , 9741,14 , 303,2 , 301,2 , {85,65,72},  238,1 , 6287,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/Ukraine
-    {    130,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {73,78,82},  141,2 , 6336,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/India
-    {    130,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15024,67 , 15024,67 , 10111,24 , 15210,67 , 15210,67 , 10250,24 , 9755,36 , 9755,36 , 9791,14 , 9755,36 , 9755,36 , 9791,14 , 0,2 , 0,2 , {80,75,82},  297,4 , 6354,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/Pakistan
-    {    131,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13484,48 , 15091,115 , 11247,24 , 13635,48 , 15277,115 , 11391,24 , 9805,28 , 9833,53 , 9886,14 , 9805,28 , 9833,53 , 9886,14 , 0,2 , 0,2 , {85,90,83},  301,3 , 6375,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Uzbekistan
-    {    131,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15206,48 , 15254,68 , 11247,24 , 15392,48 , 10182,68 , 11391,24 , 9900,21 , 6558,49 , 9886,14 , 9900,21 , 6558,49 , 9886,14 , 0,2 , 0,2 , {65,70,78},  304,2 , 6396,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Afghanistan
-    {    132,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15322,75 , 15397,130 , 1483,27 , 15440,75 , 15515,130 , 134,27 , 9921,33 , 9954,55 , 10009,21 , 9921,33 , 9954,55 , 10009,21 , 305,2 , 303,2 , {86,78,68},  306,1 , 6409,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/VietNam
-    {    134,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15527,53 , 15580,87 , 15667,24 , 15645,62 , 15707,86 , 15793,24 , 10030,29 , 10059,77 , 10136,14 , 10150,30 , 10059,77 , 10136,14 , 0,2 , 0,2 , {71,66,80},  149,1 , 6420,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/UnitedKingdom
-    {    135,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Senegal
-    {    136,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 15691,48 , 15739,91 , 1483,27 , 15817,48 , 15865,91 , 134,27 , 10180,28 , 10208,61 , 798,14 , 10180,28 , 10208,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/SouthAfrica
-    {    138,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 15830,73 , 15903,121 , 1483,27 , 15956,73 , 16029,121 , 134,27 , 10269,44 , 10313,69 , 798,14 , 10269,44 , 10313,69 , 798,14 , 307,5 , 305,5 , {78,71,78},  167,1 , 6448,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/Nigeria
-    {    140,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16024,48 , 16072,104 , 134,24 , 16150,48 , 16198,90 , 320,24 , 10382,28 , 10410,68 , 10478,14 , 10382,28 , 10410,68 , 10478,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/SouthAfrica
-    {    141,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 3915,48 , 9527,83 , 134,24 , 3967,48 , 9595,83 , 320,24 , 10492,28 , 10520,51 , 2228,14 , 10492,28 , 10520,51 , 2228,14 , 312,9 , 310,11 , {78,79,75},  138,2 , 6482,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/Norway
-    {    142,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16176,48 , 16224,83 , 1483,27 , 16288,48 , 16336,83 , 134,27 , 10571,28 , 10599,58 , 798,14 , 10571,28 , 10599,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  246,2 , 6524,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/BosniaAndHerzegowina
-    {    143,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  307,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/Maldives
-    {    144,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16307,102 , 16409,140 , 1483,27 , 16419,102 , 16521,140 , 134,27 , 10657,30 , 10687,57 , 798,14 , 10657,30 , 10687,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/UnitedKingdom
-    {    145,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16549,46 , 16595,124 , 1483,27 , 16661,46 , 16707,124 , 134,27 , 10744,28 , 10772,60 , 798,14 , 10744,28 , 10772,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  149,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/UnitedKingdom
-    {    146,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16719,48 , 16767,192 , 1483,27 , 16831,48 , 16879,192 , 134,27 , 10832,28 , 10860,49 , 10909,14 , 10832,28 , 10860,49 , 10909,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/Ghana
-    {    147,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 16959,87 , 16959,87 , 1483,27 , 17071,87 , 17071,87 , 134,27 , 6029,32 , 10923,55 , 798,14 , 6029,32 , 10923,55 , 798,14 , 323,5 , 323,5 , {73,78,82},  176,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/India
-    {    148,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17046,48 , 17094,94 , 1483,27 , 17158,48 , 17206,94 , 134,27 , 10978,26 , 11004,34 , 798,14 , 10978,26 , 11004,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  164,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/Ghana
-    {    149,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17188,48 , 17236,86 , 1483,27 , 17300,48 , 17348,86 , 134,27 , 11038,29 , 11067,57 , 798,14 , 11038,29 , 11067,57 , 798,14 , 328,4 , 328,4 , {78,71,78},  167,1 , 6550,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/Nigeria
-    {    150,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17322,48 , 17370,189 , 17559,24 , 17434,48 , 17482,189 , 17671,24 , 11124,28 , 11152,74 , 11226,14 , 11124,28 , 11152,74 , 11226,14 , 332,9 , 332,7 , {75,69,83},  2,3 , 6562,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/Kenya
-    {    151,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 17583,65 , 17583,65 , 1483,27 , 17695,65 , 17695,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/SyrianArabRepublic
-    {    152,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 17648,47 , 17695,77 , 17772,24 , 17760,47 , 17807,77 , 17884,24 , 11240,26 , 11266,43 , 11309,14 , 11240,26 , 11266,43 , 11309,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/Eritrea
-    {    153,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/Eritrea
-    {    153,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 17796,49 , 17796,49 , 17845,24 , 17908,49 , 17908,49 , 17957,24 , 11323,29 , 11323,29 , 11352,14 , 11323,29 , 11323,29 , 11352,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/Ethiopia
-    {    154,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 17869,48 , 17917,124 , 1483,27 , 17981,48 , 18029,124 , 134,27 , 11366,28 , 11394,54 , 798,14 , 11366,28 , 11394,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/IvoryCoast
-    {    155,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11448,28 , 11476,51 , 11527,14 , 11448,28 , 11476,51 , 11527,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/Ethiopia
-    {    156,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18041,59 , 18100,129 , 1483,27 , 18153,59 , 18212,129 , 134,27 , 11541,35 , 11576,87 , 798,14 , 11541,35 , 11576,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6585,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/Nigeria
-    {    157,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11663,27 , 11690,41 , 11731,14 , 11663,27 , 11690,41 , 11731,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/Eritrea
-    {    158,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18229,57 , 18286,178 , 1483,27 , 18341,57 , 18398,178 , 134,27 , 11745,28 , 11773,44 , 798,14 , 11745,28 , 11773,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6596,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/Nigeria
-    {    159,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18464,48 , 18512,77 , 18589,24 , 18576,48 , 18624,77 , 18701,24 , 11817,28 , 11845,50 , 2799,14 , 11817,28 , 11845,50 , 2799,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/Italy
-    {    160,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 18613,48 , 18661,111 , 1483,27 , 18725,48 , 18773,111 , 134,27 , 11895,27 , 11922,70 , 798,14 , 11895,27 , 11922,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/SouthAfrica
-    {    161,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {71,72,83},  164,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/Ghana
-    {    161,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 18772,48 , 18820,87 , 18907,24 , 18884,48 , 18932,87 , 19019,24 , 11992,32 , 12024,44 , 12068,14 , 11992,32 , 12024,44 , 12068,14 , 321,2 , 321,2 , {88,79,70},  153,3 , 6610,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/Togo
-    {    162,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12082,27 , 12082,27 , 12109,14 , 12082,27 , 12082,27 , 12109,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/Ethiopia
-    {    163,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 18931,59 , 18990,95 , 1483,27 , 19043,59 , 19102,95 , 134,27 , 12123,21 , 12144,57 , 798,14 , 12123,21 , 12144,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/UnitedStates
-    {    164,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19085,48 , 19133,153 , 1483,27 , 19197,48 , 19245,153 , 134,27 , 12201,28 , 12229,42 , 798,14 , 12201,28 , 12229,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  167,1 , 6621,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/Nigeria
-    {    165,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19286,48 , 19334,91 , 1483,27 , 19398,48 , 19446,91 , 134,27 , 12271,28 , 12299,67 , 798,14 , 12271,28 , 12299,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6632,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/Malawi
-    {    166,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19425,48 , 19473,88 , 19561,24 , 19537,48 , 19585,88 , 19673,24 , 12366,28 , 12394,55 , 12449,14 , 12463,28 , 12394,55 , 12449,14 , 0,2 , 0,2 , {80,72,80},  148,1 , 6654,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/Philippines
-    {    167,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 19585,48 , 19633,86 , 134,24 , 4729,48 , 19697,86 , 320,24 , 12491,28 , 12519,63 , 3089,14 , 12491,28 , 12519,63 , 3089,14 , 87,5 , 339,4 , {67,72,70},  0,0 , 6676,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/Switzerland
-    {    168,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 19719,38 , 1483,27 , 134,27 , 19783,38 , 134,27 , 12582,21 , 12603,28 , 12631,14 , 12582,21 , 12603,28 , 12631,14 , 341,2 , 343,2 , {67,78,89},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/China
-    {    169,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  309,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/Guinea
-    {    169,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  124,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/Liberia
-    {    170,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/Germany
-    {    171,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19757,48 , 19805,100 , 1483,27 , 19821,48 , 19869,100 , 134,27 , 12645,27 , 12672,66 , 798,14 , 12645,27 , 12672,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/SouthAfrica
-    {    172,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19905,48 , 19953,94 , 1483,27 , 19969,48 , 20017,94 , 134,27 , 12738,27 , 12765,63 , 798,14 , 12738,27 , 12765,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/SouthAfrica
-    {    173,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20047,85 , 20132,145 , 20277,24 , 20111,85 , 20196,145 , 20341,24 , 12828,33 , 12861,65 , 12926,14 , 12828,33 , 12861,65 , 12926,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 6715,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/Finland
-    {    173,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20301,59 , 20132,145 , 20277,24 , 20365,59 , 20196,145 , 20341,24 , 12828,33 , 12940,75 , 13015,14 , 12828,33 , 12940,75 , 13015,14 , 0,2 , 0,2 , {78,79,75},  311,3 , 6738,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/Norway
-    {    174,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20360,48 , 20408,142 , 20550,24 , 20424,48 , 20472,142 , 20614,24 , 13029,28 , 13057,172 , 13229,14 , 13029,28 , 13057,172 , 13229,14 , 0,2 , 0,2 , {84,87,68},  131,3 , 6759,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/Taiwan
-    {    175,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20574,48 , 20622,88 , 20710,24 , 20638,48 , 20686,88 , 20774,24 , 13243,28 , 13271,62 , 13333,14 , 13243,28 , 13271,62 , 13333,14 , 343,5 , 345,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/Kenya
-    {    176,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 20734,48 , 20782,221 , 21003,24 , 20798,48 , 20846,221 , 21067,24 , 13347,28 , 13375,106 , 13481,14 , 13347,28 , 13375,106 , 13481,14 , 348,10 , 355,10 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/Kenya
-    {    177,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21027,48 , 21075,77 , 21152,24 , 21091,48 , 21139,77 , 21216,24 , 13495,28 , 13523,59 , 13582,14 , 13495,28 , 13523,59 , 13582,14 , 358,6 , 365,7 , {88,79,70},  153,3 , 6801,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/Senegal
-    {    178,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21176,48 , 21224,185 , 21409,24 , 21240,48 , 21288,185 , 21473,24 , 13596,28 , 13624,63 , 13687,14 , 13596,28 , 13624,63 , 13687,14 , 364,6 , 372,8 , {75,69,83},  2,3 , 6827,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/Kenya
-    {    179,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21433,48 , 21481,173 , 21654,24 , 21497,48 , 21545,173 , 21718,24 , 13701,28 , 13729,105 , 13834,14 , 13701,28 , 13729,105 , 13834,14 , 370,7 , 380,5 , {75,69,83},  2,3 , 6850,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/Kenya
-    {    180,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 21678,48 , 21726,88 , 134,24 , 21742,48 , 21790,88 , 320,24 , 13848,28 , 13876,55 , 13931,14 , 13848,28 , 13876,55 , 13931,14 , 0,2 , 0,2 , {77,90,78},  224,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/Mozambique
-    {    181,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21814,48 , 21862,112 , 21974,24 , 21878,48 , 21926,112 , 22038,24 , 13945,28 , 13973,50 , 14023,14 , 13945,28 , 13973,50 , 14023,14 , 0,2 , 0,2 , {85,83,68},  248,3 , 6875,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/Zimbabwe
-    {    182,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 21998,39 , 22037,194 , 22231,24 , 22062,39 , 22101,194 , 22295,24 , 14037,28 , 14065,65 , 14130,14 , 14037,28 , 14065,65 , 14130,14 , 377,8 , 385,7 , {84,90,83},  282,3 , 6899,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/Tanzania
-    {    183,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22255,48 , 22303,81 , 22384,24 , 22319,48 , 22367,81 , 22448,24 , 14144,30 , 14174,48 , 798,14 , 14144,30 , 14174,48 , 798,14 , 385,6 , 392,8 , {77,65,68},  0,0 , 6924,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Morocco
-    {    184,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22408,48 , 22456,84 , 22540,24 , 22472,48 , 22520,84 , 22604,24 , 14222,30 , 14252,51 , 14303,14 , 14222,30 , 14252,51 , 14303,14 , 391,7 , 400,9 , {68,90,68},  314,2 , 6945,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/Algeria
-    {    185,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/Uganda
-    {    186,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22764,48 , 22812,254 , 23066,24 , 22828,48 , 22876,254 , 23130,24 , 14433,28 , 14461,82 , 14543,14 , 14433,28 , 14461,82 , 14543,14 , 398,7 , 409,7 , {84,90,83},  282,3 , 6992,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/Tanzania
-    {    187,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/Tanzania
-    {    188,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23177,47 , 23224,92 , 23316,24 , 23241,47 , 23288,92 , 23380,24 , 14661,28 , 14689,44 , 14733,14 , 14661,28 , 14689,44 , 14733,14 , 0,2 , 0,2 , {88,79,70},  153,3 , 7048,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/Mali
-    {    189,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,207 , 23595,24 , 23404,48 , 23452,207 , 23659,24 , 14747,28 , 14775,64 , 14839,14 , 14747,28 , 14775,64 , 14839,14 , 410,2 , 425,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/Kenya
-    {    190,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 23619,36 , 23655,58 , 23713,24 , 23683,36 , 23719,58 , 23777,24 , 14853,28 , 14881,49 , 14930,14 , 14853,28 , 14881,49 , 14930,14 , 412,3 , 427,6 , {85,83,68},  124,1 , 7072,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/UnitedStates
-    {    191,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 23737,47 , 23784,68 , 23852,24 , 23801,47 , 23848,68 , 23916,24 , 14944,27 , 14971,48 , 15019,14 , 14944,27 , 14971,48 , 15019,14 , 0,2 , 0,2 , {77,85,82},  143,4 , 7091,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/Mauritius
-    {    192,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23876,264 , 134,24 , 13417,48 , 23940,264 , 320,24 , 15033,28 , 15061,133 , 14130,14 , 15033,28 , 15061,133 , 14130,14 , 415,4 , 433,5 , {84,90,83},  282,3 , 7021,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/Tanzania
-    {    193,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24140,83 , 24223,111 , 24334,24 , 24204,83 , 24287,111 , 24398,24 , 15194,36 , 15230,63 , 15293,14 , 15194,36 , 15230,63 , 15293,14 , 419,3 , 438,3 , {84,90,83},  282,3 , 7112,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/Tanzania
-    {    194,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 15307,28 , 15335,66 , 15401,14 , 15307,28 , 15335,66 , 15401,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 7141,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/Uganda
-    {    195,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 24503,48 , 24551,83 , 24634,24 , 24567,48 , 24615,83 , 24698,24 , 15415,80 , 15415,80 , 798,14 , 15415,80 , 15415,80 , 798,14 , 422,8 , 441,7 , {90,77,75},  319,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/Zambia
-    {    196,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 24658,48 , 24706,86 , 134,24 , 24722,48 , 24770,86 , 320,24 , 15495,28 , 15523,73 , 15596,14 , 15495,28 , 15523,73 , 15596,14 , 136,2 , 136,2 , {67,86,69},  321,3 , 7167,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/CapeVerde
-    {    197,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24792,48 , 24840,86 , 24926,24 , 24856,48 , 24904,86 , 24990,24 , 15610,28 , 15638,51 , 15689,14 , 15610,28 , 15638,51 , 15689,14 , 430,2 , 448,2 , {75,69,83},  2,3 , 6777,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/Kenya
-    {    198,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24950,48 , 24998,111 , 25109,24 , 25014,48 , 25062,111 , 25173,24 , 15703,28 , 15731,93 , 15824,14 , 15703,28 , 15731,93 , 15824,14 , 432,4 , 450,4 , {75,69,83},  2,3 , 7192,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/Kenya
-    {    199,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25133,136 , 134,24 , 0,48 , 25197,136 , 320,24 , 15838,23 , 15861,92 , 15953,14 , 15838,23 , 15861,92 , 15953,14 , 436,7 , 454,5 , {78,65,68},  12,2 , 7218,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/Namibia
-    {    200,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/Tanzania
-    {    201,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25269,59 , 25328,87 , 134,24 , 25333,59 , 25392,87 , 320,24 , 15967,28 , 15995,72 , 3089,14 , 15967,28 , 15995,72 , 3089,14 , 0,2 , 0,2 , {69,85,82},  109,1 , 3497,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/Germany
-    {    202,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {75,69,83},  2,3 , 7240,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/Kenya
-    {    202,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25415,51 , 25466,132 , 1483,27 , 25479,51 , 25530,132 , 134,27 , 14557,28 , 16067,58 , 14130,14 , 14557,28 , 16067,58 , 14130,14 , 443,9 , 459,6 , {84,90,83},  282,3 , 7265,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/Tanzania
-    {    203,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24358,48 , 24406,97 , 134,24 , 24422,48 , 24470,97 , 320,24 , 16125,35 , 16160,65 , 16225,14 , 16125,35 , 16160,65 , 16225,14 , 452,6 , 465,6 , {85,71,88},  316,3 , 7141,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/Uganda
-    {    204,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25598,48 , 13314,84 , 134,24 , 25662,48 , 13465,84 , 320,24 , 16239,21 , 16260,75 , 85,14 , 16239,21 , 16260,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7293,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/Kenya
-    {    205,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25646,48 , 13314,84 , 134,24 , 25710,48 , 13465,84 , 320,24 , 16335,28 , 8627,60 , 14647,14 , 16335,28 , 8627,60 , 14647,14 , 458,9 , 471,8 , {84,90,83},  282,3 , 7316,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/Tanzania
-    {    206,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {75,69,83},  2,3 , 7344,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/Kenya
-    {    206,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25694,48 , 25742,94 , 25836,24 , 25758,48 , 25806,94 , 25900,24 , 16363,28 , 16391,69 , 16460,14 , 16363,28 , 16391,69 , 16460,14 , 467,9 , 479,6 , {85,71,88},  316,3 , 7371,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/Uganda
-    {    207,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16474,28 , 16502,56 , 16558,14 , 16474,28 , 16502,56 , 16558,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/Eritrea
-    {    208,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16572,28 , 16600,53 , 16653,14 , 16572,28 , 16600,53 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/Mali
-    {    209,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 23090,87 , 134,24 , 13417,48 , 23154,87 , 320,24 , 14557,28 , 14585,62 , 14647,14 , 14557,28 , 14585,62 , 14647,14 , 405,5 , 416,9 , {84,90,83},  282,3 , 7021,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/Tanzania
-    {    210,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26018,48 , 26066,186 , 26252,24 , 26082,48 , 26130,186 , 26316,24 , 16667,28 , 16695,69 , 16764,14 , 16667,28 , 16695,69 , 16764,14 , 482,2 , 491,2 , {75,69,83},  2,3 , 7422,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/Kenya
-    {    211,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 22564,48 , 22612,152 , 134,24 , 22628,48 , 22676,152 , 320,24 , 14317,28 , 14345,74 , 14419,14 , 14317,28 , 14345,74 , 14419,14 , 0,2 , 0,2 , {85,71,88},  316,3 , 6966,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/Uganda
-    {    212,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26276,48 , 26324,86 , 26410,24 , 26340,48 , 26388,86 , 26474,24 , 16778,28 , 16806,48 , 16854,14 , 16778,28 , 16806,48 , 16854,14 , 484,9 , 493,10 , {77,65,68},  0,0 , 7445,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Morocco
-    {    213,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 25860,46 , 25906,88 , 25994,24 , 25924,46 , 25970,88 , 26058,24 , 16868,28 , 16896,54 , 16653,14 , 16868,28 , 16896,54 , 16653,14 , 476,6 , 485,6 , {88,79,70},  153,3 , 7399,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/Mali
-    {    214,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13266,48 , 26434,84 , 134,24 , 13417,48 , 26498,84 , 320,24 , 16950,28 , 16978,63 , 8687,14 , 16950,28 , 16978,63 , 8687,14 , 493,5 , 503,8 , {84,90,83},  282,3 , 6091,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/Tanzania
-    {      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
+//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
+    {      1,     0,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyScript/AnyCountry
+    {      3,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Ethiopia
+    {      3,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Kenya
+    {      4,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/AnyScript/Djibouti
+    {      4,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Eritrea
+    {      4,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Ethiopia
+    {      5,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/SouthAfrica
+    {      5,     0,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/Namibia
+    {      6,     0,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/AnyScript/Albania
+    {      7,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/AnyScript/Ethiopia
+    {      8,     0,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/SaudiArabia
+    {      8,     0,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/Algeria
+    {      8,     0,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Bahrain
+    {      8,     0,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Egypt
+    {      8,     0,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/AnyScript/Iraq
+    {      8,     0,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Jordan
+    {      8,     0,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Kuwait
+    {      8,     0,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/AnyScript/Lebanon
+    {      8,     0,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/LibyanArabJamahiriya
+    {      8,     0,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Morocco
+    {      8,     0,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/AnyScript/Oman
+    {      8,     0,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Qatar
+    {      8,     0,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Sudan
+    {      8,     0,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/AnyScript/SyrianArabRepublic
+    {      8,     0,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Tunisia
+    {      8,     0,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/AnyScript/UnitedArabEmirates
+    {      8,     0,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/AnyScript/Yemen
+    {      9,     0,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/AnyScript/Armenia
+    {     10,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/AnyScript/India
+    {     12,     0,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/AnyScript/Azerbaijan
+    {     12,     0,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/AnyScript/Iran
+    {     12,     1,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Arabic/Iran
+    {     12,     2,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1785,77 , 1483,27 , 1660,48 , 1785,77 , 134,27 , 907,26 , 1000,67 , 99,14 , 907,26 , 1000,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  109,4 , 1457,29 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Cyrillic/Azerbaijan
+    {     12,     7,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Latin/Azerbaijan
+    {     14,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1862,48 , 1910,93 , 2003,24 , 1862,48 , 1910,93 , 2003,24 , 1067,21 , 1088,68 , 798,14 , 1067,21 , 1088,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/AnyScript/Spain
+    {     15,     0,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {66,68,84},  114,1 , 1486,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/AnyScript/Bangladesh
+    {     15,     0,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {73,78,82},  115,4 , 1507,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/AnyScript/India
+    {     16,     0,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2150,75 , 2225,205 , 1483,27 , 2150,75 , 2225,205 , 134,27 , 1269,34 , 1303,79 , 798,14 , 1269,34 , 1303,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  119,3 , 1526,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/AnyScript/Bhutan
+    {     19,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/AnyScript/France
+    {     20,     0,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2430,59 , 2489,82 , 2571,24 , 2430,59 , 2489,82 , 2571,24 , 1382,21 , 1403,55 , 1458,14 , 1382,21 , 1403,55 , 1458,14 , 34,7 , 31,7 , {66,71,78},  122,3 , 1553,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/AnyScript/Bulgaria
+    {     21,     0,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2595,43 , 2638,88 , 2726,24 , 2595,43 , 2638,88 , 2726,24 , 1472,25 , 1497,54 , 1551,14 , 1472,25 , 1497,54 , 1551,14 , 0,2 , 0,2 , {77,77,75},  125,1 , 1600,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/AnyScript/Myanmar
+    {     22,     0,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2750,48 , 2798,99 , 2897,24 , 2750,48 , 2798,95 , 2893,24 , 1565,21 , 1586,56 , 1642,14 , 1565,21 , 1586,56 , 1642,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1618,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/AnyScript/Belarus
+    {     23,     0,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2921,27 , 2948,71 , 1483,27 , 2917,27 , 2944,71 , 134,27 , 1656,19 , 1675,76 , 798,14 , 1656,19 , 1675,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  126,1 , 1641,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/AnyScript/Cambodia
+    {     24,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 3019,60 , 3079,82 , 3161,24 , 3015,93 , 3108,115 , 3223,24 , 1751,21 , 1772,60 , 1832,14 , 1846,28 , 1874,60 , 1934,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/AnyScript/Spain
+    {     25,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/China
+    {     25,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/HongKong
+    {     25,     0,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Macau
+    {     25,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Singapore
+    {     25,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Taiwan
+    {     25,     5,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/China
+    {     25,     5,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/HongKong
+    {     25,     5,   126,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1722,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Macau
+    {     25,     5,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Singapore
+    {     25,     6,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/HongKong
+    {     25,     6,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Macau
+    {     25,     6,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Taiwan
+    {     27,     0,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3262,49 , 3311,94 , 3405,39 , 3286,49 , 3335,98 , 3433,39 , 2032,28 , 2060,58 , 2118,14 , 2032,28 , 2060,58 , 2118,14 , 0,2 , 0,2 , {72,82,75},  138,2 , 1732,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/AnyScript/Croatia
+    {     28,     0,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3405,39 , 3444,82 , 3526,24 , 134,27 , 3472,84 , 3556,24 , 2132,21 , 2153,49 , 2202,14 , 2132,21 , 2153,49 , 2202,14 , 62,4 , 62,4 , {67,90,75},  140,2 , 1759,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/AnyScript/CzechRepublic
+    {     29,     0,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3550,48 , 3598,84 , 134,24 , 3580,59 , 3639,84 , 320,24 , 2216,28 , 2244,51 , 2295,14 , 2216,28 , 2244,51 , 2295,14 , 66,4 , 66,4 , {68,75,75},  142,2 , 1778,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/AnyScript/Denmark
+    {     30,     0,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Netherlands
+    {     30,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Belgium
+    {     31,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStates
+    {     31,     0,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/AmericanSamoa
+    {     31,     0,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  128,1 , 1874,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Australia
+    {     31,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belgium
+    {     31,     0,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  128,1 , 1953,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belize
+    {     31,     0,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  144,1 , 2000,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Botswana
+    {     31,     0,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2050,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Canada
+    {     31,     0,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Guam
+    {     31,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  128,1 , 2103,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/HongKong
+    {     31,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 2159,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/AnyScript/India
+    {     31,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Ireland
+    {     31,     0,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  128,1 , 2203,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Jamaica
+    {     31,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Malta
+    {     31,     0,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/MarshallIslands
+    {     31,     0,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 2256,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/AnyScript/Mauritius
+    {     31,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  128,1 , 2309,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Namibia
+    {     31,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  128,1 , 2362,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NewZealand
+    {     31,     0,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NorthernMarianaIslands
+    {     31,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  151,1 , 2424,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/AnyScript/Pakistan
+    {     31,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 2477,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Philippines
+    {     31,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  128,1 , 2519,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Singapore
+    {     31,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2575,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/SouthAfrica
+    {     31,     0,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  128,1 , 2636,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/TrinidadAndTobago
+    {     31,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 2722,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/UnitedKingdom
+    {     31,     0,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStatesMinorOutlyingIslands
+    {     31,     0,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/USVirginIslands
+    {     31,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Zimbabwe
+    {     31,     3,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 3818,80 , 3898,154 , 4052,36 , 3870,80 , 3950,154 , 4104,36 , 2403,49 , 2452,85 , 2537,21 , 2403,49 , 2452,85 , 2537,21 , 70,4 , 70,4 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Deseret/UnitedStates
+    {     33,     0,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 4088,59 , 4147,91 , 4238,24 , 4140,59 , 4199,91 , 4290,24 , 2558,14 , 2572,63 , 2558,14 , 2558,14 , 2572,63 , 2558,14 , 74,14 , 74,16 , {69,69,75},  142,2 , 2796,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/AnyScript/Estonia
+    {     34,     0,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 4262,48 , 4310,83 , 134,24 , 4314,48 , 4362,83 , 320,24 , 2635,28 , 2663,74 , 2737,14 , 2635,28 , 2663,74 , 2737,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 2837,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/AnyScript/FaroeIslands
+    {     36,     0,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4393,69 , 4462,105 , 4567,24 , 4445,129 , 4445,129 , 4574,24 , 2751,21 , 2772,67 , 2839,14 , 2751,21 , 2853,81 , 2839,14 , 88,3 , 90,3 , {69,85,82},  113,1 , 2879,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/AnyScript/Finland
+    {     37,     0,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/France
+    {     37,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Belgium
+    {     37,     0,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Cameroon
+    {     37,     0,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2955,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/AnyScript/Canada
+    {     37,     0,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/CentralAfricanRepublic
+    {     37,     0,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/IvoryCoast
+    {     37,     0,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Guadeloupe
+    {     37,     0,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {71,78,70},  160,3 , 3068,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Guinea
+    {     37,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Luxembourg
+    {     37,     0,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3116,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Madagascar
+    {     37,     0,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Mali
+    {     37,     0,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Martinique
+    {     37,     0,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Monaco
+    {     37,     0,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Niger
+    {     37,     0,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Reunion
+    {     37,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Senegal
+    {     37,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,72,70},  163,3 , 3170,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/AnyScript/Switzerland
+    {     37,     0,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Barthelemy
+    {     37,     0,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Martin
+    {     40,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4739,48 , 4787,87 , 4874,24 , 4746,48 , 4794,87 , 4881,24 , 3035,28 , 3063,49 , 3112,14 , 3035,28 , 3063,49 , 3112,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/AnyScript/Spain
+    {     41,     0,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4898,48 , 4946,99 , 5045,24 , 4905,48 , 4953,99 , 5052,24 , 3126,28 , 3154,62 , 3216,14 , 3126,28 , 3154,62 , 3216,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3215,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/AnyScript/Georgia
+    {     42,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Germany
+    {     42,     0,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 5069,52 , 5204,83 , 134,24 , 5207,48 , 5255,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Austria
+    {     42,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3353,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Belgium
+    {     42,     0,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Liechtenstein
+    {     42,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Luxembourg
+    {     42,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Switzerland
+    {     43,     0,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Greece
+    {     43,     0,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Cyprus
+    {     44,     0,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3550,48 , 5476,96 , 134,24 , 5527,48 , 5575,96 , 320,24 , 3478,28 , 3506,98 , 3604,14 , 3478,28 , 3506,98 , 3604,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 3313,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/AnyScript/Greenland
+    {     46,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5572,67 , 5639,87 , 5726,31 , 5671,67 , 5738,87 , 5825,31 , 3618,32 , 3650,53 , 3703,19 , 3618,32 , 3650,53 , 3703,19 , 100,14 , 103,14 , {73,78,82},  166,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/AnyScript/India
+    {     47,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Ghana
+    {     47,     0,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/AnyScript/Niger
+    {     47,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Nigeria
+    {     47,     0,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/AnyScript/Sudan
+    {     47,     1,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3405,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Arabic/Nigeria
+    {     47,     1,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Arabic/Sudan
+    {     47,     7,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Ghana
+    {     47,     7,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Latin/Niger
+    {     47,     7,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Nigeria
+    {     48,     0,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 6068,58 , 6126,72 , 1483,27 , 6167,48 , 6215,72 , 134,27 , 3897,46 , 3943,65 , 4008,14 , 3897,46 , 3943,65 , 4008,14 , 114,6 , 117,5 , {73,76,83},  172,1 , 3418,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/AnyScript/Israel
+    {     49,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 6198,75 , 6198,75 , 6273,30 , 6287,75 , 6287,75 , 6362,30 , 4022,38 , 4060,57 , 4117,19 , 4022,38 , 4060,57 , 4117,19 , 120,9 , 122,7 , {73,78,82},  173,3 , 3439,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/AnyScript/India
+    {     50,     0,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 6303,64 , 6367,98 , 6465,25 , 6392,64 , 6456,98 , 6554,25 , 4136,19 , 4155,52 , 4207,17 , 4136,19 , 4155,52 , 4207,17 , 129,3 , 129,3 , {72,85,70},  176,2 , 3458,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/AnyScript/Hungary
+    {     51,     0,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6490,48 , 6538,82 , 6620,24 , 6579,48 , 6627,82 , 6709,24 , 4224,28 , 4252,81 , 4333,14 , 4224,28 , 4252,81 , 4347,14 , 132,4 , 132,4 , {73,83,75},  142,2 , 3478,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/AnyScript/Iceland
+    {     52,     0,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6644,48 , 6692,87 , 134,24 , 6733,48 , 6781,87 , 320,24 , 4361,28 , 4389,43 , 4432,14 , 4361,28 , 4389,43 , 4432,14 , 0,2 , 0,2 , {73,68,82},  178,2 , 3526,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/AnyScript/Indonesia
+    {     57,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6779,62 , 6841,107 , 6948,24 , 6868,62 , 6930,107 , 7037,24 , 4446,37 , 4483,75 , 4558,14 , 4446,37 , 4483,75 , 4558,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 3549,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/AnyScript/Ireland
+    {     58,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/AnyScript/Italy
+    {     58,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {67,72,70},  0,0 , 3560,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/AnyScript/Switzerland
+    {     59,     0,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3223,39 , 3223,39 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 4728,14 , 4742,28 , 4728,14 , 4728,14 , 4742,28 , 4728,14 , 138,2 , 138,2 , {74,80,89},  127,1 , 3582,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/AnyScript/Japan
+    {     61,     0,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 7138,86 , 7138,86 , 7224,31 , 7227,86 , 7227,86 , 7313,31 , 4770,28 , 4798,53 , 4851,19 , 4770,28 , 4798,53 , 4851,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/AnyScript/India
+    {     63,     0,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/AnyScript/Kazakhstan
+    {     63,     2,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Cyrillic/Kazakhstan
+    {     64,     0,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7399,60 , 7459,101 , 1483,27 , 7488,60 , 7548,101 , 134,27 , 4952,35 , 4987,84 , 798,14 , 4952,35 , 4987,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  186,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/AnyScript/Rwanda
+    {     65,     0,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  188,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/AnyScript/Kyrgyzstan
+    {     66,     0,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7560,39 , 7560,39 , 7560,39 , 7649,39 , 7649,39 , 7649,39 , 5071,14 , 5085,28 , 5071,14 , 5071,14 , 5085,28 , 5071,14 , 142,2 , 142,2 , {75,82,87},  191,1 , 3592,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/AnyScript/RepublicOfKorea
+    {     67,     0,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/AnyScript/Iran
+    {     67,     0,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/AnyScript/Iraq
+    {     67,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/AnyScript/SyrianArabRepublic
+    {     67,     0,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/AnyScript/Turkey
+    {     67,     1,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Arabic/Iran
+    {     67,     1,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Arabic/Iraq
+    {     67,     7,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/Latin/SyrianArabRepublic
+    {     67,     7,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Latin/Turkey
+    {     69,     0,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7718,63 , 7781,75 , 1483,27 , 7807,63 , 7870,75 , 134,27 , 5242,24 , 5266,57 , 798,14 , 5242,24 , 5266,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  197,1 , 3605,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/AnyScript/Lao
+    {     71,     0,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7856,65 , 7921,101 , 134,24 , 7945,65 , 8010,101 , 320,24 , 5323,21 , 5344,72 , 5416,14 , 5323,21 , 5344,72 , 5416,14 , 144,14 , 144,11 , {76,86,76},  198,2 , 3615,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/AnyScript/Latvia
+    {     72,     0,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  200,1 , 3635,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/AnyScript/DemocraticRepublicOfCongo
+    {     72,     0,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  201,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/AnyScript/PeoplesRepublicOfCongo
+    {     73,     0,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 8264,69 , 8333,96 , 8429,24 , 8353,48 , 8401,96 , 8497,24 , 5551,17 , 5568,89 , 5657,14 , 5671,21 , 5568,89 , 5657,14 , 158,9 , 155,6 , {76,84,76},  205,2 , 3657,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/AnyScript/Lithuania
+    {     74,     0,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8453,63 , 8516,85 , 8601,24 , 8521,63 , 8584,85 , 8669,24 , 5692,34 , 5726,54 , 1458,14 , 5692,34 , 5726,54 , 1458,14 , 167,10 , 161,8 , {77,75,68},  0,0 , 3711,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/AnyScript/Macedonia
+    {     75,     0,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8625,48 , 8673,92 , 134,24 , 8693,48 , 8741,92 , 320,24 , 5780,34 , 5814,60 , 5874,14 , 5780,34 , 5814,60 , 5874,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3734,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/AnyScript/Madagascar
+    {     76,     0,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  207,2 , 3747,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/Malaysia
+    {     76,     0,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/BruneiDarussalam
+    {     77,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8896,66 , 8962,101 , 9063,31 , 8964,66 , 9030,101 , 9131,31 , 5959,47 , 6006,70 , 6076,22 , 5959,47 , 6006,70 , 6076,22 , 177,6 , 169,10 , {73,78,82},  209,2 , 3770,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/AnyScript/India
+    {     78,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 9094,48 , 9142,86 , 9228,24 , 9162,48 , 9210,86 , 9296,24 , 6098,28 , 6126,63 , 6189,14 , 6098,28 , 6126,63 , 6189,14 , 183,2 , 179,2 , {69,85,82},  113,1 , 3816,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/AnyScript/Malta
+    {     79,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9252,83 , 9252,83 , 1483,27 , 9320,83 , 9320,83 , 134,27 , 6203,48 , 6203,48 , 798,14 , 6203,48 , 6203,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/AnyScript/NewZealand
+    {     80,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 9335,86 , 9335,86 , 9421,32 , 9403,86 , 9403,86 , 9489,32 , 6251,32 , 6283,53 , 4117,19 , 6251,32 , 6283,53 , 4117,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/AnyScript/India
+    {     82,     0,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/AnyScript/Mongolia
+    {     82,     0,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/AnyScript/China
+    {     82,     2,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Cyrillic/Mongolia
+    {     82,     8,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/Mongolian/China
+    {     84,     0,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9623,85 , 9708,27 , 9635,56 , 9691,85 , 9776,27 , 6400,33 , 6433,54 , 6487,14 , 6400,33 , 6433,54 , 6487,14 , 185,14 , 181,14 , {78,80,82},  218,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/AnyScript/Nepal
+    {     84,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9735,80 , 9708,27 , 9635,56 , 9803,80 , 9776,27 , 6400,33 , 6501,54 , 6487,14 , 6400,33 , 6501,54 , 6487,14 , 120,9 , 122,7 , {73,78,82},  145,2 , 3827,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/AnyScript/India
+    {     85,     0,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9815,59 , 9874,83 , 134,24 , 9883,59 , 9942,83 , 320,24 , 6555,28 , 2244,51 , 2295,14 , 6583,35 , 2244,51 , 2295,14 , 0,2 , 0,2 , {78,79,75},  142,2 , 3876,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/AnyScript/Norway
+    {     86,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9957,83 , 9957,83 , 1483,27 , 10025,83 , 10025,83 , 134,27 , 6618,57 , 6618,57 , 798,14 , 6618,57 , 6618,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/AnyScript/France
+    {     87,     0,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 10040,89 , 10040,89 , 10129,32 , 10108,89 , 10108,89 , 10197,32 , 6675,33 , 6708,54 , 6762,18 , 6675,33 , 6708,54 , 6762,18 , 140,2 , 140,2 , {73,78,82},  145,2 , 3920,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/AnyScript/India
+    {     88,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 10161,68 , 10161,68 , 1483,27 , 10229,68 , 10229,68 , 134,27 , 6780,49 , 6780,49 , 798,14 , 6780,49 , 6780,49 , 798,14 , 199,4 , 195,4 , {65,70,78},  222,1 , 3931,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/AnyScript/Afghanistan
+    {     89,     0,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10229,71 , 10300,70 , 10370,25 , 10297,71 , 10368,73 , 10441,25 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {73,82,82},  223,1 , 3944,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Iran
+    {     89,     0,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10395,63 , 10300,70 , 10458,24 , 10466,63 , 10529,68 , 10597,24 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {65,70,78},  222,1 , 3961,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Afghanistan
+    {     90,     0,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10482,48 , 10530,97 , 10627,24 , 10621,48 , 10669,99 , 10768,24 , 6843,34 , 6877,59 , 6936,14 , 6843,34 , 6877,59 , 6936,14 , 0,2 , 0,2 , {80,76,78},  224,2 , 3984,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/AnyScript/Poland
+    {     91,     0,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10651,48 , 10699,89 , 134,24 , 10792,48 , 10840,89 , 320,24 , 6950,28 , 6978,79 , 7057,14 , 6950,28 , 6978,79 , 7057,14 , 213,17 , 209,18 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Portugal
+    {     91,     0,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {66,82,76},  226,2 , 4044,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Brazil
+    {     91,     0,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 4098,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/AnyScript/GuineaBissau
+    {     91,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 4160,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Mozambique
+    {     92,     0,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/AnyScript/India
+    {     92,     0,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/AnyScript/Pakistan
+    {     92,     1,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Arabic/Pakistan
+    {     92,     4,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/Gurmukhi/India
+    {     94,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 11087,67 , 11154,92 , 11246,24 , 11228,67 , 11295,92 , 11387,24 , 7303,23 , 7326,56 , 7382,14 , 7303,23 , 7326,56 , 7382,14 , 140,2 , 231,2 , {67,72,70},  0,0 , 4257,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/AnyScript/Switzerland
+    {     95,     0,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4277,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Moldova
+    {     95,     0,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {82,79,78},  235,3 , 4331,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Romania
+    {     96,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {82,85,66},  238,4 , 4347,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/RussianFederation
+    {     96,     0,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4436,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Moldova
+    {     96,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {85,65,72},  242,1 , 4457,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Ukraine
+    {     98,     0,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11618,48 , 11666,91 , 11757,24 , 11762,48 , 11810,91 , 11901,24 , 7624,28 , 7652,66 , 7718,14 , 7624,28 , 7652,66 , 7718,14 , 235,2 , 233,2 , {88,65,70},  201,4 , 4481,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/AnyScript/CentralAfricanRepublic
+    {     99,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  180,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/AnyScript/India
+    {    100,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/SerbiaAndMontenegro
+    {    100,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/BosniaAndHerzegowina
+    {    100,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Yugoslavia
+    {    100,     0,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Montenegro
+    {    100,     0,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/AnyScript/Serbia
+    {    100,     2,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/BosniaAndHerzegowina
+    {    100,     2,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Yugoslavia
+    {    100,     2,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/SerbiaAndMontenegro
+    {    100,     2,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {69,85,82},  113,1 , 4799,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Montenegro
+    {    100,     2,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Cyrillic/Serbia
+    {    100,     7,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/BosniaAndHerzegowina
+    {    100,     7,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Yugoslavia
+    {    100,     7,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/SerbiaAndMontenegro
+    {    100,     7,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Montenegro
+    {    100,     7,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {82,83,68},  252,4 , 5044,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Latin/Serbia
+    {    101,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/SerbiaAndMontenegro
+    {    101,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/BosniaAndHerzegowina
+    {    101,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/Yugoslavia
+    {    102,     0,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/Lesotho
+    {    102,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/SouthAfrica
+    {    103,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12299,48 , 12347,117 , 1483,27 , 12443,48 , 12491,117 , 134,27 , 8078,27 , 8105,64 , 798,14 , 8078,27 , 8105,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/AnyScript/SouthAfrica
+    {    104,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12464,47 , 12511,100 , 12611,24 , 12608,47 , 12655,100 , 12755,24 , 8169,32 , 8201,55 , 8256,14 , 8169,32 , 8201,55 , 8256,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 5115,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/AnyScript/Zimbabwe
+    {    106,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12635,54 , 12689,92 , 12781,32 , 12779,54 , 12833,92 , 12925,32 , 8270,30 , 8300,62 , 8362,19 , 8270,30 , 8300,62 , 8362,19 , 255,5 , 249,4 , {76,75,82},  259,5 , 5137,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/AnyScript/SriLanka
+    {    107,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/SouthAfrica
+    {    107,     0,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  264,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/Swaziland
+    {    108,     0,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12975,48 , 13023,82 , 12122,24 , 13119,48 , 13167,89 , 12266,24 , 8476,21 , 8497,52 , 8549,14 , 8476,21 , 8497,52 , 8549,14 , 260,10 , 253,9 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/AnyScript/Slovakia
+    {    109,     0,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11993,48 , 13105,86 , 12122,24 , 12137,48 , 13256,86 , 12266,24 , 8563,28 , 8591,52 , 8643,14 , 8563,28 , 8591,52 , 8643,14 , 62,4 , 262,4 , {69,85,82},  113,1 , 5156,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/AnyScript/Slovenia
+    {    110,     0,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {83,79,83},  265,3 , 5184,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Somalia
+    {    110,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {68,74,70},  5,3 , 5206,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Djibouti
+    {    110,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {69,84,66},  0,2 , 5227,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Ethiopia
+    {    110,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Kenya
+    {    111,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Spain
+    {    111,     0,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {65,82,83},  128,1 , 5249,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/Argentina
+    {    111,     0,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {66,79,66},  268,2 , 5300,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Bolivia
+    {    111,     0,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,76,80},  128,1 , 5335,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Chile
+    {    111,     0,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,79,80},  128,1 , 5380,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Colombia
+    {    111,     0,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,82,67},  270,1 , 5434,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/CostaRica
+    {    111,     0,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {68,79,80},  271,3 , 5501,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/DominicanRepublic
+    {    111,     0,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Ecuador
+    {    111,     0,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  256,3 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/ElSalvador
+    {    111,     0,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {88,65,70},  201,4 , 5625,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/EquatorialGuinea
+    {    111,     0,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {71,84,81},  274,1 , 5647,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Guatemala
+    {    111,     0,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {72,78,76},  275,1 , 5717,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Honduras
+    {    111,     0,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {77,88,78},  128,1 , 5777,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Mexico
+    {    111,     0,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {78,73,79},  276,2 , 5825,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Nicaragua
+    {    111,     0,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,65,66},  278,3 , 5906,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Panama
+    {    111,     0,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,89,71},  281,1 , 5960,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Paraguay
+    {    111,     0,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,69,78},  282,3 , 6021,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Peru
+    {    111,     0,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/PuertoRico
+    {    111,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/UnitedStates
+    {    111,     0,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,89,85},  128,1 , 6083,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Uruguay
+    {    111,     0,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {86,69,70},  285,5 , 6131,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Venezuela
+    {    111,     0,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4506,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/LatinAmericaAndTheCaribbean
+    {    113,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {75,69,83},  2,3 , 6217,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/AnyScript/Kenya
+    {    113,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {84,90,83},  290,3 , 6241,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/AnyScript/Tanzania
+    {    114,     0,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {83,69,75},  142,2 , 6268,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Sweden
+    {    114,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {69,85,82},  113,1 , 6313,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Finland
+    {    116,     0,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/AnyScript/Tajikistan
+    {    116,     2,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Cyrillic/Tajikistan
+    {    117,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {73,78,82},  293,2 , 6345,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/AnyScript/India
+    {    117,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {76,75,82},  295,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/AnyScript/SriLanka
+    {    118,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/AnyScript/RussianFederation
+    {    119,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 14127,86 , 14127,86 , 14213,30 , 14278,86 , 14278,86 , 14364,30 , 9154,32 , 9186,60 , 9246,18 , 9154,32 , 9186,60 , 9246,18 , 282,1 , 278,2 , {73,78,82},  299,3 , 6358,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/AnyScript/India
+    {    120,     0,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 14243,63 , 14306,98 , 14243,63 , 14394,63 , 14457,98 , 14555,24 , 9264,23 , 9287,68 , 9355,14 , 9264,23 , 9287,68 , 9355,14 , 283,10 , 280,10 , {84,72,66},  302,1 , 6371,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/AnyScript/Thailand
+    {    121,     0,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {67,78,89},  215,3 , 6384,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/AnyScript/China
+    {    121,     0,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {73,78,82},  145,2 , 6397,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/AnyScript/India
+    {    122,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14625,46 , 14671,54 , 1034,24 , 14800,46 , 14846,54 , 1061,24 , 9516,29 , 9516,29 , 9545,14 , 9516,29 , 9516,29 , 9545,14 , 300,7 , 298,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Eritrea
+    {    122,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9559,29 , 9559,29 , 9545,14 , 9559,29 , 9559,29 , 9545,14 , 300,7 , 298,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Ethiopia
+    {    123,     0,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14725,51 , 14776,87 , 14863,24 , 14900,51 , 14951,87 , 15038,24 , 9588,29 , 9617,60 , 9677,14 , 9588,29 , 9617,60 , 9677,14 , 0,2 , 0,2 , {84,79,80},  303,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/AnyScript/Tonga
+    {    124,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14887,48 , 14935,122 , 1483,27 , 15062,48 , 15110,122 , 134,27 , 9691,27 , 9718,72 , 798,14 , 9691,27 , 9718,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/AnyScript/SouthAfrica
+    {    125,     0,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 15057,48 , 15105,75 , 15180,24 , 15232,48 , 15280,75 , 15355,24 , 9790,28 , 9818,54 , 9872,14 , 9790,28 , 9818,54 , 9872,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 6419,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/AnyScript/Turkey
+    {    128,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/AnyScript/China
+    {    128,     1,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/Arabic/China
+    {    129,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 15204,48 , 15252,95 , 15347,24 , 15379,67 , 15446,87 , 15533,24 , 9886,21 , 9907,56 , 9963,14 , 9886,21 , 9907,56 , 9963,14 , 307,2 , 305,2 , {85,65,72},  242,1 , 6437,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/AnyScript/Ukraine
+    {    130,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 6486,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/AnyScript/India
+    {    130,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {80,75,82},  305,4 , 6504,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/AnyScript/Pakistan
+    {    131,     0,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/AnyScript/Uzbekistan
+    {    131,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/AnyScript/Afghanistan
+    {    131,     1,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Arabic/Afghanistan
+    {    131,     2,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Cyrillic/Uzbekistan
+    {    131,     7,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 15669,52 , 15438,115 , 15721,24 , 15787,52 , 15624,115 , 15839,24 , 10143,34 , 10177,61 , 10238,14 , 10143,34 , 10177,61 , 10238,14 , 0,2 , 0,2 , {85,90,83},  314,4 , 6559,23 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Latin/Uzbekistan
+    {    132,     0,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15745,75 , 15820,130 , 1483,27 , 15863,75 , 15938,130 , 134,27 , 10252,33 , 10285,55 , 10340,21 , 10252,33 , 10285,55 , 10340,21 , 309,2 , 307,2 , {86,78,68},  318,1 , 6582,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/AnyScript/VietNam
+    {    134,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15950,53 , 16003,87 , 16090,24 , 16068,62 , 16130,86 , 16216,24 , 10361,29 , 10390,77 , 10467,14 , 10481,30 , 10390,77 , 10467,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 6593,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/AnyScript/UnitedKingdom
+    {    135,     0,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/AnyScript/Senegal
+    {    135,     7,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Latin/Senegal
+    {    136,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 16114,48 , 16162,91 , 1483,27 , 16240,48 , 16288,91 , 134,27 , 10511,28 , 10539,61 , 798,14 , 10511,28 , 10539,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/AnyScript/SouthAfrica
+    {    138,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 16253,73 , 16326,121 , 1483,27 , 16379,73 , 16452,121 , 134,27 , 10600,44 , 10644,69 , 798,14 , 10600,44 , 10644,69 , 798,14 , 311,5 , 309,5 , {78,71,78},  171,1 , 6621,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/AnyScript/Nigeria
+    {    140,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16447,48 , 16495,104 , 134,24 , 16573,48 , 16621,90 , 320,24 , 10713,28 , 10741,68 , 10809,14 , 10713,28 , 10741,68 , 10809,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/AnyScript/SouthAfrica
+    {    141,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 4262,48 , 9874,83 , 134,24 , 4314,48 , 9942,83 , 320,24 , 10823,28 , 10851,51 , 2295,14 , 10823,28 , 10851,51 , 2295,14 , 316,9 , 314,11 , {78,79,75},  142,2 , 6655,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/AnyScript/Norway
+    {    142,     0,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16599,48 , 16647,83 , 1483,27 , 16711,48 , 16759,83 , 134,27 , 10902,28 , 10930,58 , 798,14 , 10902,28 , 10930,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  250,2 , 6697,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/AnyScript/BosniaAndHerzegowina
+    {    143,     0,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  319,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/AnyScript/Maldives
+    {    144,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16730,102 , 16832,140 , 1483,27 , 16842,102 , 16944,140 , 134,27 , 10988,30 , 11018,57 , 798,14 , 10988,30 , 11018,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/AnyScript/UnitedKingdom
+    {    145,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16972,46 , 17018,124 , 1483,27 , 17084,46 , 17130,124 , 134,27 , 11075,28 , 11103,60 , 798,14 , 11075,28 , 11103,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/AnyScript/UnitedKingdom
+    {    146,     0,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 17142,48 , 17190,192 , 1483,27 , 17254,48 , 17302,192 , 134,27 , 11163,28 , 11191,49 , 11240,14 , 11163,28 , 11191,49 , 11240,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/AnyScript/Ghana
+    {    147,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 17382,87 , 17382,87 , 1483,27 , 17494,87 , 17494,87 , 134,27 , 6251,32 , 11254,55 , 798,14 , 6251,32 , 11254,55 , 798,14 , 327,5 , 327,5 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/AnyScript/India
+    {    148,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17469,48 , 17517,94 , 1483,27 , 17581,48 , 17629,94 , 134,27 , 11309,26 , 11335,34 , 798,14 , 11309,26 , 11335,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/AnyScript/Ghana
+    {    149,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17611,48 , 17659,86 , 1483,27 , 17723,48 , 17771,86 , 134,27 , 11369,29 , 11398,57 , 798,14 , 11369,29 , 11398,57 , 798,14 , 332,4 , 332,4 , {78,71,78},  171,1 , 6723,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/AnyScript/Nigeria
+    {    150,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17745,48 , 17793,189 , 17982,24 , 17857,48 , 17905,189 , 18094,24 , 11455,28 , 11483,74 , 11557,14 , 11455,28 , 11483,74 , 11557,14 , 336,9 , 336,7 , {75,69,83},  2,3 , 6735,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/AnyScript/Kenya
+    {    151,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 18006,65 , 18006,65 , 1483,27 , 18118,65 , 18118,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/AnyScript/SyrianArabRepublic
+    {    152,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 18071,47 , 18118,77 , 18195,24 , 18183,47 , 18230,77 , 18307,24 , 11571,26 , 11597,43 , 11640,14 , 11571,26 , 11597,43 , 11640,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/AnyScript/Eritrea
+    {    153,     0,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Eritrea
+    {    153,     0,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Ethiopia
+    {    154,     0,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18292,48 , 18340,124 , 1483,27 , 18404,48 , 18452,124 , 134,27 , 11697,28 , 11725,54 , 798,14 , 11697,28 , 11725,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/AnyScript/IvoryCoast
+    {    155,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11779,28 , 11807,51 , 11858,14 , 11779,28 , 11807,51 , 11858,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/AnyScript/Ethiopia
+    {    156,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18464,59 , 18523,129 , 1483,27 , 18576,59 , 18635,129 , 134,27 , 11872,35 , 11907,87 , 798,14 , 11872,35 , 11907,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6758,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/AnyScript/Nigeria
+    {    157,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11994,27 , 12021,41 , 12062,14 , 11994,27 , 12021,41 , 12062,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/AnyScript/Eritrea
+    {    158,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18652,57 , 18709,178 , 1483,27 , 18764,57 , 18821,178 , 134,27 , 12076,28 , 12104,44 , 798,14 , 12076,28 , 12104,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6769,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/AnyScript/Nigeria
+    {    159,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18887,48 , 18935,77 , 19012,24 , 18999,48 , 19047,77 , 19124,24 , 12148,28 , 12176,50 , 3021,14 , 12148,28 , 12176,50 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/AnyScript/Italy
+    {    160,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19036,48 , 19084,111 , 1483,27 , 19148,48 , 19196,111 , 134,27 , 12226,27 , 12253,70 , 798,14 , 12226,27 , 12253,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/AnyScript/SouthAfrica
+    {    161,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/AnyScript/Ghana
+    {    161,     0,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {88,79,70},  157,3 , 6783,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/AnyScript/Togo
+    {    162,     0,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12413,27 , 12413,27 , 12440,14 , 12413,27 , 12413,27 , 12440,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/AnyScript/Ethiopia
+    {    163,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 19354,59 , 19413,95 , 1483,27 , 19466,59 , 19525,95 , 134,27 , 12454,21 , 12475,57 , 798,14 , 12454,21 , 12475,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/AnyScript/UnitedStates
+    {    164,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19508,48 , 19556,153 , 1483,27 , 19620,48 , 19668,153 , 134,27 , 12532,28 , 12560,42 , 798,14 , 12532,28 , 12560,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6794,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/AnyScript/Nigeria
+    {    165,     0,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19709,48 , 19757,91 , 1483,27 , 19821,48 , 19869,91 , 134,27 , 12602,28 , 12630,67 , 798,14 , 12602,28 , 12630,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6805,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/AnyScript/Malawi
+    {    166,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19848,48 , 19896,88 , 19984,24 , 19960,48 , 20008,88 , 20096,24 , 12697,28 , 12725,55 , 12780,14 , 12794,28 , 12725,55 , 12780,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 6827,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/AnyScript/Philippines
+    {    167,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 20008,48 , 20056,86 , 134,24 , 5076,48 , 20120,86 , 320,24 , 12822,28 , 12850,63 , 3311,14 , 12822,28 , 12850,63 , 3311,14 , 91,5 , 343,4 , {67,72,70},  0,0 , 6849,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/AnyScript/Switzerland
+    {    168,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 20142,38 , 1483,27 , 134,27 , 20206,38 , 134,27 , 12913,21 , 12934,28 , 12962,14 , 12913,21 , 12934,28 , 12962,14 , 345,2 , 347,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/AnyScript/China
+    {    169,     0,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  321,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/AnyScript/Guinea
+    {    169,     0,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/AnyScript/Liberia
+    {    170,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/AnyScript/Germany
+    {    171,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 20180,48 , 20228,100 , 1483,27 , 20244,48 , 20292,100 , 134,27 , 12976,27 , 13003,66 , 798,14 , 12976,27 , 13003,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/AnyScript/SouthAfrica
+    {    172,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 20328,48 , 20376,94 , 1483,27 , 20392,48 , 20440,94 , 134,27 , 13069,27 , 13096,63 , 798,14 , 13069,27 , 13096,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/AnyScript/SouthAfrica
+    {    173,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20470,85 , 20555,145 , 20700,24 , 20534,85 , 20619,145 , 20764,24 , 13159,33 , 13192,65 , 13257,14 , 13159,33 , 13192,65 , 13257,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 6888,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Finland
+    {    173,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20724,59 , 20555,145 , 20700,24 , 20788,59 , 20619,145 , 20764,24 , 13159,33 , 13271,75 , 13346,14 , 13159,33 , 13271,75 , 13346,14 , 0,2 , 0,2 , {78,79,75},  323,3 , 6911,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Norway
+    {    174,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20783,48 , 20831,142 , 20973,24 , 20847,48 , 20895,142 , 21037,24 , 13360,28 , 13388,172 , 13560,14 , 13360,28 , 13388,172 , 13560,14 , 0,2 , 0,2 , {84,87,68},  135,3 , 6932,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/AnyScript/Taiwan
+    {    175,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20997,48 , 21045,88 , 21133,24 , 21061,48 , 21109,88 , 21197,24 , 13574,28 , 13602,62 , 13664,14 , 13574,28 , 13602,62 , 13664,14 , 347,5 , 349,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/AnyScript/Kenya
+    {    176,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21157,48 , 21205,221 , 21426,24 , 21221,48 , 21269,221 , 21490,24 , 13678,28 , 13706,106 , 13812,14 , 13678,28 , 13706,106 , 13812,14 , 352,10 , 359,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/AnyScript/Kenya
+    {    177,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21450,48 , 21498,77 , 21575,24 , 21514,48 , 21562,77 , 21639,24 , 13826,28 , 13854,59 , 13913,14 , 13826,28 , 13854,59 , 13913,14 , 362,6 , 369,7 , {88,79,70},  157,3 , 6974,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/AnyScript/Senegal
+    {    178,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21599,48 , 21647,185 , 21832,24 , 21663,48 , 21711,185 , 21896,24 , 13927,28 , 13955,63 , 14018,14 , 13927,28 , 13955,63 , 14018,14 , 368,6 , 376,8 , {75,69,83},  2,3 , 7000,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/AnyScript/Kenya
+    {    179,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21856,48 , 21904,173 , 22077,24 , 21920,48 , 21968,173 , 22141,24 , 14032,28 , 14060,105 , 14165,14 , 14032,28 , 14060,105 , 14165,14 , 374,7 , 384,5 , {75,69,83},  2,3 , 7023,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/AnyScript/Kenya
+    {    180,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 22101,48 , 22149,88 , 134,24 , 22165,48 , 22213,88 , 320,24 , 14179,28 , 14207,55 , 14262,14 , 14179,28 , 14207,55 , 14262,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/AnyScript/Mozambique
+    {    181,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22237,48 , 22285,112 , 22397,24 , 22301,48 , 22349,112 , 22461,24 , 14276,28 , 14304,50 , 14354,14 , 14276,28 , 14304,50 , 14354,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 7048,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/AnyScript/Zimbabwe
+    {    182,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 22421,39 , 22460,194 , 22654,24 , 22485,39 , 22524,194 , 22718,24 , 14368,28 , 14396,65 , 14461,14 , 14368,28 , 14396,65 , 14461,14 , 381,8 , 389,7 , {84,90,83},  290,3 , 7072,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/AnyScript/Tanzania
+    {    183,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/AnyScript/Morocco
+    {    183,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Latin/Morocco
+    {    183,     9,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22831,48 , 22879,81 , 22960,24 , 22895,48 , 22943,81 , 23024,24 , 14553,30 , 14583,47 , 798,14 , 14553,30 , 14583,47 , 798,14 , 395,6 , 404,8 , {77,65,68},  0,0 , 7118,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Tifinagh/Morocco
+    {    184,     0,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22984,48 , 23032,84 , 23116,24 , 23048,48 , 23096,84 , 23180,24 , 14630,30 , 14660,51 , 14711,14 , 14630,30 , 14660,51 , 14711,14 , 401,7 , 412,9 , {68,90,68},  326,2 , 7139,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/AnyScript/Algeria
+    {    185,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/AnyScript/Uganda
+    {    186,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,254 , 23642,24 , 23404,48 , 23452,254 , 23706,24 , 14841,28 , 14869,82 , 14951,14 , 14841,28 , 14869,82 , 14951,14 , 408,7 , 421,7 , {84,90,83},  290,3 , 7186,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/AnyScript/Tanzania
+    {    187,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/AnyScript/Tanzania
+    {    188,     0,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23753,47 , 23800,92 , 23892,24 , 23817,47 , 23864,92 , 23956,24 , 15069,28 , 15097,44 , 15141,14 , 15069,28 , 15097,44 , 15141,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 7242,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/AnyScript/Mali
+    {    189,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23916,48 , 23964,207 , 24171,24 , 23980,48 , 24028,207 , 24235,24 , 15155,28 , 15183,64 , 15247,14 , 15155,28 , 15183,64 , 15247,14 , 420,2 , 437,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/AnyScript/Kenya
+    {    190,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 24195,36 , 24231,58 , 24289,24 , 24259,36 , 24295,58 , 24353,24 , 15261,28 , 15289,49 , 15338,14 , 15261,28 , 15289,49 , 15338,14 , 422,3 , 439,6 , {85,83,68},  128,1 , 7266,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/AnyScript/UnitedStates
+    {    191,     0,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 24313,47 , 24360,68 , 24428,24 , 24377,47 , 24424,68 , 24492,24 , 15352,27 , 15379,48 , 15427,14 , 15352,27 , 15379,48 , 15427,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 7285,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/AnyScript/Mauritius
+    {    192,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 24452,264 , 134,24 , 13764,48 , 24516,264 , 320,24 , 15441,28 , 15469,133 , 14461,14 , 15441,28 , 15469,133 , 14461,14 , 425,4 , 445,5 , {84,90,83},  290,3 , 7215,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/AnyScript/Tanzania
+    {    193,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24716,83 , 24799,111 , 24910,24 , 24780,83 , 24863,111 , 24974,24 , 15602,36 , 15638,63 , 15701,14 , 15602,36 , 15638,63 , 15701,14 , 429,3 , 450,3 , {84,90,83},  290,3 , 7306,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/AnyScript/Tanzania
+    {    194,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 15715,28 , 15743,66 , 15809,14 , 15715,28 , 15743,66 , 15809,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7335,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/AnyScript/Uganda
+    {    195,     0,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25079,48 , 25127,83 , 25210,24 , 25143,48 , 25191,83 , 25274,24 , 15823,80 , 15823,80 , 798,14 , 15823,80 , 15823,80 , 798,14 , 432,8 , 453,7 , {90,77,75},  331,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/AnyScript/Zambia
+    {    196,     0,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 25234,48 , 25282,86 , 134,24 , 25298,48 , 25346,86 , 320,24 , 15903,28 , 15931,73 , 16004,14 , 15903,28 , 15931,73 , 16004,14 , 140,2 , 140,2 , {67,86,69},  333,3 , 7361,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/AnyScript/CapeVerde
+    {    197,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25368,48 , 25416,86 , 25502,24 , 25432,48 , 25480,86 , 25566,24 , 16018,28 , 16046,51 , 16097,14 , 16018,28 , 16046,51 , 16097,14 , 440,2 , 460,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/AnyScript/Kenya
+    {    198,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25526,48 , 25574,111 , 25685,24 , 25590,48 , 25638,111 , 25749,24 , 16111,28 , 16139,93 , 16232,14 , 16111,28 , 16139,93 , 16232,14 , 442,4 , 462,4 , {75,69,83},  2,3 , 7386,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/AnyScript/Kenya
+    {    199,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25709,136 , 134,24 , 0,48 , 25773,136 , 320,24 , 16246,23 , 16269,92 , 16361,14 , 16246,23 , 16269,92 , 16361,14 , 446,7 , 466,5 , {78,65,68},  12,2 , 7412,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/AnyScript/Namibia
+    {    200,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/AnyScript/Tanzania
+    {    201,     0,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25845,59 , 25904,87 , 134,24 , 25909,59 , 25968,87 , 320,24 , 16375,28 , 16403,72 , 3311,14 , 16375,28 , 16403,72 , 3311,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/AnyScript/Germany
+    {    202,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {75,69,83},  2,3 , 7434,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/AnyScript/Kenya
+    {    202,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {84,90,83},  290,3 , 7459,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/AnyScript/Tanzania
+    {    203,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 16533,35 , 16568,65 , 16633,14 , 16533,35 , 16568,65 , 16633,14 , 462,6 , 477,6 , {85,71,88},  328,3 , 7335,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/AnyScript/Uganda
+    {    204,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 26174,48 , 13661,84 , 134,24 , 26238,48 , 13812,84 , 320,24 , 16647,21 , 16668,75 , 85,14 , 16647,21 , 16668,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7487,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/AnyScript/Kenya
+    {    205,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26222,48 , 13661,84 , 134,24 , 26286,48 , 13812,84 , 320,24 , 16743,28 , 8849,60 , 15055,14 , 16743,28 , 8849,60 , 15055,14 , 468,9 , 483,8 , {84,90,83},  290,3 , 7510,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/AnyScript/Tanzania
+    {    206,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {75,69,83},  2,3 , 7538,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/AnyScript/Kenya
+    {    206,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {85,71,88},  328,3 , 7565,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/AnyScript/Uganda
+    {    207,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16882,28 , 16910,56 , 16966,14 , 16882,28 , 16910,56 , 16966,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/AnyScript/Eritrea
+    {    208,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 16980,28 , 17008,53 , 17061,14 , 16980,28 , 17008,53 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/AnyScript/Mali
+    {    209,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/AnyScript/Tanzania
+    {    210,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26594,48 , 26642,186 , 26828,24 , 26658,48 , 26706,186 , 26892,24 , 17075,28 , 17103,69 , 17172,14 , 17075,28 , 17103,69 , 17172,14 , 492,2 , 503,2 , {75,69,83},  2,3 , 7616,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/AnyScript/Kenya
+    {    211,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/AnyScript/Uganda
+    {    212,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/AnyScript/Morocco
+    {    212,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Latin/Morocco
+    {    213,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 17276,28 , 17304,54 , 17061,14 , 17276,28 , 17304,54 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/AnyScript/Mali
+    {    214,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 27010,84 , 134,24 , 13764,48 , 27074,84 , 320,24 , 17358,28 , 17386,63 , 8909,14 , 17358,28 , 17386,63 , 8909,14 , 503,5 , 515,8 , {84,90,83},  290,3 , 6241,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/AnyScript/Tanzania
+    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
 };
 
 static const ushort date_format_data[] = {
@@ -832,2371 +876,1070 @@ static const ushort months_data[] = {
 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x130, 0x79, 0x75,
 0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x79, 0x61,
 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65,
-0x6b, 0x61, 0x62, 0x72, 0x3b, 0x75, 0x72, 0x74, 0x3b, 0x6f, 0x74, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x69,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x65, 0x6b, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x3b, 0x61, 0x62, 0x75, 0x3b, 0x69, 0x72, 0x61,
-0x3b, 0x75, 0x72, 0x72, 0x3b, 0x61, 0x7a, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x3b, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69,
-0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61,
-0x70, 0x69, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e,
-0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72,
-0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62,
-0x65, 0x6e, 0x64, 0x75, 0x61, 0x3b, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b,
-0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b,
-0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
-0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997,
-0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb,
-0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b,
-0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1,
-0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0x20, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0x20, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf28,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf21,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf44, 0xf54,
-0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
-0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
-0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b,
-0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b,
-0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
-0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x44f, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432,
-0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438,
-0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e,
-0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444,
-0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c,
-0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
-0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435,
-0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b,
-0x430, 0x3b, 0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x1007, 0x1014,
-0x103a, 0x3b, 0x1016, 0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007,
-0x1030, 0x3b, 0x1029, 0x3b, 0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e,
-0x3b, 0x1007, 0x1014, 0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e,
-0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030,
-0x101c, 0x102d, 0x102f, 0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c,
-0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c,
-0x3b, 0x1012, 0x102e, 0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007,
-0x3b, 0x1007, 0x3b, 0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442,
-0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f,
-0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435,
-0x3b, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432,
-0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x432,
-0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432,
-0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b,
-0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x3b, 0x441, 0x3b, 0x43b, 0x3b,
-0x441, 0x3b, 0x43a, 0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441, 0x3b,
-0x17e1, 0x3b, 0x17e2, 0x3b, 0x17e3, 0x3b, 0x17e4, 0x3b, 0x17e5, 0x3b, 0x17e6, 0x3b, 0x17e7, 0x3b, 0x17e8, 0x3b, 0x17e9, 0x3b, 0x17e1, 0x17e0,
-0x3b, 0x17e1, 0x17e1, 0x3b, 0x17e1, 0x17e2, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798,
-0x17b7, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793, 0x17b6,
-0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f,
-0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x3b, 0x64, 0x65,
-0x20, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61,
-0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65,
-0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b,
-0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f,
-0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b,
-0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019,
-0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e,
-0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b,
-0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72,
-0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
-0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34,
-0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708,
-0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x3b, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e,
-0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f,
-0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69,
-0x6a, 0x65, 0x10d, 0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x6b,
-0x61, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c, 0x69,
-0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61,
-0x3b, 0x72, 0x75, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x75,
-0x64, 0x65, 0x6e, 0x6f, 0x67, 0x61, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x3b, 0x31, 0x2e, 0x3b, 0x32,
-0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b,
-0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x3b, 0x6c, 0x65, 0x64, 0x6e, 0x61,
-0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61, 0x3b, 0x64, 0x75, 0x62, 0x6e, 0x61, 0x3b,
-0x6b, 0x76, 0x11b, 0x74, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e,
-0x63, 0x65, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x6e, 0x61, 0x3b,
-0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x3b, 0x6c,
-0x3b, 0xfa, 0x3b, 0x62, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x10d, 0x3b, 0x10d, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x159, 0x3b, 0x6c,
-0x3b, 0x70, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67,
+0x6b, 0x61, 0x62, 0x72, 0x3b, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c,
+0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x443, 0x43d, 0x3b, 0x438,
+0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b,
+0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431,
+0x440, 0x3b, 0x75, 0x72, 0x74, 0x3b, 0x6f, 0x74, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x69, 0x3b, 0x6d, 0x61,
+0x69, 0x3b, 0x65, 0x6b, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x3b, 0x61, 0x62, 0x75, 0x3b, 0x69, 0x72, 0x61, 0x3b, 0x75, 0x72,
+0x72, 0x3b, 0x61, 0x7a, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x3b, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x3b,
+0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72,
+0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75,
+0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72, 0x61, 0x69, 0x6c,
+0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64,
+0x75, 0x61, 0x3b, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49,
+0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac,
+0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf,
+0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f,
+0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b,
+0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x99c, 0x9be, 0x3b,
+0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b,
+0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20,
+0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf25, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0x20, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf28, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0x20, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0x20, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf66,
+0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
+0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3,
+0xf5d, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf63, 0xf94,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
+0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
+0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45, 0xf74,
+0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45,
+0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x44f, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b,
+0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b,
+0x438, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
+0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440,
+0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b,
+0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435,
+0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440,
+0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c,
+0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016,
+0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029,
+0x3b, 0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x3b, 0x1007, 0x1014,
+0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019, 0x1010,
+0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f,
+0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1021, 0x1031,
+0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012, 0x102e,
+0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b,
+0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430,
+0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d,
+0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442,
+0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b,
+0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c,
+0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430,
+0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442,
+0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x3b, 0x441, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x43a,
+0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x17e1, 0x3b, 0x17e2,
+0x3b, 0x17e3, 0x3b, 0x17e4, 0x3b, 0x17e5, 0x3b, 0x17e6, 0x3b, 0x17e7, 0x3b, 0x17e8, 0x3b, 0x17e9, 0x3b, 0x17e1, 0x17e0, 0x3b, 0x17e1, 0x17e1,
+0x3b, 0x17e1, 0x17e2, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798, 0x17b7, 0x1793, 0x17b6,
+0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780,
+0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6,
+0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65,
+0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b,
+0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75,
+0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20,
+0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20,
+0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64,
+0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64, 0x65, 0x20,
+0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x64,
+0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53,
+0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35,
+0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31,
+0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x3b, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74,
+0x72, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72,
+0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d,
+0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x6b, 0x61, 0x3b, 0x74,
+0x72, 0x61, 0x76, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x6e, 0x6a,
+0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61, 0x3b, 0x72, 0x75,
+0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e,
+0x6f, 0x67, 0x61, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33,
+0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b,
+0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x3b, 0x6c, 0x65, 0x64, 0x6e, 0x61, 0x3b, 0xfa, 0x6e,
+0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61, 0x3b, 0x64, 0x75, 0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b,
+0x74, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b,
+0x73, 0x72, 0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73,
+0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x3b, 0x6c, 0x3b, 0xfa, 0x3b,
+0x62, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x10d, 0x3b, 0x10d, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x159, 0x3b, 0x6c, 0x3b, 0x70, 0x3b,
+0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73,
+0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b,
+0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b,
+0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e, 0x3b, 0x61, 0x70,
+0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67,
 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63,
-0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
-0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65,
-0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
-0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f,
-0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f,
-0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61,
-0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73,
-0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x74, 0x61,
-0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
-0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75,
-0x74, 0x61, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c,
-0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48,
-0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69,
-0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f,
-0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65,
-0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f,
-0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x58,
-0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x58,
-0x75, 0xf1, 0x3b, 0x58, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f,
-0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53,
-0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x10d8, 0x10d0,
-0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5,
-0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd,
-0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5,
-0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8,
-0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5,
-0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd,
-0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db,
-0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0,
-0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72,
-0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67,
-0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e,
-0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65,
-0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
-0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
-0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c,
-0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x3ca, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb,
-0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba,
-0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1,
-0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf, 0x3c5,
-0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af,
-0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf, 0x3c5, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc, 0x3b2,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b,
-0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b,
-0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
-0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d,
-0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x75, 0x73, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x69, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae, 0xabe,
-0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1,
-0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f,
-0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0,
-0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd,
-0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8,
-0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacd, 0xaac, 0xab0,
-0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c, 0xabe,
-0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b,
-0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72,
-0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75,
-0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e,
-0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73,
-0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59,
-0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62,
-0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x62c, 0x64e, 0x646, 0x3b, 0x6a2, 0x64e, 0x628, 0x3b, 0x645, 0x64e, 0x631, 0x3b, 0x623, 0x64e,
-0x6a2, 0x652, 0x631, 0x3b, 0x645, 0x64e, 0x64a, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x3b, 0x623, 0x64e,
-0x63a, 0x64f, 0x3b, 0x633, 0x64e, 0x62a, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x3b, 0x646, 0x64f, 0x648, 0x3b, 0x62f, 0x650, 0x633,
-0x3b, 0x62c, 0x64e, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x6a2, 0x64e, 0x628, 0x652, 0x631, 0x64e, 0x64a, 0x652, 0x631, 0x64f,
-0x3b, 0x645, 0x64e, 0x631, 0x650, 0x633, 0x652, 0x3b, 0x623, 0x64e, 0x6a2, 0x652, 0x631, 0x650, 0x644, 0x64f, 0x3b, 0x645, 0x64e, 0x64a,
-0x64f, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x650, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x650, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x633, 0x652,
-0x62a, 0x64e, 0x3b, 0x633, 0x64e, 0x62a, 0x64f, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x648, 0x64f, 0x628,
-0x64e, 0x3b, 0x646, 0x64f, 0x648, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x62f, 0x650, 0x633, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b,
-0x5d9, 0x5e0, 0x5d5, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b,
-0x5d9, 0x5d5, 0x5e0, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x3b,
-0x5e0, 0x5d5, 0x5d1, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8,
-0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b,
-0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0,
-0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b,
-0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a,
-0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917,
-0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b,
-0x928, 0x935, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b,
-0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b,
-0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63,
-0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c,
-0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e,
-0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b,
-0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b,
-0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b,
-0xe1, 0x67, 0xfa, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0xf3, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b,
-0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
-0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b,
-0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3,
-0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0xc1, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75,
-0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62,
-0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e,
-0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f,
-0x6c, 0x6c, 0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1,
-0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e,
-0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e,
-0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69,
-0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69,
-0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b,
-0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65,
-0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75,
-0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69,
-0x63, 0x3b, 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d,
-0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x67,
-0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b,
-0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b,
-0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a,
-0xccd, 0x3b, 0xc8e, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc6, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1,
-0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b,
-0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8,
-0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8e, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c,
-0xcc2, 0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x3b, 0x49b, 0x430, 0x4a3,
-0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c,
-0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440,
-0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x2e, 0x3b, 0x49b, 0x430,
-0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9,
-0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b,
-0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430,
-0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d,
-0x3b, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e,
-0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e,
-0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e,
-0x3b, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72,
-0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72,
-0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61,
-0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a, 0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69,
-0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a,
-0x61, 0x3b, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b,
-0x37, 0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4,
-0x3b, 0xe7, 0x69, 0x6c, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x61, 0x64, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x3b, 0x67, 0x75, 0x6c,
-0x3b, 0x68, 0x65, 0x7a, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31,
-0x32, 0x3b, 0xe7, 0x69, 0x6c, 0x65, 0x3b, 0x73, 0x69, 0x62, 0x61, 0x74, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x6e, 0xee,
-0x73, 0x61, 0x6e, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x68, 0x65, 0x7a, 0xee, 0x72, 0x61, 0x6e, 0x3b, 0x37, 0x3b,
-0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xe7, 0x3b, 0x73, 0x3b, 0x61, 0x3b, 0x6e,
-0x3b, 0x67, 0x3b, 0x68, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b,
-0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb5, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e,
-0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e,
-0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e,
-0xea7, 0x2e, 0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2,
-0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2,
-0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2,
-0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0x3b, 0x6a, 0x61,
-0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e,
-0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67,
-0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65,
-0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69,
-0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a,
-0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c, 0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75,
-0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
-0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x72, 0x69, 0x73, 0x3b, 0x73, 0x31, 0x3b, 0x73, 0x32, 0x3b, 0x73, 0x33, 0x3b, 0x73, 0x34, 0x3b, 0x73, 0x35, 0x3b, 0x73,
-0x36, 0x3b, 0x73, 0x37, 0x3b, 0x73, 0x38, 0x3b, 0x73, 0x39, 0x3b, 0x73, 0x31, 0x30, 0x3b, 0x73, 0x31, 0x31, 0x3b, 0x73,
-0x31, 0x32, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1,
-0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
-0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d,
-0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f,
-0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e,
-0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79,
-0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69,
-0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1,
-0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254,
-0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d,
-0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x53, 0x61, 0x75, 0x3b, 0x56, 0x61, 0x73, 0x3b, 0x4b, 0x6f, 0x76, 0x3b, 0x42, 0x61,
-0x6c, 0x3b, 0x47, 0x65, 0x67, 0x3b, 0x42, 0x69, 0x72, 0x3b, 0x4c, 0x69, 0x65, 0x3b, 0x52, 0x67, 0x70, 0x3b, 0x52, 0x67,
-0x73, 0x3b, 0x53, 0x70, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x3b, 0x47, 0x72, 0x64, 0x3b, 0x73, 0x61, 0x75, 0x73, 0x69, 0x73,
-0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b,
-0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x73,
-0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69,
-0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b,
-0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444,
-0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443,
-0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e,
-0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x2e, 0x3b, 0x458, 0x430, 0x43d,
-0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430,
-0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430,
-0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e,
-0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440,
-0x438, 0x3b, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b,
-0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72,
-0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70,
-0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79, 0x3b,
-0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73,
-0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69,
-0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xd1c, 0xd28, 0xd41,
-0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b,
-0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38,
-0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f,
-0xd38, 0xd02, 0x3b, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b,
-0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd32, 0xd4d, 0x200d, 0x3b, 0xd2e,
-0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd06, 0xd17, 0xd38, 0xd4d, 0xd31,
-0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd12, 0xd15, 0xd4d,
-0xd1f, 0xd4b, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c,
-0xd30, 0xd4d, 0x200d, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd47, 0x3b, 0xd1c, 0xd42, 0x3b,
-0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
-0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c,
-0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44,
-0x69, 0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75,
-0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c,
-0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62,
-0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b,
-0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120,
-0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65,
-0x3b, 0x50, 0x113, 0x70, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x101, 0x65, 0x68, 0x65, 0x3b, 0x100, 0x70, 0x65, 0x72, 0x69,
-0x72, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x48, 0x75, 0x6e, 0x65, 0x3b, 0x48, 0x16b, 0x72, 0x61, 0x65, 0x3b, 0x100, 0x6b,
-0x75, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65, 0x70, 0x65, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f,
-0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x68, 0x65, 0x6d, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947,
-0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d,
-0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948,
-0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f,
-0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c,
-0x930, 0x3b, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c,
-0x941, 0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x3b, 0x445, 0x443, 0x43b, 0x3b, 0x4af, 0x445,
-0x44d, 0x3b, 0x431, 0x430, 0x440, 0x3b, 0x442, 0x443, 0x443, 0x3b, 0x43b, 0x443, 0x443, 0x3b, 0x43c, 0x43e, 0x433, 0x3b, 0x43c, 0x43e,
-0x440, 0x3b, 0x445, 0x43e, 0x43d, 0x3b, 0x431, 0x438, 0x447, 0x3b, 0x442, 0x430, 0x445, 0x3b, 0x43d, 0x43e, 0x445, 0x3b, 0x433, 0x430,
-0x445, 0x3b, 0x425, 0x443, 0x43b, 0x433, 0x430, 0x43d, 0x430, 0x3b, 0x4ae, 0x445, 0x44d, 0x440, 0x3b, 0x411, 0x430, 0x440, 0x3b, 0x422,
-0x443, 0x443, 0x43b, 0x430, 0x439, 0x3b, 0x41b, 0x443, 0x443, 0x3b, 0x41c, 0x43e, 0x433, 0x43e, 0x439, 0x3b, 0x41c, 0x43e, 0x440, 0x44c,
-0x3b, 0x425, 0x43e, 0x43d, 0x44c, 0x3b, 0x411, 0x438, 0x447, 0x3b, 0x422, 0x430, 0x445, 0x438, 0x430, 0x3b, 0x41d, 0x43e, 0x445, 0x43e,
-0x439, 0x3b, 0x413, 0x430, 0x445, 0x430, 0x439, 0x3b, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
-0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x3b, 0x905,
-0x917, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921,
-0x93f, 0x938, 0x947, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b,
-0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b,
-0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d,
-0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b,
-0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c,
-0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x3b, 0x91c, 0x928, 0x935, 0x930,
-0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x947, 0x932,
-0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b,
-0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928,
-0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x6a, 0x61, 0x6e, 0x2e,
-0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b,
-0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x67, 0x65,
-0x6e, 0x69, 0xe8, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x69, 0xe8, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62,
-0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x65, 0x74, 0x3b,
-0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0xf2, 0x62,
-0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb4d, 0xb30, 0xb41, 0xb5f, 0xb3e, 0xb30, 0xb40, 0x3b,
-0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41,
-0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47,
-0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30,
-0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05,
-0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21,
-0xb3f, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b,
-0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627,
-0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648,
-0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c,
-0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631,
-0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631,
-0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633,
-0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b,
-0x622, 0x6af, 0x648, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b,
-0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b,
-0x622, 0x3b, 0x645, 0x6cc, 0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x62c,
-0x646, 0x648, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644,
-0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a,
-0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633,
-0x645, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b,
-0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627,
-0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b,
-0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75,
-0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69,
-0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72,
-0x75, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d, 0x61,
-0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x63, 0x7a,
-0x65, 0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x6e, 0x69, 0x61,
-0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69,
-0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x6e, 0x69, 0x61,
-0x3b, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70,
-0x3b, 0x6c, 0x3b, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f,
-0x3b, 0x46, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x41, 0x62, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b,
-0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75,
-0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72,
-0x6f, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61,
-0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x75,
-0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x7a, 0x3b, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65,
-0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f,
-0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0xa1c,
-0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d,
-0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38,
-0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30,
-0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c, 0x3b, 0xa2b, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42,
-0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b,
-0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b,
-0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628,
-0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631,
-0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61,
-0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e,
-0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f,
-0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72,
-0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b,
-0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76,
-0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65,
-0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
-0x4e, 0x3b, 0x44, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61,
-0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b, 0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75,
-0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64,
-0x65, 0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61,
-0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69,
-0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69,
-0x65, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440,
-0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b,
-0x44f, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
-0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440,
-0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x44f,
-0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x430, 0x3b, 0x441,
-0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
-0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x3b, 0x42f, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c,
-0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b, 0x414, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x46,
-0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c,
-0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b,
-0x61, 0x6b, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b,
-0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b, 0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc,
-0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc,
-0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4,
-0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x458, 0x430,
-0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443,
-0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e,
-0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440,
-0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b,
-0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440,
-0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435,
-0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430,
-0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d,
-0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c,
-0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440,
-0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76,
-0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70,
-0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75,
-0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6a,
-0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e,
-0x3b, 0x64, 0x3b, 0x50, 0x68, 0x65, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x55, 0x62, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x3b, 0x4d,
-0x6f, 0x74, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x55, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x3b, 0x4d,
-0x70, 0x68, 0x3b, 0x50, 0x75, 0x6e, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x50, 0x68, 0x65, 0x73, 0x65, 0x6b, 0x67, 0x6f, 0x6e,
-0x67, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x3b,
-0x4d, 0x6d, 0x65, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x61, 0x6e, 0x6f, 0x6e, 0x67, 0x3b, 0x50, 0x68,
-0x75, 0x70, 0x6a, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x4c,
-0x65, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x75, 0x6e, 0x64,
-0x75, 0x6e, 0x67, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x74, 0x77, 0x65, 0x3b, 0x46, 0x65, 0x72, 0x3b,
-0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x6f, 0x70, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x53, 0x65, 0x65, 0x3b,
-0x50, 0x68, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x3b, 0x4e, 0x67, 0x77, 0x3b,
-0x53, 0x65, 0x64, 0x3b, 0x46, 0x65, 0x72, 0x69, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x54, 0x6c, 0x68, 0x61, 0x6b, 0x6f,
-0x6c, 0x65, 0x3b, 0x4d, 0x6f, 0x70, 0x69, 0x74, 0x6c, 0x6f, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b,
-0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x67, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x53, 0x65, 0x65, 0x74, 0x65, 0x62, 0x6f,
-0x73, 0x69, 0x67, 0x6f, 0x3b, 0x50, 0x68, 0x75, 0x6b, 0x77, 0x69, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x77, 0x65, 0x3b, 0x4c,
-0x77, 0x65, 0x74, 0x73, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4e, 0x67, 0x77, 0x61,
-0x6e, 0x61, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x53, 0x65, 0x64, 0x69, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6f, 0x6c, 0x65,
-0x3b, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x69,
-0x3b, 0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d,
-0x3b, 0x4d, 0x62, 0x3b, 0x5a, 0x76, 0x69, 0x3b, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a,
-0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68,
-0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75,
-0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75,
-0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a,
-0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b,
-0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8,
-0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0x3b, 0xdb8, 0xdd0, 0xdba, 0x3b, 0xda2, 0xdd6, 0xdb1,
-0x3b, 0xda2, 0xdd6, 0xdbd, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0x3b, 0xd94, 0xd9a, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0,
-0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0x3b,
-0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b,
-0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4,
-0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc,
-0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xda2, 0x3b,
-0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3,
-0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xddc, 0x3b, 0xdaf, 0xdd9, 0x3b, 0x42, 0x68, 0x69, 0x3b, 0x56, 0x61, 0x6e, 0x3b, 0x56, 0x6f,
-0x6c, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x68, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4e, 0x67,
-0x63, 0x3b, 0x4e, 0x79, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4e, 0x67, 0x6f, 0x3b, 0x42, 0x68,
-0x69, 0x6d, 0x62, 0x69, 0x64, 0x76, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x61, 0x6e, 0x61,
-0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x75, 0x2d, 0x6c, 0x65, 0x6e, 0x6b, 0x68, 0x75, 0x6c, 0x75, 0x3b, 0x4d, 0x61,
-0x62, 0x61, 0x73, 0x61, 0x3b, 0x69, 0x4e, 0x6b, 0x68, 0x77, 0x65, 0x6b, 0x68, 0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e,
-0x68, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x4b, 0x68, 0x6f, 0x6c, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x67, 0x63, 0x69,
-0x3b, 0x69, 0x4e, 0x79, 0x6f, 0x6e, 0x69, 0x3b, 0x69, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x74,
-0x69, 0x3b, 0x69, 0x4e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x6e, 0x69, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b,
-0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b,
-0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72,
-0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b,
-0x6a, 0xfa, 0x6c, 0x61, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b,
-0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b,
-0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x62, 0x3b, 0x4c,
-0x61, 0x62, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x41, 0x66, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x4c, 0x69, 0x78, 0x3b, 0x54,
-0x6f, 0x64, 0x3b, 0x53, 0x69, 0x64, 0x3b, 0x53, 0x61, 0x67, 0x3b, 0x54, 0x6f, 0x62, 0x3b, 0x4b, 0x49, 0x54, 0x3b, 0x4c,
-0x49, 0x54, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
-0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64,
-0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41, 0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42,
-0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c,
-0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64,
-0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
-0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54,
-0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f,
-0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20,
-0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x41, 0x3b,
-0x53, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x65, 0x6e, 0x65, 0x3b,
-0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
-0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
-0x64, 0x69, 0x63, 0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61,
-0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f,
-0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x69, 0x65,
-0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
-0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62,
-0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a,
-0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424,
-0x435, 0x432, 0x3b, 0x41c, 0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418,
-0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414,
-0x435, 0x43a, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442,
-0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410,
-0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440,
-0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf,
-0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2,
-0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95,
-0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0x3b, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf,
-0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd,
-0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd,
-0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbc6, 0xbae, 0xbcd, 0xbaa, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa,
-0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b,
-0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86,
-0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c,
-0xc4d, 0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d,
-0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc42, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41,
-0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d,
-0x3b, 0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc1c, 0x3b, 0xc2b,
-0xc3f, 0x3b, 0xc2e, 0x3b, 0xc0e, 0x3b, 0xc2e, 0xc46, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b,
-0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e,
-0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b,
-0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b,
-0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21,
-0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22,
-0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01,
-0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32,
-0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b,
-0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0x3b, 0xe01, 0x3b, 0xe21, 0x3b, 0xe21, 0x3b, 0xe1e, 0x3b, 0xe21, 0x3b,
-0xe01, 0x3b, 0xe2a, 0x3b, 0xe01, 0x3b, 0xe15, 0x3b, 0xe1e, 0x3b, 0xe18, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
-0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x3b,
-0x1218, 0x130b, 0x1262, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x3b, 0x130d, 0x1295, 0x1266, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290,
-0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x3b, 0x1325, 0x1245, 0x121d, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x3b, 0x1325,
-0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266,
-0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325,
-0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x1235, 0x3b, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70,
-0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69,
-0x75, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b,
-0x54, 0x12b, 0x73, 0x3b, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b,
-0x4d, 0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53,
-0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53,
-0x65, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76,
-0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x59,
-0x61, 0x6e, 0x3b, 0x4b, 0x75, 0x6c, 0x3b, 0x44, 0x7a, 0x69, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4d,
-0x61, 0x77, 0x3b, 0x4d, 0x68, 0x61, 0x3b, 0x4e, 0x64, 0x7a, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x48, 0x75, 0x6b, 0x3b, 0x4e,
-0x27, 0x77, 0x3b, 0x53, 0x75, 0x6e, 0x67, 0x75, 0x74, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x6e, 0x79, 0x61,
-0x6e, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x75, 0x6c, 0x75, 0x3b, 0x44, 0x7a, 0x69, 0x76, 0x61,
-0x6d, 0x69, 0x73, 0x6f, 0x6b, 0x6f, 0x3b, 0x4d, 0x75, 0x64, 0x79, 0x61, 0x78, 0x69, 0x68, 0x69, 0x3b, 0x4b, 0x68, 0x6f,
-0x74, 0x61, 0x76, 0x75, 0x78, 0x69, 0x6b, 0x61, 0x3b, 0x4d, 0x61, 0x77, 0x75, 0x77, 0x61, 0x6e, 0x69, 0x3b, 0x4d, 0x68,
-0x61, 0x77, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x64, 0x7a, 0x68, 0x61, 0x74, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67,
-0x75, 0x6c, 0x61, 0x3b, 0x48, 0x75, 0x6b, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x27, 0x77, 0x65, 0x6e, 0x64, 0x7a, 0x61, 0x6d,
-0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73,
-0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b, 0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c,
-0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75,
-0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69, 0x73, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73,
-0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73,
-0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d,
-0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b,
-0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0x441, 0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442,
-0x2e, 0x3b, 0x431, 0x435, 0x440, 0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b, 0x447,
-0x435, 0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438, 0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e,
-0x3b, 0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x2e, 0x3b, 0x441,
-0x456, 0x447, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b,
-0x43a, 0x432, 0x456, 0x442, 0x43d, 0x44f, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d, 0x44f,
-0x3b, 0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d,
-0x44f, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433,
-0x440, 0x443, 0x434, 0x43d, 0x44f, 0x3b, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b,
-0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631,
-0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x20, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646,
-0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
-0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x41c, 0x443, 0x4b3,
-0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x430,
-0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416, 0x443, 0x43c,
-0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443,
-0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b, 0x420, 0x430, 0x43c,
-0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a, 0x434,
-0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x3b,
-0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b,
-0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x3b,
-0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68,
-0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0x67, 0x20,
-0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x30,
-0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x62, 0x61, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0x1b0, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6e,
-0x103, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x73, 0xe1, 0x75, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x62,
-0x1ea3, 0x79, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0xe1, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x63,
-0x68, 0xed, 0x6e, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69,
-0x20, 0x68, 0x61, 0x69, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61, 0x77, 0x72, 0x74,
-0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72,
-0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63,
-0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72,
-0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x61, 0x66, 0x3b, 0x41,
-0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68,
-0x77, 0x65, 0x64, 0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x45,
-0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x3b, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
-0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
-0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d,
-0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73,
-0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b,
-0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72,
-0x1eb9, 0x323, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9,
-0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b,
-0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9,
-0x6c, 0xfa, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1e62, 0x1eb8, 0x301, 0x72, 0x1eb9, 0x301, 0x3b,
-0x4f, 0x1e62, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0,
-0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69,
-0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd,
-0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b,
-0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b,
-0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
-0x73, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61,
-0x6e, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73,
-0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
-0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65,
-0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
-0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b,
-0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75,
-0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69,
-0x6c, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x76, 0x67, 0x75,
-0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72,
-0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a,
-0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74,
-0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f,
-0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73,
-0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69,
-0x72, 0x3b, 0x4d, 0x2e, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2e, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b,
-0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69,
-0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76,
-0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f,
-0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c,
-0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72,
-0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48,
-0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b,
-0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x57, 0x68, 0x65, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b,
-0x45, 0x66, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b,
-0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x4d, 0x79,
-0x73, 0x20, 0x57, 0x68, 0x65, 0x76, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x72, 0x74, 0x68, 0x3b,
-0x4d, 0x79, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x4d, 0x79, 0x73,
-0x20, 0x45, 0x66, 0x61, 0x6e, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b,
-0x4d, 0x79, 0x65, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x77, 0x79, 0x6e, 0x67, 0x61, 0x6c, 0x61,
-0x3b, 0x4d, 0x79, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x44, 0x75, 0x3b, 0x4d, 0x79,
-0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x3b, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45,
-0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44,
-0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x3b, 0x53,
-0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d,
-0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b,
-0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75,
-0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69,
-0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d,
-0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73,
-0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b,
-0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65,
-0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d,
-0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b,
-0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d,
-0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x913, 0x917, 0x938, 0x94d,
-0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x913, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b,
-0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x41, 0x68,
-0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x3b, 0x4f, 0x63, 0x68, 0x3b, 0x41, 0x62, 0x65, 0x3b, 0x41, 0x67, 0x62, 0x3b, 0x4f, 0x74,
-0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x3b, 0x41, 0x6c,
-0x65, 0x3b, 0x41, 0x66, 0x75, 0x3b, 0x41, 0x68, 0x61, 0x72, 0x61, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x6f,
-0x3b, 0x4f, 0x63, 0x68, 0x6f, 0x6b, 0x72, 0x69, 0x6b, 0x72, 0x69, 0x3b, 0x41, 0x62, 0x65, 0x69, 0x62, 0x65, 0x65, 0x3b,
-0x41, 0x67, 0x62, 0x65, 0x69, 0x6e, 0x61, 0x61, 0x3b, 0x4f, 0x74, 0x75, 0x6b, 0x77, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x4d,
-0x61, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41,
-0x6e, 0x74, 0x6f, 0x6e, 0x3b, 0x41, 0x6c, 0x65, 0x6d, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x61, 0x62, 0x65, 0x65, 0x3b,
-0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b,
-0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x65, 0x6e, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62,
-0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x3b,
-0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73,
-0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65,
-0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f,
-0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b,
-0x6c, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61,
-0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74,
-0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f,
-0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b,
-0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d,
-0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b,
-0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b,
-0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f,
-0x712, 0x3b, 0x72b, 0x712, 0x71b, 0x3b, 0x710, 0x715, 0x72a, 0x3b, 0x722, 0x71d, 0x723, 0x722, 0x3b, 0x710, 0x71d, 0x72a, 0x3b, 0x71a,
-0x719, 0x71d, 0x72a, 0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719, 0x3b, 0x710, 0x712, 0x3b, 0x710, 0x71d, 0x720, 0x718, 0x720, 0x3b, 0x70f,
-0x72c, 0x72b, 0x20, 0x70f, 0x710, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x712, 0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f, 0x710, 0x3b,
-0x120d, 0x12f0, 0x1275, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x3b, 0x12ad, 0x1262, 0x1245, 0x3b,
-0x121d, 0x2f, 0x1275, 0x3b, 0x12b0, 0x122d, 0x3b, 0x121b, 0x122d, 0x12eb, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d,
-0x2f, 0x121d, 0x3b, 0x1270, 0x1215, 0x1233, 0x3b, 0x120d, 0x12f0, 0x1275, 0x122a, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x1265, 0x1272, 0x3b, 0x12ad, 0x1265,
-0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x122a, 0x3b, 0x12ad, 0x1262, 0x1245, 0x122a, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1275, 0x131f, 0x1292,
-0x122a, 0x3b, 0x12b0, 0x122d, 0x12a9, 0x3b, 0x121b, 0x122d, 0x12eb, 0x121d, 0x20, 0x1275, 0x122a, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x20, 0x1218, 0x1233,
-0x1245, 0x1208, 0x122a, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1218, 0x123d, 0x12c8, 0x122a, 0x3b, 0x1270, 0x1215,
-0x1233, 0x1235, 0x122a, 0x3b, 0x120d, 0x3b, 0x12ab, 0x3b, 0x12ad, 0x3b, 0x134b, 0x3b, 0x12ad, 0x3b, 0x121d, 0x3b, 0x12b0, 0x3b, 0x121b, 0x3b,
-0x12eb, 0x3b, 0x1218, 0x3b, 0x121d, 0x3b, 0x1270, 0x3b, 0x1320, 0x1210, 0x1228, 0x3b, 0x12a8, 0x1270, 0x1270, 0x3b, 0x1218, 0x1308, 0x1260, 0x3b,
-0x12a0, 0x1280, 0x12d8, 0x3b, 0x130d, 0x1295, 0x1263, 0x1275, 0x3b, 0x1220, 0x1295, 0x12e8, 0x3b, 0x1210, 0x1218, 0x1208, 0x3b, 0x1290, 0x1210, 0x1230,
-0x3b, 0x12a8, 0x1228, 0x1218, 0x3b, 0x1320, 0x1240, 0x1218, 0x3b, 0x1280, 0x12f0, 0x1228, 0x3b, 0x1280, 0x1220, 0x1220, 0x3b, 0x1320, 0x3b, 0x12a8,
-0x3b, 0x1218, 0x3b, 0x12a0, 0x3b, 0x130d, 0x3b, 0x1220, 0x3b, 0x1210, 0x3b, 0x1290, 0x3b, 0x12a8, 0x3b, 0x1320, 0x3b, 0x1280, 0x3b, 0x1280,
-0x3b, 0x57, 0x65, 0x79, 0x3b, 0x46, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x75, 0x79,
-0x3b, 0x54, 0x73, 0x6f, 0x3b, 0x54, 0x61, 0x66, 0x3b, 0x57, 0x61, 0x72, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x42, 0x61, 0x6e,
-0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x53, 0x61, 0x75, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x65, 0x79, 0x65, 0x6e, 0x65, 0x3b,
-0x46, 0x61, 0x69, 0x20, 0x46, 0x61, 0x6e, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x74, 0x61, 0x6b, 0x61, 0x3b,
-0x46, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x6e, 0x67, 0x72, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x75, 0x79, 0x6f, 0x3b,
-0x46, 0x61, 0x69, 0x20, 0x54, 0x73, 0x6f, 0x79, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x66, 0x61, 0x6b, 0x61,
-0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4b, 0x75, 0x6e,
-0x6f, 0x62, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x42, 0x61, 0x6e, 0x73, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20,
-0x4b, 0x6f, 0x6d, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x53, 0x61, 0x75, 0x6b, 0x3b, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x42, 0x61,
-0x61, 0x3b, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x74, 0x79, 0x6f, 0x3b, 0x41, 0x63, 0x68,
-0x69, 0x3b, 0x41, 0x74, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x75, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61,
-0x6b, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x4e, 0x61, 0x74, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x44, 0x79, 0x6f, 0x6e,
-0x3b, 0x50, 0x65, 0x6e, 0x20, 0x42, 0x61, 0x27, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x50,
-0x65, 0x6e, 0x20, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65,
-0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x72, 0x69, 0x6d, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x72, 0x69, 0x62,
-0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x77, 0x75, 0x72, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64,
-0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x6b, 0x75, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75,
-0x72, 0x20, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x74, 0x61, 0x74,
-0x3b, 0x41, 0x331, 0x79, 0x72, 0x3b, 0x41, 0x331, 0x68, 0x77, 0x3b, 0x41, 0x331, 0x74, 0x61, 0x3b, 0x41, 0x331, 0x6e, 0x61,
-0x3b, 0x41, 0x331, 0x70, 0x66, 0x3b, 0x41, 0x331, 0x6b, 0x69, 0x3b, 0x41, 0x331, 0x74, 0x79, 0x3b, 0x41, 0x331, 0x6e, 0x69,
-0x3b, 0x41, 0x331, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b, 0x53, 0x62, 0x79, 0x3b, 0x53, 0x62, 0x68, 0x3b, 0x48, 0x79,
-0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331,
-0x68, 0x77, 0x61, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77, 0x61,
-0x6e, 0x20, 0x41, 0x331, 0x6e, 0x61, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x70, 0x66, 0x77,
-0x6f, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x69, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77,
-0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x79, 0x69, 0x72, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331,
-0x6e, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x75, 0x6d, 0x76, 0x69, 0x72,
-0x69, 0x79, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x3b, 0x48, 0x79, 0x77, 0x61,
-0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77,
-0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x5a, 0x65, 0x6e, 0x3b,
-0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b,
-0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
-0x44, 0x69, 0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72,
-0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69,
-0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62,
-0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x75, 0x68, 0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x6d,
-0x3b, 0x53, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4b, 0x68, 0x75,
-0x3b, 0x54, 0x73, 0x68, 0x3b, 0x1e3c, 0x61, 0x72, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x50, 0x68, 0x61, 0x6e, 0x64, 0x6f, 0x3b,
-0x4c, 0x75, 0x68, 0x75, 0x68, 0x69, 0x3b, 0x1e70, 0x68, 0x61, 0x66, 0x61, 0x6d, 0x75, 0x68, 0x77, 0x65, 0x3b, 0x4c, 0x61,
-0x6d, 0x62, 0x61, 0x6d, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x74, 0x68, 0x75, 0x6c, 0x65, 0x3b,
-0x46, 0x75, 0x6c, 0x77, 0x69, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x61, 0x6e, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x6e, 0x67, 0x75,
-0x6c, 0x65, 0x3b, 0x4b, 0x68, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x6d,
-0x65, 0x64, 0x7a, 0x69, 0x3b, 0x1e3c, 0x61, 0x72, 0x61, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x64, 0x61, 0x76, 0x68, 0x75, 0x73,
-0x69, 0x6b, 0x75, 0x3b, 0x44, 0x7a, 0x76, 0x3b, 0x44, 0x7a, 0x64, 0x3b, 0x54, 0x65, 0x64, 0x3b, 0x41, 0x66, 0x254, 0x3b,
-0x44, 0x61, 0x6d, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x53, 0x69, 0x61, 0x3b, 0x44, 0x65, 0x61, 0x3b, 0x41, 0x6e, 0x79, 0x3b,
-0x4b, 0x65, 0x6c, 0x3b, 0x41, 0x64, 0x65, 0x3b, 0x44, 0x7a, 0x6d, 0x3b, 0x44, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x44, 0x7a,
-0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x54, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x41, 0x66, 0x254, 0x66, 0x69, 0x25b, 0x3b, 0x44,
-0x61, 0x6d, 0x61, 0x3b, 0x4d, 0x61, 0x73, 0x61, 0x3b, 0x53, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x44, 0x65, 0x61,
-0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x41, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x4b, 0x65, 0x6c, 0x65,
-0x3b, 0x41, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x6d, 0x65, 0x3b, 0x44,
-0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x41,
-0x3b, 0x44, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41,
-0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x75,
-0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b,
-0x2e, 0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b,
-0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
-0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b,
-0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e,
-0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4a, 0x75, 0x77,
-0x3b, 0x53, 0x77, 0x69, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x54, 0x73, 0x77, 0x3b, 0x41, 0x74, 0x61,
-0x3b, 0x41, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b, 0x4d, 0x61, 0x6e,
-0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4a, 0x75, 0x77, 0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61,
-0x74, 0x20, 0x53, 0x77, 0x69, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73, 0x61, 0x74, 0x3b,
-0x5a, 0x77, 0x61, 0x74, 0x20, 0x4e, 0x79, 0x61, 0x69, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73, 0x77, 0x6f, 0x6e,
-0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x74, 0x61, 0x61, 0x68, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x6e, 0x61,
-0x74, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x72, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x5a, 0x77, 0x61, 0x74,
-0x20, 0x41, 0x6b, 0x75, 0x62, 0x75, 0x6e, 0x79, 0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61,
-0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6a, 0x75, 0x77, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77,
-0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x2d, 0x4d, 0x61, 0x2d, 0x53, 0x75, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x6c, 0x3b, 0x45, 0x70, 0x75, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x6c,
-0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x75, 0x6c, 0x6f, 0x3b,
-0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x69,
-0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x75, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x74, 0x6f, 0x62, 0x61,
-0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x45, 0x6e, 0x65,
-0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e,
-0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62,
-0x3b, 0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d,
-0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79,
-0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79, 0x65,
-0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e,
-0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa,
-0x3b, 0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa,
-0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x72, 0x68, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74,
-0x3b, 0x55, 0x73, 0x69, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x46,
-0x65, 0x62, 0x65, 0x72, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x74, 0x6a, 0x68, 0x69, 0x3b, 0x75, 0x2d, 0x41,
-0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61,
-0x79, 0x69, 0x3b, 0x41, 0x72, 0x68, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x55, 0x73, 0x69, 0x6e, 0x79, 0x69, 0x6b, 0x68, 0x61, 0x62, 0x61,
-0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74,
-0x3b, 0x41, 0x70, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f,
-0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e,
-0x61, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x65, 0x72, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x161,
-0x68, 0x65, 0x3b, 0x41, 0x70, 0x6f, 0x72, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b,
-0x4a, 0x75, 0x6c, 0x61, 0x65, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x65, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d,
-0x65, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x6f, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x65, 0x72,
-0x65, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x3b,
-0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x3b,
-0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e,
-0x65, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f,
-0x74, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x3b, 0x6f, 0x111, 0x111, 0x61,
-0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e,
-0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61,
-0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e,
-0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d, 0xe1,
-0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1,
-0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
-0x3b, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b, 0x47,
-0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b,
-0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62,
-0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a,
-0x75, 0x6f, 0x76, 0x3b, 0x4b, 0x69, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x3b, 0x54, 0x72, 0x69, 0x3b, 0x53, 0x70, 0x69, 0x3b,
-0x52, 0x69, 0x69, 0x3b, 0x4d, 0x74, 0x69, 0x3b, 0x45, 0x6d, 0x69, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x6e, 0x69, 0x3b,
-0x4d, 0x78, 0x69, 0x3b, 0x4d, 0x78, 0x6b, 0x3b, 0x4d, 0x78, 0x64, 0x3b, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69,
-0x64, 0x61, 0x73, 0x3b, 0x44, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x54, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61,
-0x73, 0x3b, 0x53, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x69, 0x64, 0x61,
-0x73, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x45, 0x6d, 0x70, 0x69, 0x74, 0x75,
-0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x73, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x6e,
-0x67, 0x61, 0x72, 0x69, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73,
-0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d,
-0x61, 0x78, 0x61, 0x6c, 0x20, 0x64, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b,
-0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x43, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72,
-0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
-0x62, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x49, 0x6d,
-0x62, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61,
-0x72, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d,
-0x77, 0x3b, 0x49, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69,
-0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f,
-0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20,
-0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20,
-0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72,
-0x61, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75,
-0x6e, 0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79,
-0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64,
-0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f,
-0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77,
-0x65, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x69, 0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d,
-0x3b, 0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d,
-0x62, 0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a,
-0x75, 0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x3b, 0x73,
-0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65,
-0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72,
-0x73, 0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f,
-0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x3b, 0x73, 0x3b, 0x63, 0x3b,
-0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x3b,
-0x4a, 0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b,
-0x57, 0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b,
-0x57, 0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20,
-0x67, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x65, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20,
-0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b,
-0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d,
-0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b,
-0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x3b, 0x4f, 0x62, 0x6f,
-0x3b, 0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65,
-0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62,
-0x3b, 0x54, 0x6f, 0x77, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70,
-0x61, 0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f,
-0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e,
-0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
-0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c,
-0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b,
-0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61,
-0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4f, 0x3b,
-0x57, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b,
-0x54, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74,
-0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65,
-0x76, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75,
-0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b,
-0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x5a, 0x69,
-0x62, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b, 0x4e, 0x68,
-0x6c, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x4c, 0x77,
-0x65, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e, 0x68, 0x6c,
-0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x62,
-0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e,
-0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77, 0x61, 0x62,
-0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x6d, 0x66,
-0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x5a, 0x3b,
-0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b,
-0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61,
-0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75,
-0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b,
-0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x69,
-0x6e, 0x6e, 0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79,
-0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e,
-0x75, 0x77, 0x3b, 0x64, 0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b,
-0x6d, 0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e,
-0x79, 0x75, 0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e,
-0x62, 0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64,
-0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b,
-0x79, 0x3b, 0x263, 0x3b, 0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b,
-0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b,
-0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x3b,
-0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65,
-0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75,
-0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b,
-0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x4e, 0x75, 0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d,
-0x62, 0x65, 0x1e5b, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b,
-0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b,
-0x4b, 0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b, 0x4b, 0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b,
-0x4b, 0x4d, 0x4e, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b, 0x4b, 0x4e, 0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x3b, 0x4f, 0x6b, 0x77, 0x6f,
-0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
-0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61,
-0x61, 0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77,
-0x61, 0x6d, 0x75, 0x6e, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b,
-0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b,
-0x54, 0x61, 0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b,
-0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4b, 0x6d, 0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20,
-0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61,
-0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70,
-0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70,
-0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b,
-0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70,
-0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61,
-0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20,
-0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
-0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a,
-0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69,
-0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48, 0x3b,
-0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61,
-0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b,
-0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6e, 0x61, 0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b,
-0x7a, 0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b,
-0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61, 0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75,
-0x72, 0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b,
-0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e, 0x3b, 0x7a, 0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b,
-0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b,
-0x6e, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b,
-0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b,
-0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61, 0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b,
-0x47, 0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b,
-0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x67, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x129, 0x72,
-0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61,
-0x74, 0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67,
-0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e,
-0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b, 0x61, 0x129, 0x72, 0x129, 0x3b, 0x4d,
-0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49,
-0x3b, 0x49, 0x3b, 0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0, 0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad,
-0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b, 0x13da, 0x13b5, 0x3b, 0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a4, 0x13cd, 0x3b, 0x13a4,
-0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5, 0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd,
-0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0, 0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd,
-0x13d7, 0x3b, 0x13da, 0x13c2, 0x13c5, 0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a4, 0x13cd, 0x13a9, 0x13f1, 0x3b, 0x13a4, 0x3b, 0x13a7,
-0x3b, 0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab, 0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a4,
-0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b,
-0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x69,
-0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e,
-0x3b, 0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b,
-0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d, 0x3b, 0x7a, 0x3b, 0x66, 0x3b,
-0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b, 0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b,
-0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x4e, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75,
-0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77,
-0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65,
-0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69,
-0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e,
-0x61, 0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e,
-0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
-0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61,
-0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e,
-0x61, 0x20, 0x4d, 0x3b, 0x46, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65,
-0x65, 0x6e, 0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa, 0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61,
-0x3b, 0x49, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268, 0x268,
-0x72, 0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x49, 0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b,
-0x53, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x289, 0x66, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289, 0x6e,
-0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b, 0x75,
-0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69,
-0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289, 0x76,
-0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x69,
-0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x46, 0x3b,
-0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b,
-0x53, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61,
-0x61, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b,
-0x69, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b,
-0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75,
-0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61,
-0x79, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x69, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44,
-0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70,
-0x72, 0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f,
-0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
-0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74,
-0x75, 0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x76,
-0x65, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x75, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61,
-0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74,
-0x75, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75,
-0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x7a, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x41, 0x4e, 0x3b,
-0x46, 0x45, 0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b, 0x128, 0x50, 0x55, 0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b,
-0x4e, 0x4a, 0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b, 0x53, 0x50, 0x54, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b,
-0x44, 0x45, 0x43, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x75, 0x61, 0x72,
-0x129, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x128, 0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a,
-0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67,
-0x61, 0x3b, 0x4b, 0x69, 0x70, 0x3b, 0x49, 0x77, 0x61, 0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x57, 0x61, 0x6b, 0x3b, 0x52, 0x6f,
-0x70, 0x3b, 0x4b, 0x6f, 0x67, 0x3b, 0x42, 0x75, 0x72, 0x3b, 0x45, 0x70, 0x65, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x41, 0x65,
-0x6e, 0x3b, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x27, 0x61, 0x74, 0x79, 0x61, 0x74, 0x6f, 0x3b, 0x4b,
-0x69, 0x70, 0x74, 0x61, 0x6d, 0x6f, 0x3b, 0x49, 0x77, 0x61, 0x74, 0x20, 0x6b, 0x75, 0x74, 0x3b, 0x4e, 0x67, 0x27, 0x65,
-0x69, 0x79, 0x65, 0x74, 0x3b, 0x57, 0x61, 0x6b, 0x69, 0x3b, 0x52, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x4b, 0x69, 0x70,
-0x6b, 0x6f, 0x67, 0x61, 0x67, 0x61, 0x3b, 0x42, 0x75, 0x72, 0x65, 0x74, 0x3b, 0x45, 0x70, 0x65, 0x73, 0x6f, 0x3b, 0x4b,
-0x69, 0x70, 0x73, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x6e,
-0x64, 0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49,
-0x3b, 0x4e, 0x3b, 0x57, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x1c3, 0x4b, 0x68,
-0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75,
-0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3, 0x48, 0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b,
-0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47, 0x61, 0x6d, 0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68,
-0x6f, 0x65, 0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41, 0x6f, 0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2,
-0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2,
-0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62, 0x3b, 0x1c0, 0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b,
-0x48, 0xf4, 0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0xe4,
-0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0xe4, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74,
-0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x3b,
-0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b,
-0x4d, 0xe4, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f,
-0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
-0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b, 0x186, 0x25b, 0x6e, 0x3b, 0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52,
-0x6f, 0x6b, 0x3b, 0x53, 0xe1, 0x73, 0x3b, 0x42, 0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed, 0x73, 0x3b,
-0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x3b, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41,
-0x72, 0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301, 0x254, 0x268, 0x14b, 0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f,
-0x79, 0xed, 0xf3, 0x72, 0xed, 0xea, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c,
-0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa,
-0x254, 0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75, 0x73, 0xe1, 0x73, 0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268,
-0x301, 0x62, 0x254, 0x301, 0x72, 0xe1, 0x72, 0x25b, 0x3b, 0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed,
-0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68, 0x289, 0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301,
-0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
-0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x52, 0x61,
-0x72, 0x3b, 0x4d, 0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f,
-0x64, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50, 0x65, 0x64, 0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61,
-0x62, 0x3b, 0x50, 0x6f, 0x6f, 0x3b, 0x4f, 0x72, 0x61, 0x72, 0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77,
-0x61, 0x6d, 0x67, 0x27, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67, 0x27, 0x65, 0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b,
-0x3b, 0x4f, 0x6d, 0x6f, 0x64, 0x6f, 0x6b, 0x27, 0x6b, 0x69, 0x6e, 0x67, 0x27, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c,
-0x61, 0x3b, 0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x4f, 0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61,
-0x3b, 0x4f, 0x74, 0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x3b,
-0x52, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b,
-0x4c, 0x3b, 0x50, 0x3b, 0x17d, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x69, 0x3b,
-0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75, 0x79, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65, 0x3b, 0x17d, 0x61, 0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65,
-0x65, 0x77, 0x69, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d, 0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53,
-0x65, 0x6b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f,
-0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x44, 0x65, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x17d, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
-0x44, 0x3b, 0x44, 0x41, 0x43, 0x3b, 0x44, 0x41, 0x52, 0x3b, 0x44, 0x41, 0x44, 0x3b, 0x44, 0x41, 0x4e, 0x3b, 0x44, 0x41,
-0x48, 0x3b, 0x44, 0x41, 0x55, 0x3b, 0x44, 0x41, 0x4f, 0x3b, 0x44, 0x41, 0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41,
-0x50, 0x3b, 0x44, 0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x63,
-0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44,
-0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
-0x41, 0x6e, 0x67, 0x27, 0x77, 0x65, 0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x63,
-0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x75, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77,
-0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61,
-0x72, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4f, 0x63, 0x68, 0x69,
-0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20,
-0x6d, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61,
-0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x43, 0x3b, 0x52, 0x3b,
-0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x3b,
-0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b,
-0x4e, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6a, 0x3b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65, 0x62,
-0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79,
-0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74,
-0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77, 0x61,
-0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b,
-0x49, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61,
-0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69,
-0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
-0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x3b
-};
-
-static const ushort standalone_months_data[] = {
-0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x63, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
-0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x41, 0x6d,
-0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69, 0x74, 0x3b, 0x45, 0x6c, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61,
-0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48, 0x61, 0x67, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61,
-0x64, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x41, 0x6d, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e,
-0x64, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c,
-0x62, 0x61, 0x3b, 0x43, 0x61, 0x61, 0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69,
-0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b,
-0x46, 0x75, 0x75, 0x6c, 0x62, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f, 0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73,
-0x61, 0x3b, 0x53, 0x61, 0x64, 0x61, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64, 0x64, 0x65, 0x65, 0x3b, 0x51, 0x75, 0x6e,
-0x3b, 0x4e, 0x61, 0x68, 0x3b, 0x43, 0x69, 0x67, 0x3b, 0x41, 0x67, 0x64, 0x3b, 0x43, 0x61, 0x78, 0x3b, 0x51, 0x61, 0x73,
-0x3b, 0x51, 0x61, 0x64, 0x3b, 0x4c, 0x65, 0x71, 0x3b, 0x57, 0x61, 0x79, 0x3b, 0x44, 0x69, 0x74, 0x3b, 0x58, 0x69, 0x6d,
-0x3b, 0x4b, 0x61, 0x78, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4e,
-0x61, 0x68, 0x61, 0x72, 0x73, 0x69, 0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x43, 0x69, 0x67, 0x67, 0x69, 0x6c, 0x74, 0x61,
-0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61, 0x78, 0x69, 0x73, 0x73, 0x6f, 0x3b, 0x43,
-0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c, 0x73, 0x61, 0x3b, 0x51, 0x61, 0x73, 0x61, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69,
-0x3b, 0x51, 0x61, 0x64, 0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x4c, 0x65, 0x71, 0x65, 0x65, 0x6e, 0x69, 0x3b,
-0x57, 0x61, 0x79, 0x73, 0x75, 0x3b, 0x44, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d, 0x6f, 0x6c, 0x69, 0x3b,
-0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x51, 0x3b, 0x4e, 0x3b, 0x43, 0x3b,
-0x41, 0x3b, 0x43, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x4c, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x58, 0x3b, 0x4b, 0x3b, 0x51, 0x75,
-0x6e, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x43, 0x69, 0x67,
-0x67, 0x69, 0x6c, 0x74, 0x61, 0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61, 0x78, 0x69,
-0x73, 0x3b, 0x43, 0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c, 0x73, 0x61, 0x3b, 0x51, 0x61, 0x73, 0x61, 0x20, 0x44, 0x69,
-0x72, 0x72, 0x69, 0x3b, 0x51, 0x61, 0x64, 0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x4c, 0x69, 0x69, 0x71, 0x65,
-0x6e, 0x3b, 0x57, 0x61, 0x79, 0x73, 0x75, 0x3b, 0x44, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d, 0x6f, 0x6c,
-0x69, 0x3b, 0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
-0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
-0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
-0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
-0x53, 0x68, 0x6b, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x50, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x51, 0x65, 0x72, 0x3b,
-0x4b, 0x6f, 0x72, 0x3b, 0x47, 0x73, 0x68, 0x3b, 0x53, 0x68, 0x74, 0x3b, 0x54, 0x65, 0x74, 0x3b, 0x4e, 0xeb, 0x6e, 0x3b,
-0x44, 0x68, 0x6a, 0x3b, 0x6a, 0x61, 0x6e, 0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72,
-0x73, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x3b,
-0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72,
-0x3b, 0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b, 0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f,
-0x72, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x51, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x53, 0x3b,
-0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355,
-0x1228, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x3b, 0x1234, 0x1355, 0x1274, 0x3b,
-0x12a6, 0x12ad, 0x1270, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x3b, 0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265,
-0x1229, 0x12c8, 0x122a, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x1228, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301,
-0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1270, 0x12cd, 0x1260,
-0x122d, 0x3b, 0x1296, 0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x3b, 0x1303, 0x3b, 0x134c, 0x3b, 0x121b, 0x3b,
-0x12a4, 0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b, 0x12f2, 0x3b, 0x64a, 0x646,
-0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a,
-0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623,
-0x63a, 0x633, 0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
-0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623,
-0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x643, 0x627, 0x646,
-0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b,
-0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645,
-0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644,
-0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646,
-0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646,
-0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x646, 0x648,
-0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a,
-0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a,
-0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644,
-0x3b, 0x540, 0x576, 0x57e, 0x3b, 0x553, 0x57f, 0x57e, 0x3b, 0x544, 0x580, 0x57f, 0x3b, 0x531, 0x57a, 0x580, 0x3b, 0x544, 0x575, 0x57d,
-0x3b, 0x540, 0x576, 0x57d, 0x3b, 0x540, 0x56c, 0x57d, 0x3b, 0x555, 0x563, 0x57d, 0x3b, 0x54d, 0x565, 0x57a, 0x3b, 0x540, 0x578, 0x56f,
-0x3b, 0x546, 0x578, 0x575, 0x3b, 0x534, 0x565, 0x56f, 0x3b, 0x540, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b, 0x553, 0x565, 0x57f,
-0x580, 0x57e, 0x561, 0x580, 0x3b, 0x544, 0x561, 0x580, 0x57f, 0x3b, 0x531, 0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x544, 0x561, 0x575, 0x56b,
-0x57d, 0x3b, 0x540, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b, 0x540, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x3b, 0x555, 0x563, 0x578, 0x57d,
-0x57f, 0x578, 0x57d, 0x3b, 0x54d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x540, 0x578, 0x56f, 0x57f, 0x565, 0x574,
-0x562, 0x565, 0x580, 0x3b, 0x546, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x534, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562,
-0x565, 0x580, 0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39,
-0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0,
-0x9c1, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1,
-0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x3b, 0x985, 0x995, 0x9cd,
-0x99f, 0x9cb, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0,
-0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
-0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997,
-0x9b7, 0x9cd, 0x99f, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb,
-0x9ac, 0x9f0, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b,
-0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b,
-0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61,
-0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x130, 0x79, 0x75,
-0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x79, 0x61,
-0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65,
-0x6b, 0x61, 0x62, 0x72, 0x3b, 0x75, 0x72, 0x74, 0x3b, 0x6f, 0x74, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x69,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x65, 0x6b, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x3b, 0x61, 0x62, 0x75, 0x3b, 0x69, 0x72, 0x61,
-0x3b, 0x75, 0x72, 0x72, 0x3b, 0x61, 0x7a, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x3b, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69,
-0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61,
-0x70, 0x69, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e,
-0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72,
-0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62,
-0x65, 0x6e, 0x64, 0x75, 0x61, 0x3b, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b,
-0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b,
-0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
-0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997,
-0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb,
-0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b,
-0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1,
-0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0x20, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0x20, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf28,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf21,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf44, 0xf54,
-0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
-0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
-0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b,
-0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b,
-0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
-0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x44f, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432,
-0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438,
-0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e,
-0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444,
-0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c,
-0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
-0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435,
-0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b,
-0x430, 0x3b, 0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x1007, 0x1014,
-0x103a, 0x3b, 0x1016, 0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007,
-0x1030, 0x3b, 0x1029, 0x3b, 0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e,
-0x3b, 0x1007, 0x1014, 0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e,
-0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030,
-0x101c, 0x102d, 0x102f, 0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c,
-0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c,
-0x3b, 0x1012, 0x102e, 0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007,
-0x3b, 0x1007, 0x3b, 0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442,
-0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x442, 0x440, 0x430, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f,
-0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435,
-0x3b, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432,
-0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b,
-0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435,
-0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d,
-0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x3b,
-0x441, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x43a, 0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b,
-0x43b, 0x3b, 0x441, 0x3b, 0x17e1, 0x3b, 0x17e2, 0x3b, 0x17e3, 0x3b, 0x17e4, 0x3b, 0x17e5, 0x3b, 0x17e6, 0x3b, 0x17e7, 0x3b, 0x17e8, 0x3b,
-0x17e9, 0x3b, 0x17e1, 0x17e0, 0x3b, 0x17e1, 0x17e1, 0x3b, 0x17e1, 0x17e2, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2,
-0x1797, 0x17c8, 0x3b, 0x1798, 0x17b7, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7,
-0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2,
-0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793,
-0x17bc, 0x3b, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67,
-0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73,
-0x2e, 0x3b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b,
-0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
-0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63,
-0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d,
-0x62, 0x72, 0x65, 0x3b, 0x67, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b,
-0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b,
-0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00,
-0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708,
-0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708,
-0x3b, 0x31, 0x32, 0x6708, 0x3b, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72,
-0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75,
-0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x61,
-0x6e, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72,
-0x61, 0x76, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a,
-0x3b, 0x73, 0x72, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b, 0x72, 0x75, 0x6a, 0x61,
-0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70,
-0x72, 0x6f, 0x73, 0x69, 0x6e, 0x61, 0x63, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b,
-0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31,
-0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x3b, 0x6c, 0x65, 0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159,
-0x65, 0x7a, 0x65, 0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65, 0x6e, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65,
-0x72, 0x76, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e, 0x3b,
-0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b,
-0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63, 0x3b, 0x6c, 0x3b, 0xfa, 0x3b, 0x62, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x10d,
-0x3b, 0x10d, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x159, 0x3b, 0x6c, 0x3b, 0x70, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62,
-0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c,
-0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63,
-0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74,
-0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
-0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
-0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69,
-0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75,
-0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70,
-0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75,
-0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x3b,
-0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72,
-0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b,
-0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
-0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
-0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
-0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
-0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61,
-0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61,
-0x61, 0x6c, 0x69, 0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73,
-0xe4, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b,
-0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69,
-0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b,
-0x75, 0x75, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75,
-0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c,
-0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75,
-0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x3b,
-0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73,
-0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e,
-0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69,
-0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
-0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x58, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
-0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x58, 0x75, 0xf1, 0x3b, 0x58, 0x75, 0x6c, 0x3b,
-0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b,
-0x58, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72,
-0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58,
-0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58,
-0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db,
-0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0,
-0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8,
-0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0,
-0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8,
-0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4,
-0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc,
-0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b,
-0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b,
-0x10d3, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x2e,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b,
-0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0xe4, 0x6e,
-0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65,
-0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x3ca, 0x3b,
-0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba,
-0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
-0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2,
-0x3b, 0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd,
-0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3, 0x3c4, 0x3bf,
-0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1,
-0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2,
-0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391,
-0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62,
-0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b,
-0x6d, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x75, 0x73, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
-0x62, 0x65, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x69, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae,
-0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c,
-0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd,
-0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0,
-0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa,
-0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97,
-0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacd, 0xaac,
-0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c,
-0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91,
-0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61,
-0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69,
-0x73, 0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b,
-0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d,
-0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x62c, 0x64e, 0x646, 0x3b, 0x6a2, 0x64e, 0x628, 0x3b, 0x645, 0x64e, 0x631, 0x3b, 0x623,
-0x64e, 0x6a2, 0x652, 0x631, 0x3b, 0x645, 0x64e, 0x64a, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x3b, 0x623,
-0x64e, 0x63a, 0x64f, 0x3b, 0x633, 0x64e, 0x62a, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x3b, 0x646, 0x64f, 0x648, 0x3b, 0x62f, 0x650,
-0x633, 0x3b, 0x62c, 0x64e, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x6a2, 0x64e, 0x628, 0x652, 0x631, 0x64e, 0x64a, 0x652, 0x631,
-0x64f, 0x3b, 0x645, 0x64e, 0x631, 0x650, 0x633, 0x652, 0x3b, 0x623, 0x64e, 0x6a2, 0x652, 0x631, 0x650, 0x644, 0x64f, 0x3b, 0x645, 0x64e,
-0x64a, 0x64f, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x650, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x650, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x633,
-0x652, 0x62a, 0x64e, 0x3b, 0x633, 0x64e, 0x62a, 0x64f, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x648, 0x64f,
-0x628, 0x64e, 0x3b, 0x646, 0x64f, 0x648, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x62f, 0x650, 0x633, 0x64e, 0x645, 0x652, 0x628, 0x64e,
-0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b,
-0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b, 0x5e1,
-0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5f3, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x3b, 0x5d9,
-0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9,
-0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5,
-0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5,
-0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935,
-0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c,
-0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x92e, 0x94d,
-0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f,
-0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942,
-0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x6a, 0x61, 0x6e, 0x2e,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1,
-0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a,
-0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b,
-0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69,
-0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e,
-0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73,
-0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
-0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0xe1, 0x67, 0xfa, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
-0x6b, 0x74, 0x3b, 0x6e, 0xf3, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed,
-0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61,
-0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0xe1, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
-0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62,
-0x68, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69,
-0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46,
-0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72,
-0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65,
-0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61,
-0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20,
-0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d,
-0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67,
-0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44,
-0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74,
-0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x47, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f,
-0x3b, 0x46, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x70, 0x72, 0x69,
-0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x4c, 0x75, 0x67,
-0x6c, 0x69, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0x4f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69,
-0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c,
-0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcab, 0xcc6, 0xcac,
-0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8e, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd,
-0x3b, 0xcae, 0xcc6, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd,
-0x3b, 0xcb8, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b,
-0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab,
-0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8e, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6,
-0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x3b, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430,
-0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456,
-0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430,
-0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x2e, 0x3b, 0x49b, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430,
-0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440,
-0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b,
-0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448,
-0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73,
-0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d,
-0x2e, 0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77,
-0x2e, 0x3b, 0x75, 0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x3b, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61,
-0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65,
-0x3b, 0x4d, 0x61, 0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65,
-0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e,
-0x7a, 0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79,
-0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x3b, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33,
-0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b,
-0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x3b, 0xe7, 0x69, 0x6c, 0x3b, 0x73, 0x69, 0x62, 0x3b,
-0x61, 0x64, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x3b, 0x67, 0x75, 0x6c, 0x3b, 0x68, 0x65, 0x7a, 0x3b, 0x74, 0xee, 0x72, 0x3b,
-0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xe7, 0x69, 0x6c, 0x65, 0x3b, 0x73, 0x69,
-0x62, 0x61, 0x74, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x61, 0x6e, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e,
-0x3b, 0x68, 0x65, 0x7a, 0xee, 0x72, 0x61, 0x6e, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31,
-0x3b, 0x31, 0x32, 0x3b, 0xe7, 0x3b, 0x73, 0x3b, 0x61, 0x3b, 0x6e, 0x3b, 0x67, 0x3b, 0x68, 0x3b, 0x37, 0x3b, 0x38, 0x3b,
-0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e,
-0x3b, 0xea1, 0xeb5, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4,
-0x2e, 0xe96, 0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95,
-0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99,
-0x3b, 0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94,
-0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b,
-0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88,
-0xeb4, 0xe81, 0x3b, 0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e,
-0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b,
-0x6e, 0x2e, 0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f,
-0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72,
-0x69, 0x73, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61,
-0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b,
-0x6a, 0x16b, 0x6c, 0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x73, 0x31, 0x3b, 0x73, 0x32,
-0x3b, 0x73, 0x33, 0x3b, 0x73, 0x34, 0x3b, 0x73, 0x35, 0x3b, 0x73, 0x36, 0x3b, 0x73, 0x37, 0x3b, 0x73, 0x38, 0x3b, 0x73,
-0x39, 0x3b, 0x73, 0x31, 0x30, 0x3b, 0x73, 0x31, 0x31, 0x3b, 0x73, 0x31, 0x32, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
-0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed,
-0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f,
-0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
-0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
-0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61,
-0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b,
-0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
-0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3,
-0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79,
-0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x53, 0x61, 0x75,
-0x73, 0x2e, 0x3b, 0x56, 0x61, 0x73, 0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x3b, 0x42, 0x61, 0x6c, 0x2e, 0x3b, 0x47, 0x65, 0x67,
-0x2e, 0x3b, 0x42, 0x69, 0x72, 0x2e, 0x3b, 0x4c, 0x69, 0x65, 0x70, 0x2e, 0x3b, 0x52, 0x75, 0x67, 0x70, 0x6a, 0x2e, 0x3b,
-0x52, 0x75, 0x67, 0x73, 0x2e, 0x3b, 0x53, 0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x4c, 0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x47,
-0x72, 0x75, 0x6f, 0x64, 0x2e, 0x3b, 0x53, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x56, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73,
-0x3b, 0x4b, 0x6f, 0x76, 0x61, 0x73, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x47, 0x65, 0x67, 0x75,
-0x17e, 0x117, 0x3b, 0x42, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b, 0x4c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x52, 0x75,
-0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x52, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69, 0x73, 0x3b, 0x53, 0x70, 0x61,
-0x6c, 0x69, 0x73, 0x3b, 0x4c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x47, 0x72, 0x75, 0x6f, 0x64, 0x69,
-0x73, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b,
-0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e,
-0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b,
-0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c,
-0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x2e, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432,
-0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458,
-0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
-0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435,
-0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b,
-0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f,
-0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61,
-0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79,
-0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72,
-0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b,
-0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
-0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b,
-0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23,
-0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b,
-0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0x3b, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30,
-0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0xd1a, 0xd4d, 0xd1a,
-0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd32, 0xd4d, 0x200d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d,
-0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd06, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d,
-0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd28,
-0xd35, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46,
-0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd47, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b,
-0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53,
-0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61,
-0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77,
-0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62,
-0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75,
-0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x50, 0x113, 0x70, 0x75, 0x65, 0x72, 0x65,
-0x3b, 0x4d, 0x101, 0x65, 0x68, 0x65, 0x3b, 0x100, 0x70, 0x65, 0x72, 0x69, 0x72, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x48,
-0x75, 0x6e, 0x65, 0x3b, 0x48, 0x16b, 0x72, 0x61, 0x65, 0x3b, 0x100, 0x6b, 0x75, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65,
-0x70, 0x65, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61,
-0x3b, 0x54, 0x12b, 0x68, 0x65, 0x6d, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c,
-0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932,
-0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938,
-0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d,
-0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b,
-0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b,
-0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x3b, 0x445, 0x443, 0x43b, 0x3b, 0x4af, 0x445, 0x44d, 0x3b, 0x431, 0x430, 0x440, 0x3b, 0x442, 0x443,
-0x443, 0x3b, 0x43b, 0x443, 0x443, 0x3b, 0x43c, 0x43e, 0x433, 0x3b, 0x43c, 0x43e, 0x440, 0x3b, 0x445, 0x43e, 0x43d, 0x3b, 0x431, 0x438,
-0x447, 0x3b, 0x442, 0x430, 0x445, 0x3b, 0x43d, 0x43e, 0x445, 0x3b, 0x433, 0x430, 0x445, 0x3b, 0x425, 0x443, 0x43b, 0x433, 0x430, 0x43d,
-0x430, 0x3b, 0x4ae, 0x445, 0x44d, 0x440, 0x3b, 0x411, 0x430, 0x440, 0x3b, 0x422, 0x443, 0x443, 0x43b, 0x430, 0x439, 0x3b, 0x41b, 0x443,
-0x443, 0x3b, 0x41c, 0x43e, 0x433, 0x43e, 0x439, 0x3b, 0x41c, 0x43e, 0x440, 0x44c, 0x3b, 0x425, 0x43e, 0x43d, 0x44c, 0x3b, 0x411, 0x438,
-0x447, 0x3b, 0x422, 0x430, 0x445, 0x438, 0x430, 0x3b, 0x41d, 0x43e, 0x445, 0x43e, 0x439, 0x3b, 0x413, 0x430, 0x445, 0x430, 0x439, 0x3b,
-0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e,
-0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x3b,
-0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x3b, 0x91c, 0x928, 0x935, 0x930,
-0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a,
-0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917,
-0x938, 0x94d, 0x924, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b,
-0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930,
-0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967,
-0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b,
-0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x947, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x941, 0x928, 0x3b,
-0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d,
-0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b,
-0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61,
-0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
-0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
-0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e,
-0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d,
+0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b,
+0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x67, 0x65, 0x6e, 0x69, 0xe8, 0x72, 0x3b, 0x66, 0x65, 0x62,
-0x72, 0x69, 0xe8, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x65, 0x74, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65,
-0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0xf2, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40,
-0x3b, 0xb2b, 0xb47, 0xb2c, 0xb4d, 0xb30, 0xb41, 0xb5f, 0xb3e, 0xb30, 0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b,
-0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b,
-0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d,
-0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c,
-0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c,
-0xb41, 0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b,
-0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc,
-0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645,
-0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628,
-0x631, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631,
-0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc,
-0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646,
-0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x3b,
-0x641, 0x648, 0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x3b,
-0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645,
-0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645,
-0x628, 0x631, 0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x6cc, 0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b,
-0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645,
-0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648,
-0x644, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b,
-0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645,
-0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x73, 0x74, 0x79, 0x3b, 0x6c,
-0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c,
-0x69, 0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67,
-0x72, 0x75, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a,
-0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72,
-0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0x144,
-0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65, 0x144, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69,
-0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x3b,
-0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70, 0x3b,
-0x6c, 0x3b, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b,
-0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b,
-0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b,
-0x46, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69,
-0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41,
+0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc30, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc19, 0xd801,
+0xdc2f, 0xd801, 0xdc3a, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc01, 0xd801, 0xdc39, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc23,
+0xd801, 0xdc29, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc02, 0xd801,
+0xdc40, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f, 0xd801, 0xdc39, 0x3b, 0xd801, 0xdc09, 0xd801, 0xdc3f, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc24, 0xd801, 0xdc2c,
+0xd801, 0xdc42, 0x3b, 0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801, 0xdc45, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc30, 0xd801, 0xdc4c, 0xd801, 0xdc37, 0xd801, 0xdc2d,
+0xd801, 0xdc2f, 0xd801, 0xdc49, 0xd801, 0xdc28, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc2f, 0xd801, 0xdc3a, 0xd801, 0xdc49, 0xd801, 0xdc2d, 0xd801, 0xdc2f, 0xd801,
+0xdc49, 0xd801, 0xdc28, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0xd801, 0xdc3d, 0x3b, 0xd801, 0xdc01, 0xd801, 0xdc39, 0xd801, 0xdc49, 0xd801,
+0xdc2e, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d,
+0xd801, 0xdc4a, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc02, 0xd801, 0xdc40, 0xd801, 0xdc32, 0xd801, 0xdc45, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f,
+0xd801, 0xdc39, 0xd801, 0xdc3b, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc09, 0xd801, 0xdc3f, 0xd801,
+0xdc3b, 0xd801, 0xdc2c, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc24, 0xd801, 0xdc2c, 0xd801, 0xdc42, 0xd801, 0xdc2f, 0xd801, 0xdc4b,
+0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801, 0xdc45, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801,
+0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc19, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801, 0xdc01, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801,
+0xdc16, 0x3b, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc02, 0x3b, 0xd801, 0xdc1d, 0x3b, 0xd801, 0xdc09, 0x3b, 0xd801, 0xdc24, 0x3b, 0xd801, 0xdc14, 0x3b,
+0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72,
+0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x3b, 0x6a,
+0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74,
+0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a,
+0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65,
+0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75,
+0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65,
+0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c, 0x6d,
+0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68,
+0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x74,
+0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75,
+0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b,
+0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x6a, 0x61,
+0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e,
+0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69,
+0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
+0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x58, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62,
+0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x58, 0x75, 0xf1, 0x3b, 0x58, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72,
+0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41,
 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62,
-0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x69,
-0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x75, 0x74,
-0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x7a, 0x3b, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76,
-0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73,
-0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0xa1c, 0xa28,
-0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30,
-0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24,
-0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b,
-0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c, 0x3b, 0xa2b, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b,
-0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641,
-0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c,
-0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631,
-0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b,
-0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b,
-0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65,
-0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a,
-0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75,
-0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x53,
-0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b, 0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67,
-0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65,
-0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69,
-0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69,
-0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65,
-0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65,
-0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442,
-0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b,
-0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
-0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b,
-0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e,
-0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f,
-0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414,
-0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0x42f, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418,
-0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b, 0x414, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d,
-0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b,
-0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x3b, 0x4e,
-0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e,
-0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b, 0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e,
-0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75,
-0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72,
-0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b,
-0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435,
-0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443,
-0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435,
-0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440,
-0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b,
-0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442,
-0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431,
-0x430, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430,
-0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443,
-0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b,
-0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446,
-0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
-0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65,
-0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76,
-0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d,
-0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x50,
-0x68, 0x65, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x55, 0x62, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x4a,
-0x61, 0x6e, 0x3b, 0x55, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x50,
-0x75, 0x6e, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x50, 0x68, 0x65, 0x73, 0x65, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x48, 0x6c,
-0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x73,
-0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x61, 0x6e, 0x6f, 0x6e, 0x67, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x6a, 0x61,
-0x6e, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x74, 0x73,
-0x68, 0x65, 0x3b, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x77,
-0x61, 0x6e, 0x65, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x74, 0x77, 0x65, 0x3b, 0x46, 0x65, 0x72, 0x3b, 0x54, 0x6c, 0x68, 0x3b,
-0x4d, 0x6f, 0x70, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x53, 0x65, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x3b,
-0x50, 0x68, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x3b, 0x4e, 0x67, 0x77, 0x3b, 0x53, 0x65, 0x64, 0x3b,
-0x46, 0x65, 0x72, 0x69, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x54, 0x6c, 0x68, 0x61, 0x6b, 0x6f, 0x6c, 0x65, 0x3b, 0x4d,
-0x6f, 0x70, 0x69, 0x74, 0x6c, 0x6f, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x4d, 0x6f, 0x74, 0x73,
-0x68, 0x65, 0x67, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x53, 0x65, 0x65, 0x74, 0x65, 0x62, 0x6f, 0x73, 0x69, 0x67, 0x6f,
-0x3b, 0x50, 0x68, 0x75, 0x6b, 0x77, 0x69, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x77, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x73,
-0x65, 0x3b, 0x44, 0x69, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4e, 0x67, 0x77, 0x61, 0x6e, 0x61, 0x74, 0x73,
-0x65, 0x6c, 0x65, 0x3b, 0x53, 0x65, 0x64, 0x69, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6f, 0x6c, 0x65, 0x3b, 0x4e, 0x64, 0x69,
-0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69,
-0x3b, 0x43, 0x68, 0x69, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x3b,
-0x5a, 0x76, 0x69, 0x3b, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75,
-0x72, 0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62,
-0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72,
-0x75, 0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e,
-0x61, 0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76,
-0x69, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b,
-0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad,
-0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0x3b, 0xdb8, 0xdd0, 0xdba, 0x3b, 0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd,
-0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0x3b, 0xd94, 0xd9a, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3,
-0xdd0, 0x3b, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca,
-0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0x3b,
-0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8,
-0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca,
-0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8,
-0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b,
-0xdb1, 0xddc, 0x3b, 0xdaf, 0xdd9, 0x3b, 0x42, 0x68, 0x69, 0x3b, 0x56, 0x61, 0x6e, 0x3b, 0x56, 0x6f, 0x6c, 0x3b, 0x4d, 0x61,
-0x62, 0x3b, 0x4e, 0x6b, 0x68, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4e, 0x67, 0x63, 0x3b, 0x4e, 0x79,
-0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4e, 0x67, 0x6f, 0x3b, 0x42, 0x68, 0x69, 0x6d, 0x62, 0x69,
-0x64, 0x76, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x61, 0x6e, 0x61, 0x3b, 0x69, 0x4e, 0x64,
-0x6c, 0x6f, 0x76, 0x75, 0x2d, 0x6c, 0x65, 0x6e, 0x6b, 0x68, 0x75, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x62, 0x61, 0x73, 0x61,
-0x3b, 0x69, 0x4e, 0x6b, 0x68, 0x77, 0x65, 0x6b, 0x68, 0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e, 0x68, 0x6c, 0x61, 0x62,
-0x61, 0x3b, 0x4b, 0x68, 0x6f, 0x6c, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x67, 0x63, 0x69, 0x3b, 0x69, 0x4e, 0x79,
-0x6f, 0x6e, 0x69, 0x3b, 0x69, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e,
-0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x6e, 0x69, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
-0x61, 0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b,
-0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
-0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72,
-0xed, 0x6c, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61,
-0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a,
-0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x41, 0x66, 0x72, 0x3b,
-0x53, 0x68, 0x61, 0x3b, 0x4c, 0x69, 0x78, 0x3b, 0x54, 0x6f, 0x64, 0x3b, 0x53, 0x69, 0x64, 0x3b, 0x53, 0x61, 0x67, 0x3b,
-0x54, 0x6f, 0x62, 0x3b, 0x4b, 0x49, 0x54, 0x3b, 0x4c, 0x49, 0x54, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f,
-0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42,
-0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
-0x20, 0x41, 0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61,
-0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
-0x20, 0x54, 0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65,
-0x65, 0x64, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61,
-0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68,
-0x61, 0x20, 0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69,
-0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64,
-0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x54,
-0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x65, 0x6e, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72,
-0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70,
-0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73,
-0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72,
-0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41,
-0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
-0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b,
-0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c, 0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b,
-0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b,
-0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435,
-0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b,
-0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f,
-0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430,
-0x431, 0x440, 0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f,
-0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e,
-0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e,
-0x3b, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd,
-0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2,
-0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbc6, 0xbae, 0xbcd, 0xbaa, 0xbcd,
-0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b,
-0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae,
-0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b,
-0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a,
-0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc42,
-0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d,
-0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38,
-0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0x3b, 0xc0e, 0x3b, 0xc2e, 0xc46, 0x3b, 0xc1c, 0xc41,
-0x3b, 0xc1c, 0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e,
-0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e,
-0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01,
-0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21,
-0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19,
-0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22, 0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21,
-0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b,
-0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e,
-0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b, 0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72,
-0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51,
-0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x1325, 0x122a,
-0x3b, 0x1208, 0x12ab, 0x1272, 0x3b, 0x1218, 0x130b, 0x1262, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x3b, 0x130d, 0x1295, 0x1266, 0x3b, 0x1230, 0x1290, 0x3b,
-0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x3b, 0x1325, 0x1245, 0x121d, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b,
-0x1273, 0x1215, 0x1233, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd,
-0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235,
-0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x1235, 0x3b, 0x53, 0x101,
-0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53,
-0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61,
-0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x3b, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70,
-0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69,
-0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b,
-0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70,
-0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x3b, 0x53, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x3b,
-0x53, 0x75, 0x6e, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x4b, 0x75, 0x6c, 0x3b, 0x44, 0x7a, 0x69, 0x3b, 0x4d, 0x75, 0x64, 0x3b,
-0x4b, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x68, 0x61, 0x3b, 0x4e, 0x64, 0x7a, 0x3b, 0x4e, 0x68, 0x6c, 0x3b,
-0x48, 0x75, 0x6b, 0x3b, 0x4e, 0x27, 0x77, 0x3b, 0x53, 0x75, 0x6e, 0x67, 0x75, 0x74, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e,
-0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x75, 0x6c, 0x75, 0x3b,
-0x44, 0x7a, 0x69, 0x76, 0x61, 0x6d, 0x69, 0x73, 0x6f, 0x6b, 0x6f, 0x3b, 0x4d, 0x75, 0x64, 0x79, 0x61, 0x78, 0x69, 0x68,
-0x69, 0x3b, 0x4b, 0x68, 0x6f, 0x74, 0x61, 0x76, 0x75, 0x78, 0x69, 0x6b, 0x61, 0x3b, 0x4d, 0x61, 0x77, 0x75, 0x77, 0x61,
-0x6e, 0x69, 0x3b, 0x4d, 0x68, 0x61, 0x77, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x64, 0x7a, 0x68, 0x61, 0x74, 0x69, 0x3b, 0x4e,
-0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x48, 0x75, 0x6b, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x27, 0x77, 0x65,
-0x6e, 0x64, 0x7a, 0x61, 0x6d, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b, 0x41, 0x11f,
-0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x4f, 0x63,
-0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69, 0x73, 0x61, 0x6e, 0x3b,
-0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a,
-0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b,
-0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e,
-0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0x421, 0x456, 0x447,
-0x3b, 0x41b, 0x44e, 0x442, 0x3b, 0x411, 0x435, 0x440, 0x3b, 0x41a, 0x432, 0x456, 0x3b, 0x422, 0x440, 0x430, 0x3b, 0x427, 0x435, 0x440,
-0x3b, 0x41b, 0x438, 0x43f, 0x3b, 0x421, 0x435, 0x440, 0x3b, 0x412, 0x435, 0x440, 0x3b, 0x416, 0x43e, 0x432, 0x3b, 0x41b, 0x438, 0x441,
-0x3b, 0x413, 0x440, 0x443, 0x3b, 0x421, 0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x41b, 0x44e, 0x442, 0x438, 0x439, 0x3b, 0x411, 0x435,
-0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x41a, 0x432, 0x456, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x422, 0x440, 0x430, 0x432, 0x435,
-0x43d, 0x44c, 0x3b, 0x427, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x41b, 0x438, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x421, 0x435,
-0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x412, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x416, 0x43e, 0x432, 0x442, 0x435,
-0x43d, 0x44c, 0x3b, 0x41b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x413, 0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c, 0x3b,
-0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b,
-0x41b, 0x3b, 0x413, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x20,
-0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626,
-0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
-0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x41c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b,
-0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420,
-0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d,
-0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430,
-0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428,
-0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a, 0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d,
-0x4b3, 0x438, 0x436, 0x436, 0x430, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e,
-0x631, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e,
-0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b,
-0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc,
-0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645,
-0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628,
-0x631, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33, 0x3b,
-0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68,
-0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67, 0x20,
-0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x74, 0x68, 0xe1,
-0x6e, 0x67, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x74, 0x68, 0xe1,
-0x6e, 0x67, 0x20, 0x62, 0x61, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0x1b0, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x6e, 0x103, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x73, 0xe1, 0x75, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x62, 0x1ea3, 0x79, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0xe1, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
-0x20, 0x63, 0x68, 0xed, 0x6e, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x3b, 0x74, 0x68, 0xe1,
-0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0,
-0x1edd, 0x69, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x77, 0x3b,
-0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x41, 0x77, 0x73, 0x74,
-0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b,
-0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72,
-0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69,
-0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65,
-0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64, 0x64, 0x3b, 0x52,
-0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
-0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
-0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
-0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a,
-0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d,
-0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x323, 0x3b, 0xc8, 0x72, 0xe8,
-0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62,
-0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f,
-0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x1ecc, 0x300, 0x70,
-0x1eb9, 0x300, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1e62, 0x1eb8, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xc8, 0x72,
-0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xcc,
-0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2,
-0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2,
-0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300,
-0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300,
-0x70, 0x1eb9, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x41, 0x70, 0x72, 0x3b,
-0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b,
-0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x75, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72,
-0x69, 0x3b, 0x75, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b,
-0x75, 0x2d, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x75, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x75, 0x4a, 0x75, 0x6e, 0x69,
-0x3b, 0x75, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x75, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x75, 0x53, 0x65,
-0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x75, 0x2d, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x75, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x75, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
-0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
-0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
-0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d,
-0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x69, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65,
-0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c,
-0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65,
-0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72,
-0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x2e, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d,
-0x2e, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72,
-0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69, 0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d,
-0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e,
-0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d,
-0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61,
-0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79,
-0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79,
-0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x57, 0x68, 0x65, 0x3b, 0x4d, 0x65, 0x72,
-0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x45, 0x66, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b,
-0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47,
-0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x57, 0x68, 0x65, 0x76, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79,
-0x73, 0x20, 0x4d, 0x65, 0x72, 0x74, 0x68, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79,
-0x73, 0x20, 0x4d, 0x65, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x45, 0x66, 0x61, 0x6e, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x6f,
-0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x4d, 0x79, 0x65, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x4d, 0x79, 0x73, 0x20,
-0x47, 0x77, 0x79, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x4d,
-0x79, 0x73, 0x20, 0x44, 0x75, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x3b, 0x53,
-0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f,
-0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186,
-0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b,
-0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77,
-0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72,
-0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62,
-0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d,
-0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d,
-0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e,
-0x64, 0x61, 0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b,
-0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62,
-0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x91c,
-0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e,
-0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c,
-0x941, 0x932, 0x948, 0x3b, 0x913, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b,
-0x913, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f,
-0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x41, 0x68, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x3b, 0x4f, 0x63, 0x68, 0x3b, 0x41, 0x62,
-0x65, 0x3b, 0x41, 0x67, 0x62, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x47, 0x62,
-0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x3b, 0x41, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x3b, 0x41, 0x68, 0x61, 0x72, 0x61, 0x62,
-0x61, 0x74, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x6f, 0x3b, 0x4f, 0x63, 0x68, 0x6f, 0x6b, 0x72, 0x69, 0x6b, 0x72, 0x69, 0x3b,
-0x41, 0x62, 0x65, 0x69, 0x62, 0x65, 0x65, 0x3b, 0x41, 0x67, 0x62, 0x65, 0x69, 0x6e, 0x61, 0x61, 0x3b, 0x4f, 0x74, 0x75,
-0x6b, 0x77, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x79, 0x61, 0x77, 0x61,
-0x6c, 0x65, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x6f, 0x6e, 0x3b, 0x41, 0x6c, 0x65, 0x6d, 0x6c, 0x65, 0x3b,
-0x41, 0x66, 0x75, 0x61, 0x62, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b,
-0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b,
-0x53, 0x65, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x65, 0x6e, 0x1ee5,
-0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68,
-0x1ecb, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
-0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc,
-0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x74,
-0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b,
-0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62,
-0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77, 0x61, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b,
-0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
-0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64,
-0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x61, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77,
-0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x3b, 0x4d,
-0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128,
-0x3b, 0x128, 0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f, 0x712, 0x3b, 0x72b, 0x712, 0x71b, 0x3b, 0x710, 0x715, 0x72a, 0x3b, 0x722, 0x71d,
-0x723, 0x722, 0x3b, 0x710, 0x71d, 0x72a, 0x3b, 0x71a, 0x719, 0x71d, 0x72a, 0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719, 0x3b, 0x710, 0x712,
-0x3b, 0x710, 0x71d, 0x720, 0x718, 0x720, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x710, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x712,
-0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f, 0x710, 0x3b, 0x120d, 0x12f0, 0x1275, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b,
-0x134b, 0x1305, 0x12ba, 0x3b, 0x12ad, 0x1262, 0x1245, 0x3b, 0x121d, 0x2f, 0x1275, 0x3b, 0x12b0, 0x122d, 0x3b, 0x121b, 0x122d, 0x12eb, 0x3b, 0x12eb,
-0x12b8, 0x1292, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x2f, 0x121d, 0x3b, 0x1270, 0x1215, 0x1233, 0x3b, 0x120d, 0x12f0, 0x1275, 0x122a, 0x3b,
-0x12ab, 0x1265, 0x12bd, 0x1265, 0x1272, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x122a, 0x3b, 0x12ad, 0x1262, 0x1245, 0x122a, 0x3b,
-0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1275, 0x131f, 0x1292, 0x122a, 0x3b, 0x12b0, 0x122d, 0x12a9, 0x3b, 0x121b, 0x122d, 0x12eb, 0x121d, 0x20, 0x1275,
-0x122a, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x20, 0x1218, 0x1233, 0x1245, 0x1208, 0x122a, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d,
-0x20, 0x1218, 0x123d, 0x12c8, 0x122a, 0x3b, 0x1270, 0x1215, 0x1233, 0x1235, 0x122a, 0x3b, 0x120d, 0x3b, 0x12ab, 0x3b, 0x12ad, 0x3b, 0x134b, 0x3b,
-0x12ad, 0x3b, 0x121d, 0x3b, 0x12b0, 0x3b, 0x121b, 0x3b, 0x12eb, 0x3b, 0x1218, 0x3b, 0x121d, 0x3b, 0x1270, 0x3b, 0x1320, 0x1210, 0x1228, 0x3b,
-0x12a8, 0x1270, 0x1270, 0x3b, 0x1218, 0x1308, 0x1260, 0x3b, 0x12a0, 0x1280, 0x12d8, 0x3b, 0x130d, 0x1295, 0x1263, 0x1275, 0x3b, 0x1220, 0x1295, 0x12e8,
-0x3b, 0x1210, 0x1218, 0x1208, 0x3b, 0x1290, 0x1210, 0x1230, 0x3b, 0x12a8, 0x1228, 0x1218, 0x3b, 0x1320, 0x1240, 0x1218, 0x3b, 0x1280, 0x12f0, 0x1228,
-0x3b, 0x1280, 0x1220, 0x1220, 0x3b, 0x1320, 0x3b, 0x12a8, 0x3b, 0x1218, 0x3b, 0x12a0, 0x3b, 0x130d, 0x3b, 0x1220, 0x3b, 0x1210, 0x3b, 0x1290,
-0x3b, 0x12a8, 0x3b, 0x1320, 0x3b, 0x1280, 0x3b, 0x1280, 0x3b, 0x57, 0x65, 0x79, 0x3b, 0x46, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x74,
-0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x75, 0x79, 0x3b, 0x54, 0x73, 0x6f, 0x3b, 0x54, 0x61, 0x66, 0x3b, 0x57, 0x61, 0x72,
-0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x42, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x53, 0x61, 0x75, 0x3b, 0x46, 0x61, 0x69,
-0x20, 0x57, 0x65, 0x79, 0x65, 0x6e, 0x65, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x46, 0x61, 0x6e, 0x69, 0x3b, 0x46, 0x61, 0x69,
-0x20, 0x54, 0x61, 0x74, 0x61, 0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x6e, 0x67, 0x72, 0x61, 0x3b, 0x46,
-0x61, 0x69, 0x20, 0x54, 0x75, 0x79, 0x6f, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x73, 0x6f, 0x79, 0x69, 0x3b, 0x46, 0x61,
-0x69, 0x20, 0x54, 0x61, 0x66, 0x61, 0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69,
-0x3b, 0x46, 0x61, 0x69, 0x20, 0x4b, 0x75, 0x6e, 0x6f, 0x62, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x42, 0x61, 0x6e,
-0x73, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4b, 0x6f, 0x6d, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x53, 0x61, 0x75, 0x6b,
-0x3b, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x42, 0x61, 0x61, 0x3b, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x6e, 0x61, 0x73, 0x3b,
-0x41, 0x74, 0x79, 0x6f, 0x3b, 0x41, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x75, 0x72, 0x3b,
-0x53, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x6b, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x4e, 0x61, 0x74, 0x61, 0x3b,
-0x50, 0x65, 0x6e, 0x20, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x42, 0x61, 0x27, 0x61, 0x3b, 0x50, 0x65,
-0x6e, 0x20, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x50, 0x65, 0x6e, 0x20,
-0x41, 0x74, 0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x72, 0x69, 0x6d, 0x3b, 0x50, 0x65,
-0x6e, 0x20, 0x41, 0x74, 0x61, 0x72, 0x69, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x77, 0x75, 0x72, 0x72, 0x3b,
-0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x6b, 0x75,
-0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b,
-0x75, 0x72, 0x20, 0x4e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x331, 0x79, 0x72, 0x3b, 0x41, 0x331, 0x68, 0x77, 0x3b, 0x41,
-0x331, 0x74, 0x61, 0x3b, 0x41, 0x331, 0x6e, 0x61, 0x3b, 0x41, 0x331, 0x70, 0x66, 0x3b, 0x41, 0x331, 0x6b, 0x69, 0x3b, 0x41,
-0x331, 0x74, 0x79, 0x3b, 0x41, 0x331, 0x6e, 0x69, 0x3b, 0x41, 0x331, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b, 0x53, 0x62,
-0x79, 0x3b, 0x53, 0x62, 0x68, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b,
-0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331,
-0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x61, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77,
-0x61, 0x6e, 0x20, 0x41, 0x331, 0x70, 0x66, 0x77, 0x6f, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b,
-0x69, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x79, 0x69, 0x72, 0x69, 0x6e, 0x3b,
-0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20,
-0x41, 0x331, 0x6b, 0x75, 0x6d, 0x76, 0x69, 0x72, 0x69, 0x79, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53,
-0x77, 0x61, 0x6b, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331, 0x79,
-0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331,
-0x68, 0x77, 0x61, 0x3b, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b,
-0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b,
-0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65,
-0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
-0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b,
-0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
-0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x75, 0x68,
-0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x69, 0x3b, 0x4c, 0x77, 0x61,
-0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4b, 0x68, 0x75, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x1e3c, 0x61, 0x72, 0x3b, 0x4e, 0x79, 0x65,
-0x3b, 0x50, 0x68, 0x61, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x75, 0x68, 0x75, 0x68, 0x69, 0x3b, 0x1e70, 0x68, 0x61, 0x66, 0x61,
-0x6d, 0x75, 0x68, 0x77, 0x65, 0x3b, 0x4c, 0x61, 0x6d, 0x62, 0x61, 0x6d, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x75, 0x6e, 0x64,
-0x75, 0x6e, 0x74, 0x68, 0x75, 0x6c, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x69, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x61, 0x6e,
-0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x65, 0x3b, 0x4b, 0x68, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x65, 0x64,
-0x7a, 0x69, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x1e3c, 0x61, 0x72, 0x61, 0x3b, 0x4e, 0x79,
-0x65, 0x6e, 0x64, 0x61, 0x76, 0x68, 0x75, 0x73, 0x69, 0x6b, 0x75, 0x3b, 0x44, 0x7a, 0x76, 0x3b, 0x44, 0x7a, 0x64, 0x3b,
-0x54, 0x65, 0x64, 0x3b, 0x41, 0x66, 0x254, 0x3b, 0x44, 0x61, 0x6d, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x53, 0x69, 0x61, 0x3b,
-0x44, 0x65, 0x61, 0x3b, 0x41, 0x6e, 0x79, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x41, 0x64, 0x65, 0x3b, 0x44, 0x7a, 0x6d, 0x3b,
-0x44, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x54, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b,
-0x41, 0x66, 0x254, 0x66, 0x69, 0x25b, 0x3b, 0x44, 0x61, 0x6d, 0x61, 0x3b, 0x4d, 0x61, 0x73, 0x61, 0x3b, 0x53, 0x69, 0x61,
-0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x44, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x41, 0x6e, 0x79, 0x254,
-0x6e, 0x79, 0x254, 0x3b, 0x4b, 0x65, 0x6c, 0x65, 0x3b, 0x41, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65,
-0x3b, 0x44, 0x7a, 0x6f, 0x6d, 0x65, 0x3b, 0x44, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x53,
-0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e,
-0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b,
-0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b,
-0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e, 0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x50, 0x65,
-0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c,
-0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb,
-0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x2bb, 0x4f,
-0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65,
-0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4a, 0x75, 0x77, 0x3b, 0x53, 0x77, 0x69, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x79, 0x61,
-0x3b, 0x54, 0x73, 0x77, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x6b, 0x75,
-0x3b, 0x53, 0x77, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4a, 0x75,
-0x77, 0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x69, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77,
-0x61, 0x74, 0x20, 0x54, 0x73, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4e, 0x79, 0x61, 0x69, 0x3b, 0x5a, 0x77,
-0x61, 0x74, 0x20, 0x54, 0x73, 0x77, 0x6f, 0x6e, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x74, 0x61, 0x61, 0x68, 0x3b,
-0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x6e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x72, 0x69,
-0x6e, 0x61, 0x69, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x6b, 0x75, 0x62, 0x75, 0x6e, 0x79, 0x75, 0x6e, 0x67, 0x3b,
-0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6a,
-0x75, 0x77, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x2d, 0x4d, 0x61, 0x2d, 0x53,
-0x75, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x6c, 0x3b, 0x45, 0x70,
-0x75, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61,
-0x6c, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x6c, 0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x6c, 0x69, 0x63, 0x68,
-0x69, 0x3b, 0x45, 0x70, 0x75, 0x6c, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
-0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x69, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x75, 0x74, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x4f, 0x6b, 0x75, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72,
-0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50,
-0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73,
-0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65,
-0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70,
-0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
-0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68,
-0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa2cd,
-0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa, 0x3b,
-0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x3b, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x72, 0x68, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x55, 0x73, 0x69,
-0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x46, 0x65, 0x62, 0x65, 0x72,
-0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x74, 0x6a, 0x68, 0x69, 0x3b, 0x75, 0x2d, 0x41, 0x70, 0x72, 0x65, 0x6c,
+0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f,
+0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0,
+0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5,
+0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8,
+0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0,
+0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da,
+0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4,
+0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0,
+0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b,
+0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
+0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d,
+0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65,
+0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41,
+0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0xe4, 0x6e, 0x6e, 0x65,
+0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
+0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x399, 0x3b1,
+0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x3ca, 0x3b, 0x399, 0x3bf,
+0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b,
+0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x3a6,
+0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391,
+0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3af, 0x3bf,
+0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf, 0x3c5, 0x3b,
+0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1, 0x3af, 0x3bf,
+0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af,
+0x3bf, 0x3c5, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3,
+0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61,
+0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73,
+0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x69, 0x3b, 0x61,
+0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
+0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69,
+0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7,
+0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7,
+0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd,
+0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c, 0xabe,
+0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe,
+0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1,
+0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b,
+0xa91, 0xa95, 0xacd, 0xa9f, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7,
+0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c,
+0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b,
+0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b,
+0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72,
+0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75,
+0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61,
+0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61,
+0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59,
+0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x62c, 0x64e, 0x646, 0x3b, 0x6a2, 0x64e, 0x628,
+0x3b, 0x645, 0x64e, 0x631, 0x3b, 0x623, 0x64e, 0x6a2, 0x652, 0x631, 0x3b, 0x645, 0x64e, 0x64a, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x3b,
+0x64a, 0x64f, 0x648, 0x644, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x3b, 0x633, 0x64e, 0x62a, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a, 0x3b,
+0x646, 0x64f, 0x648, 0x3b, 0x62f, 0x650, 0x633, 0x3b, 0x62c, 0x64e, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x6a2, 0x64e, 0x628,
+0x652, 0x631, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x645, 0x64e, 0x631, 0x650, 0x633, 0x652, 0x3b, 0x623, 0x64e, 0x6a2, 0x652, 0x631,
+0x650, 0x644, 0x64f, 0x3b, 0x645, 0x64e, 0x64a, 0x64f, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x650, 0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x650,
+0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x633, 0x652, 0x62a, 0x64e, 0x3b, 0x633, 0x64e, 0x62a, 0x64f, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x623,
+0x64f, 0x643, 0x652, 0x62a, 0x648, 0x64f, 0x628, 0x64e, 0x3b, 0x646, 0x64f, 0x648, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x62f, 0x650,
+0x633, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0,
+0x5e4, 0x5e8, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x3b, 0x5e1,
+0x5e4, 0x5d8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8,
+0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0,
+0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1,
+0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8,
+0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c,
+0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905,
+0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c,
+0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b,
+0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a,
+0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e,
+0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
+0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1,
+0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b,
+0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a,
+0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a,
+0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0xe1, 0x67, 0xfa, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
+0xf3, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61,
+0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e,
+0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0xc1, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73,
+0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61,
+0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
+0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1,
+0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49,
+0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3, 0x6d, 0x68, 0x3b,
+0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61,
+0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42,
+0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49,
+0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68,
+0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72,
+0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x3b, 0x45, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e,
+0x3b, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x67,
+0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74,
+0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62,
+0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d,
+0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f, 0x3b,
+0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74,
+0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53,
+0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0,
+0xcc0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8e, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc6, 0x3b,
+0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcaa, 0xccd,
+0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82,
+0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe,
+0x3b, 0xc8e, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8,
+0x3b, 0xca1, 0xcbf, 0x3b, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441,
+0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442,
+0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436,
+0x435, 0x43b, 0x442, 0x2e, 0x3b, 0x49b, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430,
+0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443,
+0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49b, 0x44b, 0x440, 0x43a,
+0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436, 0x435,
+0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x79,
+0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67,
+0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x3b, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0x47, 0x61, 0x73,
+0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x74,
+0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e,
+0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a, 0x65, 0x6c, 0x69,
+0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f,
+0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x3b, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4,
+0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b,
+0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x3b, 0xe7, 0x69, 0x6c, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x61, 0x64, 0x72, 0x3b,
+0x6e, 0xee, 0x73, 0x3b, 0x67, 0x75, 0x6c, 0x3b, 0x68, 0x65, 0x7a, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x38, 0x3b, 0x39, 0x3b,
+0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xe7, 0x69, 0x6c, 0x65, 0x3b, 0x73, 0x69, 0x62, 0x61, 0x74, 0x3b,
+0x61, 0x64, 0x61, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x61, 0x6e, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x68, 0x65, 0x7a,
+0xee, 0x72, 0x61, 0x6e, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b,
+0xe7, 0x3b, 0x73, 0x3b, 0x61, 0x3b, 0x6e, 0x3b, 0x67, 0x3b, 0x68, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30,
+0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb5, 0x2e,
+0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b,
+0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b,
+0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1,
+0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2,
+0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab,
+0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97,
+0xeb1, 0xe99, 0xea7, 0xeb2, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
+0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a,
+0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66,
+0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b, 0x6c,
+0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c, 0x69,
+0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69,
+0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73,
+0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x73, 0x31, 0x3b, 0x73, 0x32, 0x3b, 0x73, 0x33, 0x3b,
+0x73, 0x34, 0x3b, 0x73, 0x35, 0x3b, 0x73, 0x36, 0x3b, 0x73, 0x37, 0x3b, 0x73, 0x38, 0x3b, 0x73, 0x39, 0x3b, 0x73, 0x31,
+0x30, 0x3b, 0x73, 0x31, 0x31, 0x3b, 0x73, 0x31, 0x32, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79,
+0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9,
+0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e,
+0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
+0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74,
+0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b,
+0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
+0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20,
+0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e,
+0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3,
+0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x53, 0x61, 0x75, 0x3b, 0x56, 0x61, 0x73,
+0x3b, 0x4b, 0x6f, 0x76, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x47, 0x65, 0x67, 0x3b, 0x42, 0x69, 0x72, 0x3b, 0x4c, 0x69, 0x65,
+0x3b, 0x52, 0x67, 0x70, 0x3b, 0x52, 0x67, 0x73, 0x3b, 0x53, 0x70, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x3b, 0x47, 0x72, 0x64,
+0x3b, 0x73, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61,
+0x73, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69,
+0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74,
+0x69, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c,
+0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x56,
+0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47,
+0x3b, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e,
+0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b,
+0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a,
+0x435, 0x43c, 0x2e, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438,
+0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438,
+0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432,
+0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b,
+0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458,
+0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c,
+0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73,
+0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61,
+0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61,
+0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d,
+0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
+0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d,
+0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b,
+0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d,
+0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42,
+0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b,
+0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0x3b, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c,
+0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d,
+0xd30, 0xd3f, 0xd32, 0xd4d, 0x200d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32,
+0xd48, 0x3b, 0xd06, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c,
+0xd30, 0xd4d, 0x200d, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd30, 0xd4d,
+0x200d, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f,
+0x3b, 0xd2e, 0xd47, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21,
+0xd3f, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
+0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61,
+0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b,
+0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b,
+0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b,
+0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x50, 0x113, 0x70, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x101, 0x65, 0x68,
+0x65, 0x3b, 0x100, 0x70, 0x65, 0x72, 0x69, 0x72, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x48, 0x75, 0x6e, 0x65, 0x3b, 0x48,
+0x16b, 0x72, 0x61, 0x65, 0x3b, 0x100, 0x6b, 0x75, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65, 0x70, 0x65, 0x74, 0x65, 0x6d,
+0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x68, 0x65,
+0x6d, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e,
+0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c,
+0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902,
+0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930,
+0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f,
+0x3b, 0x445, 0x443, 0x43b, 0x3b, 0x4af, 0x445, 0x44d, 0x3b, 0x431, 0x430, 0x440, 0x3b, 0x442, 0x443, 0x443, 0x3b, 0x43b, 0x443, 0x443,
+0x3b, 0x43c, 0x43e, 0x433, 0x3b, 0x43c, 0x43e, 0x440, 0x3b, 0x445, 0x43e, 0x43d, 0x3b, 0x431, 0x438, 0x447, 0x3b, 0x442, 0x430, 0x445,
+0x3b, 0x43d, 0x43e, 0x445, 0x3b, 0x433, 0x430, 0x445, 0x3b, 0x425, 0x443, 0x43b, 0x433, 0x430, 0x43d, 0x430, 0x3b, 0x4ae, 0x445, 0x44d,
+0x440, 0x3b, 0x411, 0x430, 0x440, 0x3b, 0x422, 0x443, 0x443, 0x43b, 0x430, 0x439, 0x3b, 0x41b, 0x443, 0x443, 0x3b, 0x41c, 0x43e, 0x433,
+0x43e, 0x439, 0x3b, 0x41c, 0x43e, 0x440, 0x44c, 0x3b, 0x425, 0x43e, 0x43d, 0x44c, 0x3b, 0x411, 0x438, 0x447, 0x3b, 0x422, 0x430, 0x445,
+0x438, 0x430, 0x3b, 0x41d, 0x43e, 0x445, 0x43e, 0x439, 0x3b, 0x413, 0x430, 0x445, 0x430, 0x439, 0x3b, 0x91c, 0x928, 0x3b, 0x92b, 0x947,
+0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928,
+0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b,
+0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c,
+0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938,
+0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b,
+0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x967, 0x3b, 0x968, 0x3b,
+0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b,
+0x967, 0x968, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
+0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x947, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908,
+0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915,
+0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d,
+0x92c, 0x930, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67,
+0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73,
+0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x67, 0x65, 0x6e, 0x69, 0xe8, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x69, 0xe8, 0x72, 0x3b,
+0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b,
+0x6a, 0x75, 0x6c, 0x68, 0x65, 0x74, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x6f, 0x63, 0x74, 0xf2, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64,
+0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb4d,
+0xb30, 0xb41, 0xb5f, 0xb3e, 0xb30, 0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47,
+0xb32, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f,
+0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b,
+0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b,
+0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38,
+0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631,
+0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
+0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
+0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x627, 0x646,
+0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631,
+0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x648, 0x62a, 0x3b,
+0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc,
+0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646,
+0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x622, 0x6af, 0x648, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x6cc, 0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b,
+0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631,
+0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b,
+0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648,
+0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631,
+0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
+0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
+0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641,
+0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f,
+0x3b, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a,
+0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a,
+0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75,
+0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b,
+0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73,
+0x69, 0x65, 0x72, 0x70, 0x6e, 0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a,
+0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b,
+0x67, 0x72, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x3b, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b,
+0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70, 0x3b, 0x6c, 0x3b, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b,
+0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61,
+0x72, 0xe7, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f,
+0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62,
+0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b,
+0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72,
+0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f,
+0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x7a, 0x3b, 0x6a, 0x61, 0x6e,
+0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f,
+0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75,
+0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b,
+0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a,
+0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2e,
+0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41,
+0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c,
+0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c, 0x3b, 0xa2b, 0x3b, 0xa2e, 0xa3e,
+0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26,
+0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e,
+0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af,
+0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628,
+0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e,
+0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63,
+0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b,
+0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e,
+0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67,
+0x6c, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e,
+0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46,
+0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e,
+0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b,
+0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e,
+0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70, 0x72,
+0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69, 0x65,
+0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6f,
+0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x64,
+0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49,
+0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435,
+0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438,
+0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b,
+0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432, 0x430,
+0x440, 0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440,
+0x435, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f, 0x3b, 0x430, 0x432,
+0x433, 0x443, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431,
+0x440, 0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x3b, 0x42f, 0x3b,
+0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b,
+0x414, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea,
+0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67,
+0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c,
+0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65,
+0x3b, 0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61,
+0x3b, 0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65,
+0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61,
+0x3b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e,
+0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440,
+0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f,
+0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b,
+0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c,
+0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435,
+0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435,
+0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440,
+0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b,
+0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442,
+0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d,
+0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x6a, 0x61, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e,
+0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76,
+0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
+0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
+0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b,
+0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63,
+0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b,
+0x61, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x50, 0x68, 0x65, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x55, 0x62,
+0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x55, 0x70, 0x75, 0x3b, 0x50, 0x68,
+0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x50, 0x75, 0x6e, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x50, 0x68,
+0x65, 0x73, 0x65, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x48, 0x6c, 0x61,
+0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x61,
+0x6e, 0x6f, 0x6e, 0x67, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x6a, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x75, 0x3b,
+0x50, 0x68, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61,
+0x6e, 0x65, 0x3b, 0x50, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x74,
+0x77, 0x65, 0x3b, 0x46, 0x65, 0x72, 0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x6f, 0x70, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x4d,
+0x6f, 0x74, 0x3b, 0x53, 0x65, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x44,
+0x69, 0x70, 0x3b, 0x4e, 0x67, 0x77, 0x3b, 0x53, 0x65, 0x64, 0x3b, 0x46, 0x65, 0x72, 0x69, 0x6b, 0x67, 0x6f, 0x6e, 0x67,
+0x3b, 0x54, 0x6c, 0x68, 0x61, 0x6b, 0x6f, 0x6c, 0x65, 0x3b, 0x4d, 0x6f, 0x70, 0x69, 0x74, 0x6c, 0x6f, 0x3b, 0x4d, 0x6f,
+0x72, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x67, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b,
+0x53, 0x65, 0x65, 0x74, 0x65, 0x62, 0x6f, 0x73, 0x69, 0x67, 0x6f, 0x3b, 0x50, 0x68, 0x75, 0x6b, 0x77, 0x69, 0x3b, 0x50,
+0x68, 0x61, 0x74, 0x77, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x73, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x68, 0x61, 0x6c, 0x61,
+0x6e, 0x65, 0x3b, 0x4e, 0x67, 0x77, 0x61, 0x6e, 0x61, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x53, 0x65, 0x64, 0x69, 0x6d,
+0x6f, 0x6e, 0x74, 0x68, 0x6f, 0x6c, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b,
+0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x4e, 0x79, 0x61, 0x3b,
+0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x3b, 0x5a, 0x76, 0x69, 0x3b, 0x4e, 0x64, 0x69, 0x72, 0x61,
+0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76,
+0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68,
+0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72,
+0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0xda2,
+0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0x3b,
+0xdb8, 0xdd0, 0xdba, 0x3b, 0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0x3b,
+0xd94, 0xd9a, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb4,
+0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd,
+0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3,
+0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad,
+0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8,
+0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6,
+0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xddc, 0x3b, 0xdaf, 0xdd9, 0x3b, 0x42, 0x68, 0x69,
+0x3b, 0x56, 0x61, 0x6e, 0x3b, 0x56, 0x6f, 0x6c, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x68, 0x3b, 0x4e, 0x68, 0x6c,
+0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4e, 0x67, 0x63, 0x3b, 0x4e, 0x79, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x4c, 0x77, 0x65,
+0x3b, 0x4e, 0x67, 0x6f, 0x3b, 0x42, 0x68, 0x69, 0x6d, 0x62, 0x69, 0x64, 0x76, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e,
+0x64, 0x6c, 0x6f, 0x76, 0x61, 0x6e, 0x61, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x75, 0x2d, 0x6c, 0x65, 0x6e, 0x6b,
+0x68, 0x75, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x69, 0x4e, 0x6b, 0x68, 0x77, 0x65, 0x6b, 0x68,
+0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e, 0x68, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x4b, 0x68, 0x6f, 0x6c, 0x77, 0x61, 0x6e,
+0x65, 0x3b, 0x69, 0x4e, 0x67, 0x63, 0x69, 0x3b, 0x69, 0x4e, 0x79, 0x6f, 0x6e, 0x69, 0x3b, 0x69, 0x4d, 0x70, 0x68, 0x61,
+0x6c, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x6e, 0x69, 0x3b, 0x6a,
+0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a,
+0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
+0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75,
+0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a,
+0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b, 0x6a, 0xfa, 0x6c, 0x61, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72,
+0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61,
+0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x4b, 0x6f, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x41, 0x66, 0x72, 0x3b, 0x53, 0x68,
+0x61, 0x3b, 0x4c, 0x69, 0x78, 0x3b, 0x54, 0x6f, 0x64, 0x3b, 0x53, 0x69, 0x64, 0x3b, 0x53, 0x61, 0x67, 0x3b, 0x54, 0x6f,
+0x62, 0x3b, 0x4b, 0x49, 0x54, 0x3b, 0x4c, 0x49, 0x54, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f, 0x62,
+0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
+0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41,
+0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64, 0x3b,
+0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54,
+0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64,
+0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x3b,
+0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
+0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68,
+0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x4b,
+0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b,
+0x3b, 0x4c, 0x3b, 0x65, 0x6e, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d,
+0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
+0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79,
+0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b,
+0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
+0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
+0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f,
+0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70,
+0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c, 0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430,
+0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a,
+0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440,
+0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e,
+0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440,
+0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440,
+0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd,
+0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a,
+0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0x3b, 0xb9c,
+0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd,
+0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8,
+0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbc6, 0xbae, 0xbcd, 0xbaa, 0xbcd, 0xbb0, 0xbcd,
+0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf,
+0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b,
+0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b, 0xc1c, 0xc28,
+0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b,
+0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc42, 0xc32, 0xc48,
+0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05,
+0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02,
+0xc2c, 0xc30, 0xc4d, 0x3b, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0x3b, 0xc0e, 0x3b, 0xc2e, 0xc46, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc1c,
+0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01,
+0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e,
+0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22,
+0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe01, 0xe23,
+0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04,
+0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22, 0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16,
+0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04,
+0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28,
+0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b, 0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0x3b, 0xe01, 0x3b, 0xe21,
+0x3b, 0xe21, 0x3b, 0xe1e, 0x3b, 0xe21, 0x3b, 0xe01, 0x3b, 0xe2a, 0x3b, 0xe01, 0x3b, 0xe15, 0x3b, 0xe1e, 0x3b, 0xe18, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21,
+0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42,
+0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
+0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b,
+0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x3b, 0x1218, 0x130b, 0x1262, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x3b, 0x130d, 0x1295, 0x1266, 0x3b, 0x1230,
+0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x3b, 0x1325, 0x1245, 0x121d, 0x3b, 0x1215, 0x12f3,
+0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a,
+0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b,
+0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x1235, 0x3b,
+0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113,
+0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f,
+0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x3b, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46,
+0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65,
+0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41,
+0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74,
+0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x3b, 0x53, 0x3b,
+0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
+0x54, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x4b, 0x75, 0x6c, 0x3b, 0x44, 0x7a, 0x69, 0x3b, 0x4d, 0x75,
+0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x68, 0x61, 0x3b, 0x4e, 0x64, 0x7a, 0x3b, 0x4e, 0x68,
+0x6c, 0x3b, 0x48, 0x75, 0x6b, 0x3b, 0x4e, 0x27, 0x77, 0x3b, 0x53, 0x75, 0x6e, 0x67, 0x75, 0x74, 0x69, 0x3b, 0x4e, 0x79,
+0x65, 0x6e, 0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x75, 0x6c,
+0x75, 0x3b, 0x44, 0x7a, 0x69, 0x76, 0x61, 0x6d, 0x69, 0x73, 0x6f, 0x6b, 0x6f, 0x3b, 0x4d, 0x75, 0x64, 0x79, 0x61, 0x78,
+0x69, 0x68, 0x69, 0x3b, 0x4b, 0x68, 0x6f, 0x74, 0x61, 0x76, 0x75, 0x78, 0x69, 0x6b, 0x61, 0x3b, 0x4d, 0x61, 0x77, 0x75,
+0x77, 0x61, 0x6e, 0x69, 0x3b, 0x4d, 0x68, 0x61, 0x77, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x64, 0x7a, 0x68, 0x61, 0x74, 0x69,
+0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x48, 0x75, 0x6b, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x27,
+0x77, 0x65, 0x6e, 0x64, 0x7a, 0x61, 0x6d, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75, 0x62, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b,
+0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x3b,
+0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69, 0x73, 0x61,
+0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d,
+0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69,
+0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d,
+0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0x441,
+0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442, 0x2e, 0x3b, 0x431, 0x435, 0x440, 0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b,
+0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438, 0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440,
+0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b,
+0x433, 0x440, 0x443, 0x434, 0x2e, 0x3b, 0x441, 0x456, 0x447, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431,
+0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x43d, 0x44f, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f,
+0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f,
+0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d, 0x44f, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442,
+0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x43d, 0x44f, 0x3b, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a,
+0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x3b, 0x62c, 0x646, 0x648,
+0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x20, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644,
+0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633,
+0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633,
+0x645, 0x628, 0x631, 0x3b, 0x41c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420,
+0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e,
+0x445, 0x438, 0x440, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c,
+0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a,
+0x431, 0x43e, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417,
+0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a, 0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430, 0x3b, 0x62c,
+0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c,
+0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646,
+0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
+0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x75, 0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76,
+0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x3b, 0x44, 0x65, 0x6b, 0x3b, 0x59,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
+0x3b, 0x44, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74,
+0x68, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67,
+0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0x1b0, 0x3b, 0x74, 0x68, 0xe1, 0x6e,
+0x67, 0x20, 0x6e, 0x103, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x73, 0xe1, 0x75, 0x3b, 0x74, 0x68, 0xe1, 0x6e,
+0x67, 0x20, 0x62, 0x1ea3, 0x79, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0xe1, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e,
+0x67, 0x20, 0x63, 0x68, 0xed, 0x6e, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d,
+0x1b0, 0x1edd, 0x69, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61,
+0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b,
+0x47, 0x6f, 0x72, 0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b,
+0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77,
+0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b,
+0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x61,
+0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54,
+0x61, 0x63, 0x68, 0x77, 0x65, 0x64, 0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x3b,
+0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x3b,
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65,
+0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c,
 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41,
-0x72, 0x68, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b,
-0x74, 0x6f, 0x62, 0x61, 0x3b, 0x55, 0x73, 0x69, 0x6e, 0x79, 0x69, 0x6b, 0x68, 0x61, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x6f,
-0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x77, 0x61, 0x72,
-0x65, 0x3b, 0x46, 0x65, 0x62, 0x65, 0x72, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x161, 0x68, 0x65, 0x3b, 0x41,
-0x70, 0x6f, 0x72, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x61,
-0x65, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x65, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x6f, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x69,
-0x73, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x3b, 0x67, 0x75, 0x6f, 0x76,
-0x76, 0x61, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73,
-0x73, 0x65, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x3b, 0x62, 0x6f,
-0x72, 0x67, 0x65, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x3b, 0x73, 0x6b,
-0xe1, 0x62, 0x6d, 0x61, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65,
-0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a,
-0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
-0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f,
-0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b,
-0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x4f, 0x3b, 0x47,
-0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x4a,
-0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x3b,
-0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b,
-0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b,
-0x4b, 0x69, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x3b, 0x54, 0x72, 0x69, 0x3b, 0x53, 0x70, 0x69, 0x3b, 0x52, 0x69, 0x69, 0x3b,
-0x4d, 0x74, 0x69, 0x3b, 0x45, 0x6d, 0x69, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x6e, 0x69, 0x3b, 0x4d, 0x78, 0x69, 0x3b,
-0x4d, 0x78, 0x6b, 0x3b, 0x4d, 0x78, 0x64, 0x3b, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
-0x44, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x54, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x53, 0x70,
-0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61,
-0x74, 0x61, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x45, 0x6d, 0x70, 0x69, 0x74, 0x75, 0x20, 0x69, 0x64, 0x61,
-0x73, 0x3b, 0x4d, 0x61, 0x73, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x6e, 0x67, 0x61, 0x72, 0x69,
-0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78,
-0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c,
-0x20, 0x64, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52, 0x3b,
-0x4d, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65,
-0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x43, 0x75,
-0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69,
-0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61, 0x72, 0x69, 0x3b,
-0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x49, 0x6d, 0x62, 0x3b, 0x4b, 0x61,
-0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d, 0x66,
-0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x77,
-0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d,
-0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61,
-0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61,
-0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e, 0x67, 0x61, 0x64,
-0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61,
-0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f,
-0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b,
-0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69,
-0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x49,
-0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b, 0x73,
-0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75, 0x6b, 0x3b, 0x73,
-0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x6f,
-0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65, 0x257, 0x74, 0x6f, 0x3b,
-0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73, 0x6f, 0x3b, 0x6a,
-0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b,
-0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x3b, 0x73, 0x3b, 0x63, 0x3b, 0x6d, 0x3b, 0x73, 0x3b,
-0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x3b, 0x4a, 0x45, 0x4e, 0x3b,
-0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x57, 0x54, 0x44, 0x3b,
-0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57, 0x4d, 0x57, 0x3b,
-0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
-0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
-0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61,
-0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b,
-0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e,
-0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47,
-0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x3b, 0x4f, 0x62, 0x6f, 0x3b, 0x57, 0x61, 0x61,
-0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70,
-0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62, 0x3b, 0x54, 0x6f, 0x77,
-0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6b, 0x75, 0x6e, 0x69,
-0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e, 0x3b, 0x4c, 0x61, 0x70,
-0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6c,
-0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20,
-0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x61,
-0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61,
-0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
-0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b,
-0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x65, 0x69,
-0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b,
-0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b,
-0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x5a, 0x69, 0x62, 0x3b, 0x4e, 0x68,
-0x6c, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4e, 0x74,
-0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70,
-0x61, 0x3b, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e,
-0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b,
-0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61,
-0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77, 0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a,
-0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77,
-0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b,
-0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x31,
-0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d,
-0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b,
-0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
-0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x69, 0x6e, 0x6e, 0x3b, 0x62,
-0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79,
-0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75, 0x77, 0x3b, 0x64,
-0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63,
-0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x79,
-0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b,
-0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64, 0x75, 0x6a, 0x61, 0x6e,
-0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b,
-0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b,
+0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f,
+0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1e62,
+0x1eb9, 0x301, 0x72, 0x1eb9, 0x323, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc,
+0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9,
+0x6d, 0x1ecd, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0,
+0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1e62, 0x1eb8, 0x301, 0x72,
+0x1eb9, 0x301, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9,
+0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x300, 0x62,
+0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x41, 0x67,
+0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x4f, 0x77, 0x65,
+0x77, 0x65, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x42, 0xe9,
+0x6c, 0xfa, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73,
+0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b,
+0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75,
+0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
+0x76, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a,
+0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41,
+0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41,
+0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x3b, 0x4a, 0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79,
+0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d,
+0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61,
+0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f,
+0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x2e, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2e, 0x4e, 0x6f, 0x6c, 0x6c,
+0x69, 0x63, 0x6b, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f,
+0x73, 0x68, 0x69, 0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74,
+0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e,
+0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65,
+0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75,
+0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65,
+0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c,
+0x69, 0x63, 0x6b, 0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x57, 0x68, 0x65, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x45, 0x62, 0x72, 0x3b,
+0x4d, 0x65, 0x3b, 0x45, 0x66, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48,
+0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72,
+0x3b, 0x4d, 0x79, 0x73, 0x20, 0x57, 0x68, 0x65, 0x76, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x72,
+0x74, 0x68, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x3b,
+0x4d, 0x79, 0x73, 0x20, 0x45, 0x66, 0x61, 0x6e, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72,
+0x65, 0x6e, 0x3b, 0x4d, 0x79, 0x65, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x47, 0x77, 0x79, 0x6e, 0x67,
+0x61, 0x6c, 0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x44, 0x75,
+0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x3b, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d,
+0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d,
+0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d,
+0x186, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77,
+0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e,
+0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b,
+0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74,
+0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f,
+0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77,
+0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46,
+0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e,
+0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b,
+0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e,
+0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b,
+0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x913,
+0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x913, 0x915, 0x94d, 0x91f, 0x94b,
+0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930,
+0x3b, 0x41, 0x68, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x3b, 0x4f, 0x63, 0x68, 0x3b, 0x41, 0x62, 0x65, 0x3b, 0x41, 0x67, 0x62,
+0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74,
+0x3b, 0x41, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x3b, 0x41, 0x68, 0x61, 0x72, 0x61, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x4f,
+0x66, 0x6c, 0x6f, 0x3b, 0x4f, 0x63, 0x68, 0x6f, 0x6b, 0x72, 0x69, 0x6b, 0x72, 0x69, 0x3b, 0x41, 0x62, 0x65, 0x69, 0x62,
+0x65, 0x65, 0x3b, 0x41, 0x67, 0x62, 0x65, 0x69, 0x6e, 0x61, 0x61, 0x3b, 0x4f, 0x74, 0x75, 0x6b, 0x77, 0x61, 0x64, 0x61,
+0x6e, 0x3b, 0x4d, 0x61, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x47, 0x62,
+0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x6f, 0x6e, 0x3b, 0x41, 0x6c, 0x65, 0x6d, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x61, 0x62,
+0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d,
+0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc,
+0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x65, 0x6e, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45, 0x70, 0x72,
+0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67,
+0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4d, 0x62, 0x65,
+0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61,
+0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d,
+0x3b, 0x128, 0x6b, 0x6c, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77,
+0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b,
+0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e,
+0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129,
+0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x70f, 0x71f,
+0x722, 0x20, 0x70f, 0x712, 0x3b, 0x72b, 0x712, 0x71b, 0x3b, 0x710, 0x715, 0x72a, 0x3b, 0x722, 0x71d, 0x723, 0x722, 0x3b, 0x710, 0x71d,
+0x72a, 0x3b, 0x71a, 0x719, 0x71d, 0x72a, 0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719, 0x3b, 0x710, 0x712, 0x3b, 0x710, 0x71d, 0x720, 0x718,
+0x720, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x710, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x712, 0x3b, 0x70f, 0x71f, 0x722, 0x20,
+0x70f, 0x710, 0x3b, 0x120d, 0x12f0, 0x1275, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x3b, 0x12ad,
+0x1262, 0x1245, 0x3b, 0x121d, 0x2f, 0x1275, 0x3b, 0x12b0, 0x122d, 0x3b, 0x121b, 0x122d, 0x12eb, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x3b, 0x1218, 0x1270,
+0x1209, 0x3b, 0x121d, 0x2f, 0x121d, 0x3b, 0x1270, 0x1215, 0x1233, 0x3b, 0x120d, 0x12f0, 0x1275, 0x122a, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x1265, 0x1272,
+0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x122a, 0x3b, 0x12ad, 0x1262, 0x1245, 0x122a, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20,
+0x1275, 0x131f, 0x1292, 0x122a, 0x3b, 0x12b0, 0x122d, 0x12a9, 0x3b, 0x121b, 0x122d, 0x12eb, 0x121d, 0x20, 0x1275, 0x122a, 0x3b, 0x12eb, 0x12b8, 0x1292,
+0x20, 0x1218, 0x1233, 0x1245, 0x1208, 0x122a, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1218, 0x123d, 0x12c8, 0x122a,
+0x3b, 0x1270, 0x1215, 0x1233, 0x1235, 0x122a, 0x3b, 0x120d, 0x3b, 0x12ab, 0x3b, 0x12ad, 0x3b, 0x134b, 0x3b, 0x12ad, 0x3b, 0x121d, 0x3b, 0x12b0,
+0x3b, 0x121b, 0x3b, 0x12eb, 0x3b, 0x1218, 0x3b, 0x121d, 0x3b, 0x1270, 0x3b, 0x1320, 0x1210, 0x1228, 0x3b, 0x12a8, 0x1270, 0x1270, 0x3b, 0x1218,
+0x1308, 0x1260, 0x3b, 0x12a0, 0x1280, 0x12d8, 0x3b, 0x130d, 0x1295, 0x1263, 0x1275, 0x3b, 0x1220, 0x1295, 0x12e8, 0x3b, 0x1210, 0x1218, 0x1208, 0x3b,
+0x1290, 0x1210, 0x1230, 0x3b, 0x12a8, 0x1228, 0x1218, 0x3b, 0x1320, 0x1240, 0x1218, 0x3b, 0x1280, 0x12f0, 0x1228, 0x3b, 0x1280, 0x1220, 0x1220, 0x3b,
+0x1320, 0x3b, 0x12a8, 0x3b, 0x1218, 0x3b, 0x12a0, 0x3b, 0x130d, 0x3b, 0x1220, 0x3b, 0x1210, 0x3b, 0x1290, 0x3b, 0x12a8, 0x3b, 0x1320, 0x3b,
+0x1280, 0x3b, 0x1280, 0x3b, 0x57, 0x65, 0x79, 0x3b, 0x46, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x6e, 0x3b,
+0x54, 0x75, 0x79, 0x3b, 0x54, 0x73, 0x6f, 0x3b, 0x54, 0x61, 0x66, 0x3b, 0x57, 0x61, 0x72, 0x3b, 0x4b, 0x75, 0x6e, 0x3b,
+0x42, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x53, 0x61, 0x75, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x65, 0x79, 0x65,
+0x6e, 0x65, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x46, 0x61, 0x6e, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x74, 0x61,
+0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x6e, 0x67, 0x72, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x75,
+0x79, 0x6f, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x73, 0x6f, 0x79, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x66,
+0x61, 0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20,
+0x4b, 0x75, 0x6e, 0x6f, 0x62, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x42, 0x61, 0x6e, 0x73, 0x6f, 0x6b, 0x3b, 0x46,
+0x61, 0x69, 0x20, 0x4b, 0x6f, 0x6d, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x53, 0x61, 0x75, 0x6b, 0x3b, 0x44, 0x79, 0x6f, 0x6e,
+0x3b, 0x42, 0x61, 0x61, 0x3b, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x74, 0x79, 0x6f, 0x3b,
+0x41, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x75, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x3b,
+0x53, 0x68, 0x61, 0x6b, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x4e, 0x61, 0x74, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x44,
+0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x42, 0x61, 0x27, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61,
+0x74, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x79, 0x6f, 0x6e,
+0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x72, 0x69, 0x6d, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61,
+0x72, 0x69, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x77, 0x75, 0x72, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53,
+0x68, 0x61, 0x64, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x6b, 0x75, 0x72, 0x3b, 0x50, 0x65, 0x6e,
+0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61,
+0x74, 0x61, 0x74, 0x3b, 0x41, 0x331, 0x79, 0x72, 0x3b, 0x41, 0x331, 0x68, 0x77, 0x3b, 0x41, 0x331, 0x74, 0x61, 0x3b, 0x41,
+0x331, 0x6e, 0x61, 0x3b, 0x41, 0x331, 0x70, 0x66, 0x3b, 0x41, 0x331, 0x6b, 0x69, 0x3b, 0x41, 0x331, 0x74, 0x79, 0x3b, 0x41,
+0x331, 0x6e, 0x69, 0x3b, 0x41, 0x331, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b, 0x53, 0x62, 0x79, 0x3b, 0x53, 0x62, 0x68,
+0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e,
+0x20, 0x41, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x61, 0x74, 0x3b, 0x48,
+0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x61, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331,
+0x70, 0x66, 0x77, 0x6f, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x69, 0x74, 0x61, 0x74, 0x3b,
+0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x79, 0x69, 0x72, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e,
+0x20, 0x41, 0x331, 0x6e, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x75, 0x6d,
+0x76, 0x69, 0x72, 0x69, 0x79, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x3b, 0x48,
+0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b,
+0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27, 0x61, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x5a,
+0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
+0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b,
+0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b,
+0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f,
+0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x75, 0x68, 0x3b, 0x1e70, 0x68, 0x61, 0x3b,
+0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x3b,
+0x4b, 0x68, 0x75, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x1e3c, 0x61, 0x72, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x50, 0x68, 0x61, 0x6e,
+0x64, 0x6f, 0x3b, 0x4c, 0x75, 0x68, 0x75, 0x68, 0x69, 0x3b, 0x1e70, 0x68, 0x61, 0x66, 0x61, 0x6d, 0x75, 0x68, 0x77, 0x65,
+0x3b, 0x4c, 0x61, 0x6d, 0x62, 0x61, 0x6d, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x75, 0x6e, 0x64, 0x75, 0x6e, 0x74, 0x68, 0x75,
+0x6c, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x69, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x61, 0x6e, 0x61, 0x3b, 0x1e70, 0x68, 0x61,
+0x6e, 0x67, 0x75, 0x6c, 0x65, 0x3b, 0x4b, 0x68, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x54, 0x73,
+0x68, 0x69, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x1e3c, 0x61, 0x72, 0x61, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x64, 0x61, 0x76,
+0x68, 0x75, 0x73, 0x69, 0x6b, 0x75, 0x3b, 0x44, 0x7a, 0x76, 0x3b, 0x44, 0x7a, 0x64, 0x3b, 0x54, 0x65, 0x64, 0x3b, 0x41,
+0x66, 0x254, 0x3b, 0x44, 0x61, 0x6d, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x53, 0x69, 0x61, 0x3b, 0x44, 0x65, 0x61, 0x3b, 0x41,
+0x6e, 0x79, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x41, 0x64, 0x65, 0x3b, 0x44, 0x7a, 0x6d, 0x3b, 0x44, 0x7a, 0x6f, 0x76, 0x65,
+0x3b, 0x44, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x54, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x41, 0x66, 0x254, 0x66, 0x69,
+0x25b, 0x3b, 0x44, 0x61, 0x6d, 0x61, 0x3b, 0x4d, 0x61, 0x73, 0x61, 0x3b, 0x53, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b,
+0x44, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x41, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x4b,
+0x65, 0x6c, 0x65, 0x3b, 0x41, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x6d,
+0x65, 0x3b, 0x44, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x41, 0x3b,
+0x4b, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e,
+0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b,
+0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b,
+0x4b, 0x65, 0x6b, 0x2e, 0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61,
+0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b,
+0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70,
+0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b,
+0x4a, 0x75, 0x77, 0x3b, 0x53, 0x77, 0x69, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x54, 0x73, 0x77, 0x3b,
+0x41, 0x74, 0x61, 0x3b, 0x41, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b,
+0x4d, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4a, 0x75, 0x77, 0x75, 0x6e, 0x67, 0x3b,
+0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x69, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73,
+0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4e, 0x79, 0x61, 0x69, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73,
+0x77, 0x6f, 0x6e, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x74, 0x61, 0x61, 0x68, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20,
+0x41, 0x6e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x72, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x5a,
+0x77, 0x61, 0x74, 0x20, 0x41, 0x6b, 0x75, 0x62, 0x75, 0x6e, 0x79, 0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20,
+0x53, 0x77, 0x61, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6a, 0x75, 0x77, 0x61, 0x6e, 0x67,
+0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x2d, 0x4d, 0x61, 0x2d, 0x53, 0x75, 0x79, 0x61, 0x6e, 0x67,
+0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x6c, 0x3b, 0x45, 0x70, 0x75, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x75,
+0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x46, 0x65,
+0x62, 0x75, 0x6c, 0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x75,
+0x6c, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67,
+0x61, 0x73, 0x69, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x75, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x74,
+0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b,
+0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72,
+0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48,
+0x75, 0x6e, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x50, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b,
+0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b,
+0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b,
+0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f,
+0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a,
+0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa,
+0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b,
+0xa2b0, 0xa44b, 0xa1aa, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x72, 0x68, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x55, 0x73, 0x69, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x72, 0x69,
+0x3b, 0x75, 0x46, 0x65, 0x62, 0x65, 0x72, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x74, 0x6a, 0x68, 0x69, 0x3b,
+0x75, 0x2d, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x72, 0x68, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x55, 0x73, 0x69, 0x6e, 0x79, 0x69, 0x6b, 0x68,
+0x61, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b,
+0x4a, 0x61, 0x6e, 0x61, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x65, 0x72, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x4d,
+0x61, 0x74, 0x161, 0x68, 0x65, 0x3b, 0x41, 0x70, 0x6f, 0x72, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
+0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x65, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x65, 0x3b, 0x53, 0x65,
+0x74, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x6f, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x66, 0x65,
+0x6d, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61,
+0x67, 0x65, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x3b, 0x63, 0x75, 0x6f,
+0x14b, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x3b, 0x73, 0x75, 0x6f,
+0x69, 0x64, 0x6e, 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x3b, 0x67, 0x6f, 0x6c,
+0x67, 0x67, 0x6f, 0x74, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x3b, 0x6f,
+0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d,
+0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f,
+0x14b, 0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b,
+0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d,
+0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d,
+0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b,
+0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1,
+0x6e, 0x6e, 0x75, 0x3b, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b,
+0x10c, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a,
+0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f,
+0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1,
+0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b, 0x4b, 0x69, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x3b, 0x54, 0x72, 0x69, 0x3b, 0x53,
+0x70, 0x69, 0x3b, 0x52, 0x69, 0x69, 0x3b, 0x4d, 0x74, 0x69, 0x3b, 0x45, 0x6d, 0x69, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d,
+0x6e, 0x69, 0x3b, 0x4d, 0x78, 0x69, 0x3b, 0x4d, 0x78, 0x6b, 0x3b, 0x4d, 0x78, 0x64, 0x3b, 0x4b, 0x69, 0x6e, 0x67, 0x61,
+0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x44, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x54, 0x72, 0x75, 0x20,
+0x69, 0x64, 0x61, 0x73, 0x3b, 0x53, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x52, 0x69, 0x6d, 0x61, 0x20,
+0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x45, 0x6d, 0x70,
+0x69, 0x74, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x73, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73,
+0x3b, 0x4d, 0x6e, 0x67, 0x61, 0x72, 0x69, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x69,
+0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61,
+0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x64, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4b, 0x3b, 0x44,
+0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44,
+0x3b, 0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74,
+0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65,
+0x62, 0x75, 0x72, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f,
+0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61,
+0x3b, 0x4e, 0x6f, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x43, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
+0x3b, 0x49, 0x6d, 0x62, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73,
+0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75,
+0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69,
+0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69,
+0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f,
+0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68,
+0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20,
+0x6d, 0x66, 0x75, 0x6e, 0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77,
+0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b,
+0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69,
+0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20,
+0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75,
+0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f,
+0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f,
+0x72, 0x3b, 0x6a, 0x75, 0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f,
+0x77, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b,
+0x73, 0x65, 0x65, 0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b,
+0x6d, 0x6f, 0x72, 0x73, 0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61,
+0x72, 0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x3b, 0x73,
+0x3b, 0x63, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a,
+0x3b, 0x62, 0x3b, 0x4a, 0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57,
+0x54, 0x4e, 0x3b, 0x57, 0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57,
+0x49, 0x4b, 0x3b, 0x57, 0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20,
+0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b,
+0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65,
+0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169,
+0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61,
+0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b,
+0x47, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x3b,
+0x4f, 0x62, 0x6f, 0x3b, 0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b,
+0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b,
+0x54, 0x6f, 0x62, 0x3b, 0x54, 0x6f, 0x77, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
+0x65, 0x20, 0x6f, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x27,
+0x77, 0x61, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70,
+0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70,
+0x61, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61,
+0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d,
+0x6f, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f,
+0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65,
+0x3b, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72,
+0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74,
+0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f,
+0x3b, 0x46, 0x65, 0x76, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69,
+0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41,
+0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62,
+0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f,
+0x3b, 0x5a, 0x69, 0x62, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77,
+0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x4d, 0x66, 0x75,
+0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b,
+0x4e, 0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b,
+0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68,
+0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63,
+0x77, 0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66,
+0x75, 0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69,
+0x3b, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d,
+0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b,
+0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b,
+0x4d, 0x31, 0x32, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e,
+0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x69, 0x6e, 0x6e, 0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61,
+0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74,
+0x75, 0x3b, 0x6e, 0x75, 0x77, 0x3b, 0x64, 0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61,
+0x79, 0x1e5b, 0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b,
+0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75,
+0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69,
+0x72, 0x3b, 0x64, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d,
+0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b, 0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31,
+0x2d55, 0x2d30, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62,
+0x2d53, 0x2d4d, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37,
+0x2d53, 0x2d4a, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x2d62, 0x2d55, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a,
+0x3b, 0x2d49, 0x2d31, 0x2d54, 0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b, 0x2d62,
+0x2d53, 0x2d4d, 0x2d62, 0x2d53, 0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b,
+0x2d3d, 0x2d5c, 0x2d53, 0x2d31, 0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f,
+0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e, 0x3b, 0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b,
+0x2d5b, 0x3b, 0x2d3d, 0x3b, 0x2d4f, 0x3b, 0x2d37, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b,
 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b,
 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x3b, 0x59, 0x65, 0x6e, 0x6e,
 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65,
@@ -3404,6 +2147,1364 @@ static const ushort standalone_months_data[] = {
 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b
 };
 
+static const ushort standalone_months_data[] = {
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x63, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72,
+0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x41, 0x6d,
+0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69, 0x74, 0x3b, 0x45, 0x6c, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61,
+0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48, 0x61, 0x67, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61,
+0x64, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x41, 0x6d, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e,
+0x64, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c,
+0x62, 0x61, 0x3b, 0x43, 0x61, 0x61, 0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69,
+0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b,
+0x46, 0x75, 0x75, 0x6c, 0x62, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f, 0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73,
+0x61, 0x3b, 0x53, 0x61, 0x64, 0x61, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64, 0x64, 0x65, 0x65, 0x3b, 0x51, 0x75, 0x6e,
+0x3b, 0x4e, 0x61, 0x68, 0x3b, 0x43, 0x69, 0x67, 0x3b, 0x41, 0x67, 0x64, 0x3b, 0x43, 0x61, 0x78, 0x3b, 0x51, 0x61, 0x73,
+0x3b, 0x51, 0x61, 0x64, 0x3b, 0x4c, 0x65, 0x71, 0x3b, 0x57, 0x61, 0x79, 0x3b, 0x44, 0x69, 0x74, 0x3b, 0x58, 0x69, 0x6d,
+0x3b, 0x4b, 0x61, 0x78, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4e,
+0x61, 0x68, 0x61, 0x72, 0x73, 0x69, 0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x43, 0x69, 0x67, 0x67, 0x69, 0x6c, 0x74, 0x61,
+0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61, 0x78, 0x69, 0x73, 0x73, 0x6f, 0x3b, 0x43,
+0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c, 0x73, 0x61, 0x3b, 0x51, 0x61, 0x73, 0x61, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69,
+0x3b, 0x51, 0x61, 0x64, 0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x4c, 0x65, 0x71, 0x65, 0x65, 0x6e, 0x69, 0x3b,
+0x57, 0x61, 0x79, 0x73, 0x75, 0x3b, 0x44, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d, 0x6f, 0x6c, 0x69, 0x3b,
+0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x51, 0x3b, 0x4e, 0x3b, 0x43, 0x3b,
+0x41, 0x3b, 0x43, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x4c, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x58, 0x3b, 0x4b, 0x3b, 0x51, 0x75,
+0x6e, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x43, 0x69, 0x67,
+0x67, 0x69, 0x6c, 0x74, 0x61, 0x20, 0x4b, 0x75, 0x64, 0x6f, 0x3b, 0x41, 0x67, 0x64, 0x61, 0x20, 0x42, 0x61, 0x78, 0x69,
+0x73, 0x3b, 0x43, 0x61, 0x78, 0x61, 0x68, 0x20, 0x41, 0x6c, 0x73, 0x61, 0x3b, 0x51, 0x61, 0x73, 0x61, 0x20, 0x44, 0x69,
+0x72, 0x72, 0x69, 0x3b, 0x51, 0x61, 0x64, 0x6f, 0x20, 0x44, 0x69, 0x72, 0x72, 0x69, 0x3b, 0x4c, 0x69, 0x69, 0x71, 0x65,
+0x6e, 0x3b, 0x57, 0x61, 0x79, 0x73, 0x75, 0x3b, 0x44, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x3b, 0x58, 0x69, 0x6d, 0x6f, 0x6c,
+0x69, 0x3b, 0x4b, 0x61, 0x78, 0x78, 0x61, 0x20, 0x47, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x75, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b,
+0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b,
+0x53, 0x68, 0x6b, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x50, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x51, 0x65, 0x72, 0x3b,
+0x4b, 0x6f, 0x72, 0x3b, 0x47, 0x73, 0x68, 0x3b, 0x53, 0x68, 0x74, 0x3b, 0x54, 0x65, 0x74, 0x3b, 0x4e, 0xeb, 0x6e, 0x3b,
+0x44, 0x68, 0x6a, 0x3b, 0x6a, 0x61, 0x6e, 0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72,
+0x73, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x3b,
+0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72,
+0x3b, 0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b, 0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f,
+0x72, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x51, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x53, 0x3b,
+0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355,
+0x1228, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x3b, 0x1234, 0x1355, 0x1274, 0x3b,
+0x12a6, 0x12ad, 0x1270, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x3b, 0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265,
+0x1229, 0x12c8, 0x122a, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x1228, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301,
+0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1270, 0x12cd, 0x1260,
+0x122d, 0x3b, 0x1296, 0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x3b, 0x1303, 0x3b, 0x134c, 0x3b, 0x121b, 0x3b,
+0x12a4, 0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b, 0x12f2, 0x3b, 0x64a, 0x646,
+0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a,
+0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623,
+0x63a, 0x633, 0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
+0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623,
+0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x643, 0x627, 0x646,
+0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b,
+0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645,
+0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644,
+0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646,
+0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646,
+0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x646, 0x648,
+0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a,
+0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a,
+0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644,
+0x3b, 0x540, 0x576, 0x57e, 0x3b, 0x553, 0x57f, 0x57e, 0x3b, 0x544, 0x580, 0x57f, 0x3b, 0x531, 0x57a, 0x580, 0x3b, 0x544, 0x575, 0x57d,
+0x3b, 0x540, 0x576, 0x57d, 0x3b, 0x540, 0x56c, 0x57d, 0x3b, 0x555, 0x563, 0x57d, 0x3b, 0x54d, 0x565, 0x57a, 0x3b, 0x540, 0x578, 0x56f,
+0x3b, 0x546, 0x578, 0x575, 0x3b, 0x534, 0x565, 0x56f, 0x3b, 0x540, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b, 0x553, 0x565, 0x57f,
+0x580, 0x57e, 0x561, 0x580, 0x3b, 0x544, 0x561, 0x580, 0x57f, 0x3b, 0x531, 0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x544, 0x561, 0x575, 0x56b,
+0x57d, 0x3b, 0x540, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b, 0x540, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x3b, 0x555, 0x563, 0x578, 0x57d,
+0x57f, 0x578, 0x57d, 0x3b, 0x54d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x540, 0x578, 0x56f, 0x57f, 0x565, 0x574,
+0x562, 0x565, 0x580, 0x3b, 0x546, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x534, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562,
+0x565, 0x580, 0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39,
+0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0,
+0x9c1, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1,
+0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x3b, 0x985, 0x995, 0x9cd,
+0x99f, 0x9cb, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0,
+0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa,
+0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997,
+0x9b7, 0x9cd, 0x99f, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb,
+0x9ac, 0x9f0, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b,
+0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b,
+0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
+0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61,
+0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x130, 0x79, 0x75,
+0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x79, 0x61,
+0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65,
+0x6b, 0x61, 0x62, 0x72, 0x3b, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c,
+0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x443, 0x43d, 0x3b, 0x438,
+0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b,
+0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431,
+0x440, 0x3b, 0x75, 0x72, 0x74, 0x3b, 0x6f, 0x74, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x69, 0x3b, 0x6d, 0x61,
+0x69, 0x3b, 0x65, 0x6b, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x3b, 0x61, 0x62, 0x75, 0x3b, 0x69, 0x72, 0x61, 0x3b, 0x75, 0x72,
+0x72, 0x3b, 0x61, 0x7a, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x3b, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x3b,
+0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72,
+0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75,
+0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72, 0x61, 0x69, 0x6c,
+0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64,
+0x75, 0x61, 0x3b, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49,
+0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac,
+0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf,
+0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f,
+0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b,
+0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x99c, 0x9be, 0x3b,
+0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b,
+0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20,
+0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf25, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0x20, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf28, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0x20, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x20, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0x20, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf66,
+0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
+0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3,
+0xf5d, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf63, 0xf94,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
+0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d,
+0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45, 0xf74,
+0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf5d, 0xf0b, 0xf56, 0xf45,
+0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x44f, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b,
+0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b,
+0x438, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e,
+0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440,
+0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b,
+0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435,
+0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440,
+0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c,
+0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016,
+0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029,
+0x3b, 0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x3b, 0x1007, 0x1014,
+0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019, 0x1010,
+0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f,
+0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1021, 0x1031,
+0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012, 0x102e,
+0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b,
+0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430,
+0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x442, 0x440, 0x430, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d,
+0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442,
+0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b,
+0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x447, 0x44d, 0x440,
+0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b,
+0x432, 0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b,
+0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x3b, 0x441, 0x3b, 0x43b,
+0x3b, 0x441, 0x3b, 0x43a, 0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441,
+0x3b, 0x17e1, 0x3b, 0x17e2, 0x3b, 0x17e3, 0x3b, 0x17e4, 0x3b, 0x17e5, 0x3b, 0x17e6, 0x3b, 0x17e7, 0x3b, 0x17e8, 0x3b, 0x17e9, 0x3b, 0x17e1,
+0x17e0, 0x3b, 0x17e1, 0x17e1, 0x3b, 0x17e1, 0x17e2, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b,
+0x1798, 0x17b7, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793,
+0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b,
+0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x3b, 0x67,
+0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x2e, 0x3b, 0x73,
+0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x67,
+0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b,
+0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62,
+0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x67, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x6f,
+0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b,
+0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341,
+0x4e8c, 0x6708, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708,
+0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32,
+0x6708, 0x3b, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73,
+0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c,
+0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b,
+0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x61,
+0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72,
+0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b, 0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c,
+0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70, 0x72, 0x6f, 0x73,
+0x69, 0x6e, 0x61, 0x63, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b,
+0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b,
+0x31, 0x32, 0x2e, 0x3b, 0x6c, 0x65, 0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x65,
+0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65, 0x6e, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65,
+0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e, 0x3b, 0x7a, 0xe1, 0x159,
+0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x70, 0x72, 0x6f,
+0x73, 0x69, 0x6e, 0x65, 0x63, 0x3b, 0x6c, 0x3b, 0xfa, 0x3b, 0x62, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x10d, 0x3b, 0x10d, 0x3b,
+0x73, 0x3b, 0x7a, 0x3b, 0x159, 0x3b, 0x6c, 0x3b, 0x70, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75,
+0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61,
+0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61,
+0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61,
+0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65,
+0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b,
+0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
+0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75,
+0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
+0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xd801, 0xdc16,
+0xd801, 0xdc30, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc2f, 0xd801, 0xdc3a, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0x3b, 0xd801,
+0xdc01, 0xd801, 0xdc39, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16,
+0xd801, 0xdc2d, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc02, 0xd801, 0xdc40, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f, 0xd801, 0xdc39, 0x3b, 0xd801, 0xdc09, 0xd801,
+0xdc3f, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc24, 0xd801, 0xdc2c, 0xd801, 0xdc42, 0x3b, 0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801, 0xdc45, 0x3b, 0xd801, 0xdc16,
+0xd801, 0xdc30, 0xd801, 0xdc4c, 0xd801, 0xdc37, 0xd801, 0xdc2d, 0xd801, 0xdc2f, 0xd801, 0xdc49, 0xd801, 0xdc28, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc2f, 0xd801,
+0xdc3a, 0xd801, 0xdc49, 0xd801, 0xdc2d, 0xd801, 0xdc2f, 0xd801, 0xdc49, 0xd801, 0xdc28, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc2a, 0xd801, 0xdc49, 0xd801, 0xdc3d,
+0x3b, 0xd801, 0xdc01, 0xd801, 0xdc39, 0xd801, 0xdc49, 0xd801, 0xdc2e, 0xd801, 0xdc4a, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc16, 0xd801,
+0xdc2d, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc16, 0xd801, 0xdc2d, 0xd801, 0xdc4a, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc02, 0xd801, 0xdc40, 0xd801, 0xdc32, 0xd801,
+0xdc45, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc2f, 0xd801, 0xdc39, 0xd801, 0xdc3b, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32,
+0xd801, 0xdc49, 0x3b, 0xd801, 0xdc09, 0xd801, 0xdc3f, 0xd801, 0xdc3b, 0xd801, 0xdc2c, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc24,
+0xd801, 0xdc2c, 0xd801, 0xdc42, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc14, 0xd801, 0xdc28, 0xd801,
+0xdc45, 0xd801, 0xdc2f, 0xd801, 0xdc4b, 0xd801, 0xdc3a, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc19, 0x3b, 0xd801, 0xdc23,
+0x3b, 0xd801, 0xdc01, 0x3b, 0xd801, 0xdc23, 0x3b, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc16, 0x3b, 0xd801, 0xdc02, 0x3b, 0xd801, 0xdc1d, 0x3b, 0xd801,
+0xdc09, 0x3b, 0xd801, 0xdc24, 0x3b, 0xd801, 0xdc14, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d,
+0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a,
+0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f,
+0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72,
+0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x69,
+0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b,
+0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
+0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61,
+0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b,
+0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
+0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b, 0x68,
+0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f,
+0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f, 0x3b, 0x73,
+0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75, 0x6c,
+0x75, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b,
+0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x74,
+0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e,
+0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b,
+0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6a, 0x6f,
+0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48,
+0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69,
+0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f,
+0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65,
+0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f,
+0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x58,
+0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x58,
+0x75, 0xf1, 0x3b, 0x58, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65,
+0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f,
+0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53,
+0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x10d8, 0x10d0,
+0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5,
+0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd,
+0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5,
+0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8,
+0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5,
+0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd,
+0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db,
+0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0,
+0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d,
+0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a,
+0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a,
+0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
+0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b,
+0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d,
+0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65,
+0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391,
+0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x3ca, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3,
+0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b, 0x399, 0x3b1, 0x3bd,
+0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b,
+0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9,
+0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391,
+0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3, 0x3c4, 0x3bf, 0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
+0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
+0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b, 0x391, 0x3b,
+0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x69, 0x3b,
+0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab,
+0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae,
+0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa,
+0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c,
+0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae,
+0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c,
+0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0,
+0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8,
+0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b,
+0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e,
+0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e,
+0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77,
+0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69,
+0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79,
+0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53,
+0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62,
+0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
+0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x62c, 0x64e, 0x646, 0x3b, 0x6a2, 0x64e,
+0x628, 0x3b, 0x645, 0x64e, 0x631, 0x3b, 0x623, 0x64e, 0x6a2, 0x652, 0x631, 0x3b, 0x645, 0x64e, 0x64a, 0x3b, 0x64a, 0x64f, 0x648, 0x646,
+0x3b, 0x64a, 0x64f, 0x648, 0x644, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x3b, 0x633, 0x64e, 0x62a, 0x3b, 0x623, 0x64f, 0x643, 0x652, 0x62a,
+0x3b, 0x646, 0x64f, 0x648, 0x3b, 0x62f, 0x650, 0x633, 0x3b, 0x62c, 0x64e, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x6a2, 0x64e,
+0x628, 0x652, 0x631, 0x64e, 0x64a, 0x652, 0x631, 0x64f, 0x3b, 0x645, 0x64e, 0x631, 0x650, 0x633, 0x652, 0x3b, 0x623, 0x64e, 0x6a2, 0x652,
+0x631, 0x650, 0x644, 0x64f, 0x3b, 0x645, 0x64e, 0x64a, 0x64f, 0x3b, 0x64a, 0x64f, 0x648, 0x646, 0x650, 0x3b, 0x64a, 0x64f, 0x648, 0x644,
+0x650, 0x3b, 0x623, 0x64e, 0x63a, 0x64f, 0x633, 0x652, 0x62a, 0x64e, 0x3b, 0x633, 0x64e, 0x62a, 0x64f, 0x645, 0x652, 0x628, 0x64e, 0x3b,
+0x623, 0x64f, 0x643, 0x652, 0x62a, 0x648, 0x64f, 0x628, 0x64e, 0x3b, 0x646, 0x64f, 0x648, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x62f,
+0x650, 0x633, 0x64e, 0x645, 0x652, 0x628, 0x64e, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8,
+0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5f3,
+0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5f3,
+0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de,
+0x5e8, 0x5e1, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7,
+0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x91c, 0x928,
+0x935, 0x930, 0x940, 0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d,
+0x924, 0x3b, 0x938, 0x93f, 0x924, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935,
+0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e,
+0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b,
+0x926, 0x93f, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b,
+0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b,
+0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
+0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1,
+0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1,
+0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75,
+0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41,
+0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0xe1, 0x67,
+0xfa, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0xf3, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61,
+0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70,
+0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67,
+0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65,
+0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0xe1, 0x3b, 0x73, 0x3b, 0x6f, 0x3b,
+0x6e, 0x3b, 0x64, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74,
+0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x45,
+0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42,
+0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d,
+0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c,
+0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74,
+0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b,
+0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73,
+0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65,
+0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b,
+0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b,
+0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b,
+0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b,
+0x47, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x4d, 0x61, 0x72,
+0x7a, 0x6f, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x47, 0x69, 0x75,
+0x67, 0x6e, 0x6f, 0x3b, 0x4c, 0x75, 0x67, 0x6c, 0x69, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xc9c, 0xca8,
+0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcc0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b,
+0xc8e, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc6, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8,
+0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95,
+0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82,
+0xcac, 0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8e, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b,
+0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x3b, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b,
+0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b,
+0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440, 0x2e, 0x3b,
+0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x2e, 0x3b, 0x49b, 0x430, 0x4a3, 0x442,
+0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456,
+0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435,
+0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430,
+0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x6d,
+0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67,
+0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e,
+0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x3b, 0x4d,
+0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b,
+0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e,
+0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b,
+0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a, 0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61,
+0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x3b,
+0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4,
+0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x3b, 0xe7,
+0x69, 0x6c, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x61, 0x64, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x3b, 0x67, 0x75, 0x6c, 0x3b, 0x68,
+0x65, 0x7a, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b,
+0xe7, 0x69, 0x6c, 0x65, 0x3b, 0x73, 0x69, 0x62, 0x61, 0x74, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x6e, 0xee, 0x73, 0x61,
+0x6e, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x68, 0x65, 0x7a, 0xee, 0x72, 0x61, 0x6e, 0x3b, 0x37, 0x3b, 0x38, 0x3b,
+0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xe7, 0x3b, 0x73, 0x3b, 0x61, 0x3b, 0x6e, 0x3b, 0x67,
+0x3b, 0x68, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0xea1, 0x2e,
+0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb5, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x2e, 0x3b,
+0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e,
+0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e,
+0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0,
+0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81,
+0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95,
+0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0x3b, 0x6a, 0x61, 0x6e, 0x76,
+0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d,
+0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e,
+0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b,
+0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b,
+0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c, 0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
+0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69,
+0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69,
+0x73, 0x3b, 0x73, 0x31, 0x3b, 0x73, 0x32, 0x3b, 0x73, 0x33, 0x3b, 0x73, 0x34, 0x3b, 0x73, 0x35, 0x3b, 0x73, 0x36, 0x3b,
+0x73, 0x37, 0x3b, 0x73, 0x38, 0x3b, 0x73, 0x39, 0x3b, 0x73, 0x31, 0x30, 0x3b, 0x73, 0x31, 0x31, 0x3b, 0x73, 0x31, 0x32,
+0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
+0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
+0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e,
+0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73,
+0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
+0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20,
+0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77,
+0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
+0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b,
+0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62,
+0x61, 0x6c, 0xe9, 0x3b, 0x53, 0x61, 0x75, 0x73, 0x2e, 0x3b, 0x56, 0x61, 0x73, 0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x3b, 0x42,
+0x61, 0x6c, 0x2e, 0x3b, 0x47, 0x65, 0x67, 0x2e, 0x3b, 0x42, 0x69, 0x72, 0x2e, 0x3b, 0x4c, 0x69, 0x65, 0x70, 0x2e, 0x3b,
+0x52, 0x75, 0x67, 0x70, 0x6a, 0x2e, 0x3b, 0x52, 0x75, 0x67, 0x73, 0x2e, 0x3b, 0x53, 0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x4c,
+0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x47, 0x72, 0x75, 0x6f, 0x64, 0x2e, 0x3b, 0x53, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b,
+0x56, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4b, 0x6f, 0x76, 0x61, 0x73, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x64,
+0x69, 0x73, 0x3b, 0x47, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x42, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b, 0x4c,
+0x69, 0x65, 0x70, 0x61, 0x3b, 0x52, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x52, 0x75, 0x67, 0x73, 0x117,
+0x6a, 0x69, 0x73, 0x3b, 0x53, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x4c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69, 0x73,
+0x3b, 0x47, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42,
+0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435,
+0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d,
+0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a,
+0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x2e, 0x3b, 0x458, 0x430, 0x43d, 0x443,
+0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f,
+0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432,
+0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c,
+0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438,
+0x3b, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e,
+0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72,
+0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65, 0x70,
+0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72, 0x79,
+0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70, 0x72,
+0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79, 0x3b, 0x41,
+0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4f,
+0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x61,
+0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65,
+0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xd1c, 0xd28, 0xd41, 0x3b,
+0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b, 0xd2e,
+0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46,
+0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f, 0xd38,
+0xd02, 0x3b, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e,
+0xd3e, 0xd30, 0xd4d, 0x200d, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd32, 0xd4d, 0x200d, 0x3b, 0xd2e, 0xd47,
+0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd23, 0xd4d, 0x200d, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd06, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d,
+0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f,
+0xd4b, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c, 0xd30,
+0xd4d, 0x200d, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd47, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd1c,
+0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72,
+0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75,
+0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
+0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75, 0x3b,
+0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75,
+0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72,
+0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x44,
+0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120, 0x3b,
+0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x48, 0x101, 0x6e, 0x75, 0x65, 0x72, 0x65, 0x3b,
+0x50, 0x113, 0x70, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x101, 0x65, 0x68, 0x65, 0x3b, 0x100, 0x70, 0x65, 0x72, 0x69, 0x72,
+0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x48, 0x75, 0x6e, 0x65, 0x3b, 0x48, 0x16b, 0x72, 0x61, 0x65, 0x3b, 0x100, 0x6b, 0x75,
+0x68, 0x61, 0x74, 0x61, 0x3b, 0x48, 0x65, 0x70, 0x65, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x4f, 0x6b, 0x65, 0x74, 0x6f, 0x70,
+0x61, 0x3b, 0x4e, 0x6f, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x68, 0x65, 0x6d, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935,
+0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a,
+0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b,
+0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b,
+0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930,
+0x3b, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941,
+0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x3b, 0x445, 0x443, 0x43b, 0x3b, 0x4af, 0x445, 0x44d,
+0x3b, 0x431, 0x430, 0x440, 0x3b, 0x442, 0x443, 0x443, 0x3b, 0x43b, 0x443, 0x443, 0x3b, 0x43c, 0x43e, 0x433, 0x3b, 0x43c, 0x43e, 0x440,
+0x3b, 0x445, 0x43e, 0x43d, 0x3b, 0x431, 0x438, 0x447, 0x3b, 0x442, 0x430, 0x445, 0x3b, 0x43d, 0x43e, 0x445, 0x3b, 0x433, 0x430, 0x445,
+0x3b, 0x425, 0x443, 0x43b, 0x433, 0x430, 0x43d, 0x430, 0x3b, 0x4ae, 0x445, 0x44d, 0x440, 0x3b, 0x411, 0x430, 0x440, 0x3b, 0x422, 0x443,
+0x443, 0x43b, 0x430, 0x439, 0x3b, 0x41b, 0x443, 0x443, 0x3b, 0x41c, 0x43e, 0x433, 0x43e, 0x439, 0x3b, 0x41c, 0x43e, 0x440, 0x44c, 0x3b,
+0x425, 0x43e, 0x43d, 0x44c, 0x3b, 0x411, 0x438, 0x447, 0x3b, 0x422, 0x430, 0x445, 0x438, 0x430, 0x3b, 0x41d, 0x43e, 0x445, 0x43e, 0x439,
+0x3b, 0x413, 0x430, 0x445, 0x430, 0x439, 0x3b, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b,
+0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x3b, 0x905, 0x917,
+0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f,
+0x938, 0x947, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c,
+0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c,
+0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921,
+0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b,
+0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940,
+0x3b, 0x92b, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x947, 0x932, 0x3b,
+0x92e, 0x908, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938,
+0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b,
+0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
+0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a,
+0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f,
+0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x67, 0x65, 0x6e,
+0x69, 0xe8, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x69, 0xe8, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x65, 0x74, 0x3b, 0x61,
+0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0xf2, 0x62, 0x72,
+0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
+0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb4d, 0xb30, 0xb41, 0xb5f, 0xb3e, 0xb30, 0xb40, 0x3b, 0xb2e,
+0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0xb28,
+0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e,
+0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b,
+0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b,
+0xb2e, 0xb47, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f,
+0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627,
+0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab,
+0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645,
+0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631,
+0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648,
+0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b,
+0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b,
+0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648,
+0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648,
+0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645,
+0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x6cc,
+0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641,
+0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x640, 0x6cc,
+0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x62c, 0x3b,
+0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b,
+0x62f, 0x3b, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61,
+0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c, 0x75,
+0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73,
+0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65, 0x144, 0x3b, 0x70, 0x61, 0x17a,
+0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72,
+0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x3b, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c,
+0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70, 0x3b, 0x6c, 0x3b, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d,
+0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
+0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x75, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a,
+0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72,
+0xe7, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b,
+0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72,
+0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44,
+0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b,
+0x73, 0x65, 0x74, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x7a, 0x3b, 0x6a, 0x61, 0x6e, 0x65,
+0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b,
+0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c,
+0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f,
+0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65,
+0x6d, 0x62, 0x72, 0x6f, 0x3b, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e,
+0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32,
+0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30,
+0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c, 0x3b, 0xa2b, 0x3b, 0xa2e, 0xa3e, 0x3b,
+0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x3b,
+0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631,
+0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633,
+0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631,
+0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b,
+0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c,
+0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f,
+0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65,
+0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c,
+0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61,
+0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46, 0x3b,
+0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b,
+0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b, 0x69,
+0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x66,
+0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70, 0x72, 0x69,
+0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69, 0x65, 0x3b,
+0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6f, 0x63,
+0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x64, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432,
+0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d,
+0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a,
+0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c,
+0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c,
+0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441,
+0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d,
+0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0x42f, 0x3b, 0x424, 0x3b, 0x41c, 0x3b,
+0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b, 0x414, 0x3b, 0x4e, 0x79,
+0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6,
+0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67, 0x62, 0x3b, 0x4e, 0x61,
+0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64, 0xef,
+0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b, 0x42, 0xea, 0x6c,
+0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc, 0x6b,
+0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65, 0x72, 0x65, 0x3b, 0x4e,
+0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b,
+0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458,
+0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442,
+0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440,
+0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458,
+0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c,
+0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440,
+0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431,
+0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b,
+0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
+0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c,
+0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c,
+0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63,
+0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61,
+0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b,
+0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x50, 0x68, 0x65, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x55, 0x62, 0x65, 0x3b, 0x4d, 0x6d,
+0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x55, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x65,
+0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x50, 0x75, 0x6e, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x50, 0x68, 0x65, 0x73, 0x65, 0x6b,
+0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x6f, 0x6c, 0x61, 0x3b, 0x48, 0x6c, 0x61, 0x6b, 0x75, 0x62, 0x65,
+0x6c, 0x65, 0x3b, 0x4d, 0x6d, 0x65, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x61, 0x6e, 0x6f, 0x6e, 0x67,
+0x3b, 0x50, 0x68, 0x75, 0x70, 0x6a, 0x61, 0x6e, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x70, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x74,
+0x61, 0x3b, 0x4c, 0x65, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x50,
+0x75, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x74, 0x77, 0x65, 0x3b, 0x46,
+0x65, 0x72, 0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x6f, 0x70, 0x3b, 0x4d, 0x6f, 0x72, 0x3b, 0x4d, 0x6f, 0x74, 0x3b, 0x53,
+0x65, 0x65, 0x3b, 0x50, 0x68, 0x75, 0x3b, 0x50, 0x68, 0x61, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x3b, 0x4e,
+0x67, 0x77, 0x3b, 0x53, 0x65, 0x64, 0x3b, 0x46, 0x65, 0x72, 0x69, 0x6b, 0x67, 0x6f, 0x6e, 0x67, 0x3b, 0x54, 0x6c, 0x68,
+0x61, 0x6b, 0x6f, 0x6c, 0x65, 0x3b, 0x4d, 0x6f, 0x70, 0x69, 0x74, 0x6c, 0x6f, 0x3b, 0x4d, 0x6f, 0x72, 0x61, 0x6e, 0x61,
+0x6e, 0x67, 0x3b, 0x4d, 0x6f, 0x74, 0x73, 0x68, 0x65, 0x67, 0x61, 0x6e, 0x61, 0x6e, 0x67, 0x3b, 0x53, 0x65, 0x65, 0x74,
+0x65, 0x62, 0x6f, 0x73, 0x69, 0x67, 0x6f, 0x3b, 0x50, 0x68, 0x75, 0x6b, 0x77, 0x69, 0x3b, 0x50, 0x68, 0x61, 0x74, 0x77,
+0x65, 0x3b, 0x4c, 0x77, 0x65, 0x74, 0x73, 0x65, 0x3b, 0x44, 0x69, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4e,
+0x67, 0x77, 0x61, 0x6e, 0x61, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x53, 0x65, 0x64, 0x69, 0x6d, 0x6f, 0x6e, 0x74, 0x68,
+0x6f, 0x6c, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b,
+0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b,
+0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x3b, 0x5a, 0x76, 0x69, 0x3b, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b,
+0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69,
+0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68,
+0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75,
+0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62,
+0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43,
+0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9,
+0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0x3b, 0xdb8, 0xdd0, 0xdba, 0x3b,
+0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0x3b, 0xd94, 0xd9a, 0x3b, 0xdb1,
+0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0,
+0xdcf, 0xdbb, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0,
+0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b,
+0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca,
+0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca,
+0x3b, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b,
+0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xddc, 0x3b, 0xdaf, 0xdd9, 0x3b, 0x42, 0x68, 0x69, 0x3b, 0x56, 0x61, 0x6e,
+0x3b, 0x56, 0x6f, 0x6c, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x68, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4b, 0x68, 0x6f,
+0x3b, 0x4e, 0x67, 0x63, 0x3b, 0x4e, 0x79, 0x6f, 0x3b, 0x4d, 0x70, 0x68, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4e, 0x67, 0x6f,
+0x3b, 0x42, 0x68, 0x69, 0x6d, 0x62, 0x69, 0x64, 0x76, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76,
+0x61, 0x6e, 0x61, 0x3b, 0x69, 0x4e, 0x64, 0x6c, 0x6f, 0x76, 0x75, 0x2d, 0x6c, 0x65, 0x6e, 0x6b, 0x68, 0x75, 0x6c, 0x75,
+0x3b, 0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x69, 0x4e, 0x6b, 0x68, 0x77, 0x65, 0x6b, 0x68, 0x77, 0x65, 0x74, 0x69,
+0x3b, 0x69, 0x4e, 0x68, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x4b, 0x68, 0x6f, 0x6c, 0x77, 0x61, 0x6e, 0x65, 0x3b, 0x69, 0x4e,
+0x67, 0x63, 0x69, 0x3b, 0x69, 0x4e, 0x79, 0x6f, 0x6e, 0x69, 0x3b, 0x69, 0x4d, 0x70, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4c,
+0x77, 0x65, 0x74, 0x69, 0x3b, 0x69, 0x4e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x6e, 0x69, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66,
+0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a,
+0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
+0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61,
+0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa,
+0x6c, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f,
+0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
+0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69,
+0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x53,
+0x61, 0x64, 0x3b, 0x41, 0x66, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x4c, 0x69, 0x78, 0x3b, 0x54, 0x6f, 0x64, 0x3b, 0x53,
+0x69, 0x64, 0x3b, 0x53, 0x61, 0x67, 0x3b, 0x54, 0x6f, 0x62, 0x3b, 0x4b, 0x49, 0x54, 0x3b, 0x4c, 0x49, 0x54, 0x3b, 0x42,
+0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c,
+0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61,
+0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41, 0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
+0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61,
+0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
+0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53,
+0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61,
+0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62,
+0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20,
+0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4c, 0x3b,
+0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x65, 0x6e, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b,
+0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b,
+0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b,
+0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65,
+0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64,
+0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73,
+0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61,
+0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
+0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e,
+0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c,
+0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410,
+0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x3b, 0x42f,
+0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440,
+0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441,
+0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f,
+0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b,
+0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c,
+0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8,
+0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0x3b, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5,
+0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b,
+0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa,
+0xbcd, 0xb9f, 0xbc6, 0xbae, 0xbcd, 0xbaa, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8,
+0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9c, 0x3b, 0xbaa, 0xbbf,
+0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6, 0x3b,
+0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35, 0xc30,
+0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b,
+0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc42, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a,
+0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35, 0xc02,
+0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0x3b,
+0xc0e, 0x3b, 0xc2e, 0xc46, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b,
+0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40,
+0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e,
+0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe22, 0x2e,
+0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31,
+0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22, 0xe19, 0x3b, 0xe1e, 0xe24,
+0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32,
+0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15,
+0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b, 0xe18, 0xe31, 0xe19, 0xe27,
+0xe32, 0xe04, 0xe21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf66, 0xf74, 0xf58,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62,
+0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b,
+0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72,
+0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x3b, 0x1218, 0x130b, 0x1262, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x3b,
+0x130d, 0x1295, 0x1266, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x3b, 0x1325,
+0x1245, 0x121d, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218,
+0x130b, 0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208,
+0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b,
+0x1273, 0x1215, 0x1233, 0x1235, 0x3b, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45,
+0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x3b, 0x53, 0x101, 0x6e, 0x75,
+0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb,
+0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c,
+0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b,
+0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65,
+0x6d, 0x61, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53,
+0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x4b, 0x75, 0x6c, 0x3b, 0x44,
+0x7a, 0x69, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x68, 0x61, 0x3b, 0x4e,
+0x64, 0x7a, 0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x48, 0x75, 0x6b, 0x3b, 0x4e, 0x27, 0x77, 0x3b, 0x53, 0x75, 0x6e, 0x67, 0x75,
+0x74, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x69, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79,
+0x61, 0x6e, 0x6b, 0x75, 0x6c, 0x75, 0x3b, 0x44, 0x7a, 0x69, 0x76, 0x61, 0x6d, 0x69, 0x73, 0x6f, 0x6b, 0x6f, 0x3b, 0x4d,
+0x75, 0x64, 0x79, 0x61, 0x78, 0x69, 0x68, 0x69, 0x3b, 0x4b, 0x68, 0x6f, 0x74, 0x61, 0x76, 0x75, 0x78, 0x69, 0x6b, 0x61,
+0x3b, 0x4d, 0x61, 0x77, 0x75, 0x77, 0x61, 0x6e, 0x69, 0x3b, 0x4d, 0x68, 0x61, 0x77, 0x75, 0x72, 0x69, 0x3b, 0x4e, 0x64,
+0x7a, 0x68, 0x61, 0x74, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x48, 0x75, 0x6b, 0x75,
+0x72, 0x69, 0x3b, 0x4e, 0x27, 0x77, 0x65, 0x6e, 0x64, 0x7a, 0x61, 0x6d, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x4f, 0x63, 0x61,
+0x3b, 0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a,
+0x3b, 0x54, 0x65, 0x6d, 0x3b, 0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73,
+0x3b, 0x41, 0x72, 0x61, 0x3b, 0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x3b, 0x4e, 0x69, 0x73, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e,
+0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc,
+0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b,
+0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b,
+0x4b, 0x3b, 0x41, 0x3b, 0x421, 0x456, 0x447, 0x3b, 0x41b, 0x44e, 0x442, 0x3b, 0x411, 0x435, 0x440, 0x3b, 0x41a, 0x432, 0x456, 0x3b,
+0x422, 0x440, 0x430, 0x3b, 0x427, 0x435, 0x440, 0x3b, 0x41b, 0x438, 0x43f, 0x3b, 0x421, 0x435, 0x440, 0x3b, 0x412, 0x435, 0x440, 0x3b,
+0x416, 0x43e, 0x432, 0x3b, 0x41b, 0x438, 0x441, 0x3b, 0x413, 0x440, 0x443, 0x3b, 0x421, 0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x41b,
+0x44e, 0x442, 0x438, 0x439, 0x3b, 0x411, 0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x41a, 0x432, 0x456, 0x442, 0x435, 0x43d,
+0x44c, 0x3b, 0x422, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x427, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x41b, 0x438,
+0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x421, 0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x412, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d,
+0x44c, 0x3b, 0x416, 0x43e, 0x432, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x41b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x413,
+0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c, 0x3b, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b,
+0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648,
+0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x20, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648,
+0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627,
+0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x41c, 0x443,
+0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d,
+0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416, 0x443,
+0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d,
+0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b, 0x420, 0x430,
+0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a,
+0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631,
+0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x640, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644,
+0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645,
+0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627,
+0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af,
+0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645,
+0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x75, 0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b,
+0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x3b, 0x44, 0x65, 0x6b,
+0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67,
+0x20, 0x33, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36,
+0x3b, 0x74, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74,
+0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b,
+0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x69, 0x3b,
+0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0x1b0, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x6e, 0x103, 0x6d, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x73, 0xe1, 0x75, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x62, 0x1ea3, 0x79, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x74, 0xe1, 0x6d, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x63, 0x68, 0xed, 0x6e, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x3b,
+0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x20, 0x6d, 0x1ed9, 0x74, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67,
+0x20, 0x6d, 0x1b0, 0x1edd, 0x69, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x3b, 0x4d,
+0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x41,
+0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68,
+0x61, 0x67, 0x3b, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d,
+0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68,
+0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74,
+0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64,
+0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b,
+0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
+0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72,
+0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x323, 0x3b,
+0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300,
+0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0xd2, 0x67, 0xfa,
+0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b,
+0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1e62, 0x1eb8, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0x4f, 0x1e62, 0xf9,
+0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x1e62,
+0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e62,
+0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e62,
+0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x1e62, 0xf9,
+0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e62, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x1e62, 0xf9,
+0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x41,
+0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53,
+0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x75, 0x4a, 0x61, 0x6e, 0x75,
+0x77, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x73,
+0x68, 0x69, 0x3b, 0x75, 0x2d, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x75, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x75, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x75, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x75, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b,
+0x75, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x75, 0x2d, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61,
+0x3b, 0x75, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x75, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a,
+0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x6a, 0x3b, 0x4a, 0x75, 0x6e,
+0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72,
+0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61,
+0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42,
+0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f,
+0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75,
+0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x2e, 0x48, 0x6f, 0x75, 0x6e, 0x65,
+0x79, 0x3b, 0x4d, 0x2e, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67,
+0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69, 0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65,
+0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c,
+0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72,
+0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b,
+0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66,
+0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65,
+0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x57, 0x68, 0x65, 0x3b,
+0x4d, 0x65, 0x72, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x45, 0x66, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45,
+0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x4d, 0x79,
+0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x57, 0x68, 0x65, 0x76, 0x72, 0x65, 0x6c,
+0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x72, 0x74, 0x68, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c,
+0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x45, 0x66, 0x61, 0x6e, 0x3b, 0x4d, 0x79, 0x73,
+0x20, 0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x4d, 0x79, 0x65, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x4d,
+0x79, 0x73, 0x20, 0x47, 0x77, 0x79, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72,
+0x61, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x44, 0x75, 0x3b, 0x4d, 0x79, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68,
+0x75, 0x3b, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d,
+0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d,
+0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70,
+0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45,
+0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f,
+0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73,
+0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61,
+0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f,
+0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186,
+0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62,
+0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77,
+0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62,
+0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930,
+0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942,
+0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x913, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x902,
+0x92c, 0x930, 0x3b, 0x913, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930,
+0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x41, 0x68, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x3b, 0x4f, 0x63, 0x68,
+0x3b, 0x41, 0x62, 0x65, 0x3b, 0x41, 0x67, 0x62, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4d, 0x61, 0x6e,
+0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x3b, 0x41, 0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x3b, 0x41, 0x68, 0x61,
+0x72, 0x61, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x4f, 0x66, 0x6c, 0x6f, 0x3b, 0x4f, 0x63, 0x68, 0x6f, 0x6b, 0x72, 0x69, 0x6b,
+0x72, 0x69, 0x3b, 0x41, 0x62, 0x65, 0x69, 0x62, 0x65, 0x65, 0x3b, 0x41, 0x67, 0x62, 0x65, 0x69, 0x6e, 0x61, 0x61, 0x3b,
+0x4f, 0x74, 0x75, 0x6b, 0x77, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x61, 0x6e, 0x79,
+0x61, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x47, 0x62, 0x6f, 0x3b, 0x41, 0x6e, 0x74, 0x6f, 0x6e, 0x3b, 0x41, 0x6c, 0x65, 0x6d,
+0x6c, 0x65, 0x3b, 0x41, 0x66, 0x75, 0x61, 0x62, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
+0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc,
+0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a,
+0x65, 0x6e, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61,
+0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e,
+0x3b, 0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64,
+0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e,
+0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b,
+0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b,
+0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d,
+0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65,
+0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c,
+0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b,
+0x128, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f, 0x712, 0x3b, 0x72b, 0x712, 0x71b, 0x3b, 0x710, 0x715, 0x72a,
+0x3b, 0x722, 0x71d, 0x723, 0x722, 0x3b, 0x710, 0x71d, 0x72a, 0x3b, 0x71a, 0x719, 0x71d, 0x72a, 0x722, 0x3b, 0x72c, 0x721, 0x718, 0x719,
+0x3b, 0x710, 0x712, 0x3b, 0x710, 0x71d, 0x720, 0x718, 0x720, 0x3b, 0x70f, 0x72c, 0x72b, 0x20, 0x70f, 0x710, 0x3b, 0x70f, 0x72c, 0x72b,
+0x20, 0x70f, 0x712, 0x3b, 0x70f, 0x71f, 0x722, 0x20, 0x70f, 0x710, 0x3b, 0x120d, 0x12f0, 0x1275, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x3b, 0x12ad,
+0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x3b, 0x12ad, 0x1262, 0x1245, 0x3b, 0x121d, 0x2f, 0x1275, 0x3b, 0x12b0, 0x122d, 0x3b, 0x121b, 0x122d,
+0x12eb, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d, 0x2f, 0x121d, 0x3b, 0x1270, 0x1215, 0x1233, 0x3b, 0x120d, 0x12f0,
+0x1275, 0x122a, 0x3b, 0x12ab, 0x1265, 0x12bd, 0x1265, 0x1272, 0x3b, 0x12ad, 0x1265, 0x120b, 0x3b, 0x134b, 0x1305, 0x12ba, 0x122a, 0x3b, 0x12ad, 0x1262,
+0x1245, 0x122a, 0x3b, 0x121d, 0x12aa, 0x12a4, 0x120d, 0x20, 0x1275, 0x131f, 0x1292, 0x122a, 0x3b, 0x12b0, 0x122d, 0x12a9, 0x3b, 0x121b, 0x122d, 0x12eb,
+0x121d, 0x20, 0x1275, 0x122a, 0x3b, 0x12eb, 0x12b8, 0x1292, 0x20, 0x1218, 0x1233, 0x1245, 0x1208, 0x122a, 0x3b, 0x1218, 0x1270, 0x1209, 0x3b, 0x121d,
+0x12aa, 0x12a4, 0x120d, 0x20, 0x1218, 0x123d, 0x12c8, 0x122a, 0x3b, 0x1270, 0x1215, 0x1233, 0x1235, 0x122a, 0x3b, 0x120d, 0x3b, 0x12ab, 0x3b, 0x12ad,
+0x3b, 0x134b, 0x3b, 0x12ad, 0x3b, 0x121d, 0x3b, 0x12b0, 0x3b, 0x121b, 0x3b, 0x12eb, 0x3b, 0x1218, 0x3b, 0x121d, 0x3b, 0x1270, 0x3b, 0x1320,
+0x1210, 0x1228, 0x3b, 0x12a8, 0x1270, 0x1270, 0x3b, 0x1218, 0x1308, 0x1260, 0x3b, 0x12a0, 0x1280, 0x12d8, 0x3b, 0x130d, 0x1295, 0x1263, 0x1275, 0x3b,
+0x1220, 0x1295, 0x12e8, 0x3b, 0x1210, 0x1218, 0x1208, 0x3b, 0x1290, 0x1210, 0x1230, 0x3b, 0x12a8, 0x1228, 0x1218, 0x3b, 0x1320, 0x1240, 0x1218, 0x3b,
+0x1280, 0x12f0, 0x1228, 0x3b, 0x1280, 0x1220, 0x1220, 0x3b, 0x1320, 0x3b, 0x12a8, 0x3b, 0x1218, 0x3b, 0x12a0, 0x3b, 0x130d, 0x3b, 0x1220, 0x3b,
+0x1210, 0x3b, 0x1290, 0x3b, 0x12a8, 0x3b, 0x1320, 0x3b, 0x1280, 0x3b, 0x1280, 0x3b, 0x57, 0x65, 0x79, 0x3b, 0x46, 0x61, 0x6e, 0x3b,
+0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x75, 0x79, 0x3b, 0x54, 0x73, 0x6f, 0x3b, 0x54, 0x61, 0x66, 0x3b,
+0x57, 0x61, 0x72, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x42, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x53, 0x61, 0x75, 0x3b,
+0x46, 0x61, 0x69, 0x20, 0x57, 0x65, 0x79, 0x65, 0x6e, 0x65, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x46, 0x61, 0x6e, 0x69, 0x3b,
+0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x74, 0x61, 0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x6e, 0x67, 0x72,
+0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x75, 0x79, 0x6f, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x73, 0x6f, 0x79, 0x69,
+0x3b, 0x46, 0x61, 0x69, 0x20, 0x54, 0x61, 0x66, 0x61, 0x6b, 0x61, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x57, 0x61, 0x72, 0x61,
+0x63, 0x68, 0x69, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4b, 0x75, 0x6e, 0x6f, 0x62, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20,
+0x42, 0x61, 0x6e, 0x73, 0x6f, 0x6b, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x4b, 0x6f, 0x6d, 0x3b, 0x46, 0x61, 0x69, 0x20, 0x53,
+0x61, 0x75, 0x6b, 0x3b, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x42, 0x61, 0x61, 0x3b, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x6e,
+0x61, 0x73, 0x3b, 0x41, 0x74, 0x79, 0x6f, 0x3b, 0x41, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x72, 0x3b, 0x41, 0x77,
+0x75, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x6b, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x4e, 0x61,
+0x74, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x44, 0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x42, 0x61, 0x27, 0x61,
+0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x74, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x6e, 0x61, 0x73, 0x3b, 0x50,
+0x65, 0x6e, 0x20, 0x41, 0x74, 0x79, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x72, 0x69, 0x6d,
+0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x74, 0x61, 0x72, 0x69, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x41, 0x77, 0x75,
+0x72, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x6e, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x53, 0x68,
+0x61, 0x6b, 0x75, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x62, 0x61, 0x3b, 0x50, 0x65,
+0x6e, 0x20, 0x4b, 0x75, 0x72, 0x20, 0x4e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x41, 0x331, 0x79, 0x72, 0x3b, 0x41, 0x331, 0x68,
+0x77, 0x3b, 0x41, 0x331, 0x74, 0x61, 0x3b, 0x41, 0x331, 0x6e, 0x61, 0x3b, 0x41, 0x331, 0x70, 0x66, 0x3b, 0x41, 0x331, 0x6b,
+0x69, 0x3b, 0x41, 0x331, 0x74, 0x79, 0x3b, 0x41, 0x331, 0x6e, 0x69, 0x3b, 0x41, 0x331, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61,
+0x3b, 0x53, 0x62, 0x79, 0x3b, 0x53, 0x62, 0x68, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x79, 0x72, 0x6e,
+0x69, 0x67, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e,
+0x20, 0x41, 0x331, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x61, 0x61, 0x69, 0x3b,
+0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x70, 0x66, 0x77, 0x6f, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20,
+0x41, 0x331, 0x6b, 0x69, 0x74, 0x61, 0x74, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x74, 0x79, 0x69, 0x72,
+0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x41, 0x331, 0x6e, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x48, 0x79, 0x77,
+0x61, 0x6e, 0x20, 0x41, 0x331, 0x6b, 0x75, 0x6d, 0x76, 0x69, 0x72, 0x69, 0x79, 0x69, 0x6e, 0x3b, 0x48, 0x79, 0x77, 0x61,
+0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42, 0x27,
+0x61, 0x331, 0x79, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x48, 0x79, 0x77, 0x61, 0x6e, 0x20, 0x53, 0x77, 0x61, 0x6b, 0x20, 0x42,
+0x27, 0x61, 0x331, 0x68, 0x77, 0x61, 0x3b, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
+0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53,
+0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72,
+0x3b, 0x46, 0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d,
+0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65,
+0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x61, 0x72, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x50, 0x68, 0x61, 0x3b,
+0x4c, 0x75, 0x68, 0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x53, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x69, 0x3b,
+0x4c, 0x77, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x3b, 0x4b, 0x68, 0x75, 0x3b, 0x54, 0x73, 0x68, 0x3b, 0x1e3c, 0x61, 0x72, 0x3b,
+0x4e, 0x79, 0x65, 0x3b, 0x50, 0x68, 0x61, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x75, 0x68, 0x75, 0x68, 0x69, 0x3b, 0x1e70, 0x68,
+0x61, 0x66, 0x61, 0x6d, 0x75, 0x68, 0x77, 0x65, 0x3b, 0x4c, 0x61, 0x6d, 0x62, 0x61, 0x6d, 0x61, 0x69, 0x3b, 0x53, 0x68,
+0x75, 0x6e, 0x64, 0x75, 0x6e, 0x74, 0x68, 0x75, 0x6c, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x77, 0x69, 0x3b, 0x46, 0x75, 0x6c,
+0x77, 0x61, 0x6e, 0x61, 0x3b, 0x1e70, 0x68, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x65, 0x3b, 0x4b, 0x68, 0x75, 0x62, 0x76, 0x75,
+0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x6d, 0x65, 0x64, 0x7a, 0x69, 0x3b, 0x1e3c, 0x61, 0x72, 0x61,
+0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x64, 0x61, 0x76, 0x68, 0x75, 0x73, 0x69, 0x6b, 0x75, 0x3b, 0x44, 0x7a, 0x76, 0x3b, 0x44,
+0x7a, 0x64, 0x3b, 0x54, 0x65, 0x64, 0x3b, 0x41, 0x66, 0x254, 0x3b, 0x44, 0x61, 0x6d, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x53,
+0x69, 0x61, 0x3b, 0x44, 0x65, 0x61, 0x3b, 0x41, 0x6e, 0x79, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x41, 0x64, 0x65, 0x3b, 0x44,
+0x7a, 0x6d, 0x3b, 0x44, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x54, 0x65, 0x64, 0x6f,
+0x78, 0x65, 0x3b, 0x41, 0x66, 0x254, 0x66, 0x69, 0x25b, 0x3b, 0x44, 0x61, 0x6d, 0x61, 0x3b, 0x4d, 0x61, 0x73, 0x61, 0x3b,
+0x53, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x44, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x41,
+0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x4b, 0x65, 0x6c, 0x65, 0x3b, 0x41, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70,
+0x254, 0x78, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x6d, 0x65, 0x3b, 0x44, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x44, 0x3b,
+0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50,
+0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75,
+0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f,
+0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e, 0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69,
+0x3b, 0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41,
+0x70, 0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61,
+0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61,
+0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b,
+0x65, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4a, 0x75, 0x77, 0x3b, 0x53, 0x77, 0x69, 0x3b, 0x54, 0x73, 0x61, 0x3b,
+0x4e, 0x79, 0x61, 0x3b, 0x54, 0x73, 0x77, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x69, 0x3b,
+0x41, 0x6b, 0x75, 0x3b, 0x53, 0x77, 0x61, 0x3b, 0x4d, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x5a, 0x77, 0x61, 0x74,
+0x20, 0x4a, 0x75, 0x77, 0x75, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x69, 0x79, 0x61, 0x6e, 0x67,
+0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4e, 0x79, 0x61, 0x69,
+0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x54, 0x73, 0x77, 0x6f, 0x6e, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x74, 0x61,
+0x61, 0x68, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x6e, 0x61, 0x74, 0x61, 0x74, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20,
+0x41, 0x72, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x41, 0x6b, 0x75, 0x62, 0x75, 0x6e, 0x79, 0x75,
+0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x4d, 0x61,
+0x6e, 0x67, 0x6a, 0x75, 0x77, 0x61, 0x6e, 0x67, 0x3b, 0x5a, 0x77, 0x61, 0x74, 0x20, 0x53, 0x77, 0x61, 0x67, 0x2d, 0x4d,
+0x61, 0x2d, 0x53, 0x75, 0x79, 0x61, 0x6e, 0x67, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x6c,
+0x3b, 0x45, 0x70, 0x75, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61,
+0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e,
+0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x6c, 0x75, 0x77, 0x61, 0x6c, 0x65, 0x3b, 0x4d, 0x61, 0x6c,
+0x69, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x75, 0x6c, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
+0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x69, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x75, 0x74, 0x65,
+0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b,
+0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
+0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b,
+0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72,
+0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69,
+0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41,
+0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75,
+0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b,
+0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b,
+0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69,
+0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75,
+0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f,
+0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b,
+0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x3b,
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x72, 0x68, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x55, 0x73, 0x69, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x46, 0x65,
+0x62, 0x65, 0x72, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x75, 0x4d, 0x61, 0x74, 0x6a, 0x68, 0x69, 0x3b, 0x75, 0x2d, 0x41, 0x70,
+0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79,
+0x69, 0x3b, 0x41, 0x72, 0x68, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x55, 0x73, 0x69, 0x6e, 0x79, 0x69, 0x6b, 0x68, 0x61, 0x62, 0x61, 0x3b,
+0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b,
+0x41, 0x70, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b,
+0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61,
+0x77, 0x61, 0x72, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x65, 0x72, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x161, 0x68,
+0x65, 0x3b, 0x41, 0x70, 0x6f, 0x72, 0x65, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a,
+0x75, 0x6c, 0x61, 0x65, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x73, 0x65, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x65,
+0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x6f, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x65, 0x72, 0x65,
+0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x3b, 0x67,
+0x75, 0x6f, 0x76, 0x76, 0x61, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x3b, 0x6d,
+0x69, 0x65, 0x73, 0x73, 0x65, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65,
+0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74,
+0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a,
+0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
+0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x6d, 0xe1,
+0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61, 0x73,
+0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
+0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e,
+0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62,
+0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b,
+0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b, 0x47, 0x3b,
+0x53, 0x3b, 0x4a, 0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63,
+0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f,
+0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75,
+0x6f, 0x76, 0x3b, 0x4b, 0x69, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x3b, 0x54, 0x72, 0x69, 0x3b, 0x53, 0x70, 0x69, 0x3b, 0x52,
+0x69, 0x69, 0x3b, 0x4d, 0x74, 0x69, 0x3b, 0x45, 0x6d, 0x69, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x6e, 0x69, 0x3b, 0x4d,
+0x78, 0x69, 0x3b, 0x4d, 0x78, 0x6b, 0x3b, 0x4d, 0x78, 0x64, 0x3b, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64,
+0x61, 0x73, 0x3b, 0x44, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x54, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73,
+0x3b, 0x53, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73,
+0x3b, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x45, 0x6d, 0x70, 0x69, 0x74, 0x75, 0x20,
+0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x73, 0x70, 0x61, 0x74, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x6e, 0x67,
+0x61, 0x72, 0x69, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b,
+0x4d, 0x61, 0x78, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4d, 0x61,
+0x78, 0x61, 0x6c, 0x20, 0x64, 0x68, 0x61, 0x20, 0x69, 0x64, 0x61, 0x73, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x53,
+0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x43, 0x61, 0x6e,
+0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
+0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62,
+0x3b, 0x44, 0x69, 0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61,
+0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x49, 0x6d, 0x62,
+0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72,
+0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77,
+0x3b, 0x49, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72,
+0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72,
+0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b,
+0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61,
+0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e,
+0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61,
+0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61,
+0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72,
+0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65,
+0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
+0x61, 0x20, 0x69, 0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b,
+0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62,
+0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75,
+0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x3b, 0x73, 0x69,
+0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65, 0x257,
+0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73,
+0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d,
+0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x3b, 0x73, 0x3b, 0x63, 0x3b, 0x6d,
+0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x3b, 0x4a,
+0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x57,
+0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57,
+0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67,
+0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
+0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65,
+0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77,
+0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b,
+0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x3b, 0x4f, 0x62, 0x6f, 0x3b,
+0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b,
+0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62, 0x3b,
+0x54, 0x6f, 0x77, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61,
+0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6b,
+0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
+0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c, 0x61,
+0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20,
+0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c,
+0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70,
+0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4f, 0x3b, 0x57,
+0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54,
+0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75,
+0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76,
+0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61,
+0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
+0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x5a, 0x69, 0x62,
+0x3b, 0x4e, 0x68, 0x6c, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b, 0x4e, 0x68, 0x6c,
+0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65,
+0x3b, 0x4d, 0x70, 0x61, 0x3b, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e, 0x68, 0x6c, 0x6f,
+0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x62, 0x61,
+0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67,
+0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77, 0x61, 0x62, 0x61,
+0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x6d, 0x66, 0x75,
+0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x5a, 0x3b, 0x4e,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b, 0x4d,
+0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61, 0x6e,
+0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72,
+0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73,
+0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69,
+0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x69, 0x6e,
+0x6e, 0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75,
+0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75,
+0x77, 0x3b, 0x64, 0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d,
+0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79,
+0x75, 0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e, 0x62,
+0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64, 0x75,
+0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79,
+0x3b, 0x263, 0x3b, 0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e,
+0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b, 0x2d56,
+0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x3b, 0x2d49,
+0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x2d62, 0x2d55, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54,
+0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53,
+0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x2d31,
+0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b,
+0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e, 0x3b, 0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b, 0x3b, 0x2d3d, 0x3b,
+0x2d4f, 0x3b, 0x2d37, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b,
+0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x3b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72,
+0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72,
+0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194,
+0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x4e, 0x75,
+0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x59, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b,
+0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b, 0x4b, 0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b,
+0x4b, 0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b,
+0x4b, 0x4e, 0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x3b, 0x4f, 0x6b, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b,
+0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61,
+0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61,
+0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61,
+0x6d, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6e, 0x61, 0x61, 0x6e, 0x61,
+0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d,
+0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65,
+0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b,
+0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b,
+0x4b, 0x6d, 0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
+0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
+0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
+0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
+0x67, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
+0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61,
+0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
+0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c,
+0x69, 0x3b, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b,
+0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x69,
+0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62,
+0x3b, 0x6e, 0x61, 0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b,
+0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x3b,
+0x7a, 0x61, 0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72, 0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72,
+0x69, 0x73, 0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e,
+0x3b, 0x7a, 0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72,
+0x75, 0x3b, 0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72,
+0x75, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b,
+0x4b, 0x61, 0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x47, 0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b,
+0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b,
+0x49, 0x67, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x129, 0x72, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b,
+0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e,
+0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d,
+0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b, 0x61, 0x129, 0x72, 0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47,
+0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6,
+0x3b, 0x13a0, 0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b, 0x13da,
+0x13b5, 0x3b, 0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a4, 0x13cd, 0x3b, 0x13a4, 0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5,
+0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd, 0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b,
+0x13ab, 0x13f0, 0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd, 0x13d7, 0x3b, 0x13da, 0x13c2, 0x13c5, 0x13d7, 0x3b, 0x13c5,
+0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a4, 0x13cd, 0x13a9, 0x13f1, 0x3b, 0x13a4, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5,
+0x3b, 0x13ab, 0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a4, 0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x3b,
+0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b,
+0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
+0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f,
+0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x61,
+0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d, 0x3b, 0x7a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b,
+0x7a, 0x3b, 0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x4e, 0x74,
+0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d,
+0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e,
+0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
+0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e,
+0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
+0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
+0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20,
+0x6e, 0x61, 0x20, 0x55, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f,
+0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x3b, 0x46, 0xfa, 0x6e, 0x67,
+0x61, 0x74, 0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa,
+0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61, 0x3b, 0x49, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61,
+0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289,
+0x3b, 0x49, 0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x53, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x4b,
+0x289, 0x66, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289, 0x6e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b,
+0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e,
+0x79, 0x61, 0x6d, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b,
+0x289, 0x6d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289, 0x76, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73,
+0x61, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x69, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f,
+0x3b, 0x4b, 0x289, 0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x46, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65,
+0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79,
+0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69,
+0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x69,
+0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62,
+0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a,
+0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b,
+0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69,
+0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x76, 0x65, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61,
+0x72, 0x73, 0x75, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75,
+0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6e, 0x62,
+0x72, 0x75, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44,
+0x69, 0x7a, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45, 0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b,
+0x128, 0x50, 0x55, 0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b, 0x4e, 0x4a, 0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b,
+0x53, 0x50, 0x54, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b, 0x44, 0x45, 0x43, 0x3b, 0x4a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b,
+0x128, 0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72,
+0x61, 0x129, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
+0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
+0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x3b, 0x4b, 0x69, 0x70, 0x3b, 0x49, 0x77,
+0x61, 0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x57, 0x61, 0x6b, 0x3b, 0x52, 0x6f, 0x70, 0x3b, 0x4b, 0x6f, 0x67, 0x3b, 0x42, 0x75,
+0x72, 0x3b, 0x45, 0x70, 0x65, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x41, 0x65, 0x6e, 0x3b, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c,
+0x3b, 0x4e, 0x67, 0x27, 0x61, 0x74, 0x79, 0x61, 0x74, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x74, 0x61, 0x6d, 0x6f, 0x3b, 0x49,
+0x77, 0x61, 0x74, 0x20, 0x6b, 0x75, 0x74, 0x3b, 0x4e, 0x67, 0x27, 0x65, 0x69, 0x79, 0x65, 0x74, 0x3b, 0x57, 0x61, 0x6b,
+0x69, 0x3b, 0x52, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x6b, 0x6f, 0x67, 0x61, 0x67, 0x61, 0x3b, 0x42,
+0x75, 0x72, 0x65, 0x74, 0x3b, 0x45, 0x70, 0x65, 0x73, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x6e, 0x64, 0x65, 0x20,
+0x6e, 0x65, 0x74, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20,
+0x61, 0x65, 0x6e, 0x67, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x4e, 0x3b, 0x57, 0x3b, 0x52, 0x3b, 0x4b,
+0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68,
+0x61, 0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75, 0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3,
+0x48, 0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b,
+0x47, 0x61, 0x6d, 0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68, 0x6f, 0x65, 0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41,
+0x6f, 0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b,
+0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2, 0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65,
+0x62, 0x3b, 0x1c0, 0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b, 0x48, 0xf4, 0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1,
+0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0xe4, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b,
+0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0xe4, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f,
+0x75, 0x67, 0x2e, 0x3b, 0x53, 0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44,
+0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x3b, 0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b,
+0x4d, 0xe4, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b, 0x4d, 0xe4, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e,
+0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f, 0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65,
+0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b, 0x186,
+0x25b, 0x6e, 0x3b, 0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52, 0x6f, 0x6b, 0x3b, 0x53, 0xe1, 0x73, 0x3b, 0x42,
+0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed, 0x73, 0x3b, 0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74, 0x289,
+0x301, 0x3b, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41, 0x72, 0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268,
+0x301, 0x254, 0x268, 0x14b, 0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f, 0x79, 0xed, 0xf3, 0x72, 0xed, 0xea, 0x20, 0x69,
+0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c, 0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20,
+0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa, 0x254, 0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72,
+0x75, 0x73, 0xe1, 0x73, 0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268, 0x301, 0x62, 0x254, 0x301, 0x72, 0xe1, 0x72, 0x25b,
+0x3b, 0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed, 0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68,
+0x289, 0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65,
+0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4d, 0x75, 0x6b, 0x3b, 0x4b, 0x77,
+0x61, 0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50, 0x65,
+0x64, 0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x50, 0x6f, 0x6f, 0x3b, 0x4f, 0x72,
+0x61, 0x72, 0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x67, 0x27, 0x3b, 0x4f, 0x64, 0x75,
+0x6e, 0x67, 0x27, 0x65, 0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f, 0x6d, 0x6f, 0x64, 0x6f, 0x6b, 0x27,
+0x6b, 0x69, 0x6e, 0x67, 0x27, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b, 0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c,
+0x3b, 0x4f, 0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61, 0x3b, 0x4f, 0x74, 0x69, 0x62, 0x61, 0x72, 0x3b,
+0x4f, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b,
+0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x50, 0x3b, 0x17d, 0x61, 0x6e, 0x3b,
+0x46, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x69, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d,
+0x75, 0x79, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65,
+0x65, 0x3b, 0x17d, 0x61, 0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77, 0x69, 0x72, 0x69, 0x79, 0x65, 0x3b,
+0x4d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65,
+0x14b, 0x3b, 0x17d, 0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b,
+0x44, 0x65, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x17d, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
+0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44, 0x41, 0x43, 0x3b, 0x44, 0x41,
+0x52, 0x3b, 0x44, 0x41, 0x44, 0x3b, 0x44, 0x41, 0x4e, 0x3b, 0x44, 0x41, 0x48, 0x3b, 0x44, 0x41, 0x55, 0x3b, 0x44, 0x41,
+0x4f, 0x3b, 0x44, 0x41, 0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41, 0x50, 0x3b, 0x44, 0x47, 0x49, 0x3b, 0x44, 0x41,
+0x47, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65,
+0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41,
+0x64, 0x65, 0x6b, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67, 0x27, 0x77, 0x65, 0x6e, 0x3b,
+0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61,
+0x72, 0x20, 0x41, 0x75, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62,
+0x69, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x6f, 0x3b,
+0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4f, 0x63, 0x68, 0x69, 0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d,
+0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61,
+0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x20, 0x67,
+0x69, 0x20, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x43, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55, 0x3b,
+0x42, 0x3b, 0x42, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b,
+0x194, 0x75, 0x63, 0x3b, 0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6a, 0x3b,
+0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61,
+0x72, 0x73, 0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75,
+0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69,
+0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a,
+0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b,
+0x194, 0x3b, 0x43, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x65,
+0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b,
+0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74,
+0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b
+};
+
 static const ushort days_data[] = {
 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b,
 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61,
@@ -3455,866 +3556,888 @@ static const ushort days_data[] = {
 0x61, 0x7a, 0x61, 0x72, 0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259,
 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc, 0x6d,
 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b,
-0x69, 0x67, 0x3b, 0x61, 0x6c, 0x3b, 0x61, 0x73, 0x3b, 0x61, 0x7a, 0x3b, 0x6f, 0x67, 0x3b, 0x6f, 0x72, 0x3b, 0x6c, 0x72,
-0x3b, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c, 0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b,
-0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61,
-0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c,
-0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd,
-0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd,
-0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b,
-0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b7,
-0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf,
-0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b,
-0x9b6, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b,
-0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42,
-0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74,
-0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a,
-0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d,
-0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435,
-0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438,
-0x43a, 0x3b, 0x441, 0x440, 0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435,
-0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447,
-0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x1014, 0x103d, 0x1031, 0x3b, 0x101c, 0x102c, 0x3b, 0x1002, 0x102b, 0x3b, 0x101f, 0x1030, 0x1038, 0x3b, 0x1010,
-0x1031, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x3b, 0x1014, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b,
-0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002, 0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013,
-0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031, 0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b,
-0x1005, 0x1014, 0x1031, 0x3b, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000, 0x3b, 0x101e, 0x3b, 0x1005, 0x3b, 0x43d, 0x434,
-0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d,
-0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e,
-0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447, 0x430, 0x446, 0x432, 0x435, 0x440, 0x3b,
-0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x430,
-0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x17a2, 0x17b6, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x17bb, 0x3b, 0x1796,
-0x17d2, 0x179a, 0x3b, 0x179f, 0x17bb, 0x3b, 0x179f, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b,
-0x200b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6,
-0x179a, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2,
-0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x179f,
-0x17c5, 0x179a, 0x17cd, 0x3b, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b, 0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64,
-0x76, 0x3b, 0x64, 0x73, 0x3b, 0x44, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b, 0x44, 0x69, 0x6c, 0x6c, 0x75, 0x6e,
-0x73, 0x3b, 0x44, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x44, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x44,
-0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x44, 0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73,
-0x61, 0x62, 0x74, 0x65, 0x3b, 0x67, 0x3b, 0x6c, 0x3b, 0x74, 0x3b, 0x63, 0x3b, 0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x3b, 0x64,
-0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64,
-0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x3b, 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c,
-0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73,
-0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69,
-0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0x47, 0x3b, 0x6c, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53,
-0x3b, 0x5468, 0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468,
-0x516d, 0x3b, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f,
-0x56db, 0x3b, 0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x3b, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b,
-0x4e94, 0x3b, 0x516d, 0x3b, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031,
-0x4e94, 0x3b, 0x9031, 0x516d, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69,
-0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a,
-0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b,
-0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65,
-0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d,
-0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b,
-0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x11b, 0x6c, 0xed,
-0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74, 0x65,
-0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0xda,
-0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72,
-0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf8, 0x72, 0x3b, 0x73, 0xf8, 0x6e,
-0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f,
-0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67,
-0x3b, 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b,
-0x4c, 0x3b, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b,
-0x7a, 0x61, 0x3b, 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69,
-0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65,
-0x72, 0x64, 0x61, 0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61,
-0x67, 0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x5a, 0x3b, 0x50, 0x3b, 0x45, 0x3b,
-0x54, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x4c, 0x3b, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65,
-0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b,
-0x6f, 0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x72,
-0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x73, 0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e,
-0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c, 0x65, 0x79,
-0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64, 0x61, 0x67, 0x75,
-0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72,
-0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64, 0x61, 0x67,
-0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54,
-0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65,
-0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x3b,
-0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b, 0x65,
-0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x65,
-0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x53, 0x3b, 0x4d,
-0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69,
-0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74,
-0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x6e, 0x61, 0x3b, 0x74,
-0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61,
-0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e,
-0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x64,
-0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x6a, 0x65, 0x75,
-0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69, 0x3b, 0x44,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0xe9, 0x72, 0x3b, 0x58, 0x6f, 0x76, 0x3b, 0x56, 0x65, 0x6e, 0x3b, 0x53, 0xe1, 0x62,
-0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73,
-0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e, 0x72,
-0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58, 0x3b,
-0x56, 0x3b, 0x53, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b,
-0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0,
-0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee,
-0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0,
-0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b,
-0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b,
-0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e,
-0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63,
-0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67,
-0x3b, 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46,
-0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44,
-0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6f, 0x6e, 0x3b, 0x44,
-0x69, 0x65, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x39a,
-0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3b9, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3b5, 0x3bc, 0x3b, 0x3a0,
-0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3b1, 0x3b2, 0x3b, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4, 0x3ad,
-0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc,
-0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4,
-0x3bf, 0x3b, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3, 0x3b, 0x73, 0x61, 0x62, 0x3b,
-0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b,
-0x61, 0x72, 0x66, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67,
-0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b,
-0x70, 0x69, 0x6e, 0x67, 0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73, 0x61,
-0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e,
-0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65,
-0x71, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0xab0, 0xab5, 0xabf, 0x3b,
-0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1,
-0xa95, 0xacd, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0x3b, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe,
-0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0,
-0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0,
-0x3b, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x3b,
-0x4c, 0x68, 0x3b, 0x4c, 0x69, 0x3b, 0x54, 0x61, 0x3b, 0x4c, 0x72, 0x3b, 0x41, 0x6c, 0x3b, 0x4a, 0x75, 0x3b, 0x41, 0x73,
-0x3b, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61,
-0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75,
-0x6d, 0x6d, 0x61, 0x27, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x4c,
-0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x644, 0x64e, 0x62d, 0x3b, 0x644, 0x650, 0x62a, 0x3b, 0x62a, 0x64e, 0x644, 0x3b, 0x644,
-0x64e, 0x631, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x3b, 0x62c, 0x64f, 0x645, 0x3b, 0x623, 0x64e, 0x633, 0x64e, 0x3b, 0x644, 0x64e,
-0x62d, 0x64e, 0x62f, 0x650, 0x3b, 0x644, 0x650, 0x62a, 0x650, 0x646, 0x650, 0x646, 0x652, 0x3b, 0x62a, 0x64e, 0x644, 0x64e, 0x62a, 0x64e,
-0x3b, 0x644, 0x64e, 0x631, 0x64e, 0x628, 0x64e, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x64e, 0x645, 0x650, 0x633, 0x652, 0x3b, 0x62c,
-0x64f, 0x645, 0x64e, 0x639, 0x64e, 0x3b, 0x623, 0x64e, 0x633, 0x64e, 0x628, 0x64e, 0x631, 0x652, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0,
-0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
-0x5d3, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea,
-0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5,
-0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0x5d0, 0x3b, 0x5d1, 0x3b, 0x5d2, 0x3b, 0x5d3, 0x3b, 0x5d4, 0x3b, 0x5d5, 0x3b, 0x5e9, 0x3b,
-0x930, 0x935, 0x93f, 0x2e, 0x3b, 0x938, 0x94b, 0x92e, 0x2e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x2e, 0x3b, 0x92c, 0x941, 0x927, 0x2e,
-0x3b, 0x92c, 0x943, 0x939, 0x2e, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x2e, 0x3b, 0x936, 0x928, 0x93f, 0x2e, 0x3b, 0x930, 0x935,
-0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b,
-0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x936,
-0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x930, 0x3b, 0x938, 0x94b, 0x3b,
-0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b,
-0x53, 0x7a, 0x65, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x3b, 0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61,
-0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73, 0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b,
-0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f,
-0x6d, 0x62, 0x61, 0x74, 0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53,
-0x7a, 0x3b, 0x73, 0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0xfe, 0x72, 0x69, 0x3b, 0x6d, 0x69, 0xf0, 0x3b, 0x66, 0x69,
-0x6d, 0x3b, 0x66, 0xf6, 0x73, 0x3b, 0x6c, 0x61, 0x75, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72,
-0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67,
-0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d, 0x6d,
-0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c,
-0x61, 0x75, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0xfe, 0x3b, 0x6d, 0x3b, 0x66,
-0x3b, 0x66, 0x3b, 0x6c, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4d,
-0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a,
-0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b,
-0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
-0x4a, 0x3b, 0x53, 0x3b, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b,
-0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x68,
-0x3b, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61,
-0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61, 0x64, 0x61,
-0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f,
-0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x3b, 0x44, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x44, 0x6f,
-0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x64,
-0xec, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x47, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b,
-0x56, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75,
-0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65,
-0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x73,
-0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x3b,
-0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b,
-0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x3b, 0xcb0, 0x2e, 0x3b, 0xcb8, 0xccb, 0x2e, 0x3b, 0xcae, 0xc82, 0x2e, 0x3b, 0xcac,
-0xcc1, 0x2e, 0x3b, 0xc97, 0xcc1, 0x2e, 0x3b, 0xcb6, 0xcc1, 0x2e, 0x3b, 0xcb6, 0xca8, 0xcbf, 0x2e, 0x3b, 0xcb0, 0xcb5, 0xcbf, 0xcb5,
-0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1,
-0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe,
-0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb0, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b, 0xcac, 0xcc1, 0x3b,
-0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x3b, 0x436, 0x441, 0x2e, 0x3b, 0x434, 0x441, 0x2e, 0x3b, 0x441, 0x441, 0x2e, 0x3b,
-0x441, 0x440, 0x2e, 0x3b, 0x431, 0x441, 0x2e, 0x3b, 0x436, 0x43c, 0x2e, 0x3b, 0x441, 0x4bb, 0x2e, 0x3b, 0x436, 0x435, 0x43a, 0x441,
-0x435, 0x43d, 0x456, 0x3b, 0x434, 0x443, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431,
-0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x436,
-0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b,
-0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b,
-0x67, 0x6e, 0x64, 0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b, 0x75, 0x77,
-0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b,
-0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e,
-0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67,
-0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x3b, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08,
-0x3b, 0xd1a0, 0x3b, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9,
-0xc694, 0xc77c, 0x3b, 0xae08, 0xc694, 0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0x3b, 0x6cc, 0x6d5, 0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b,
-0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627,
-0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x34,
-0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x79, 0x15f, 0x3b, 0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70,
-0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x3b, 0x79, 0x65, 0x6b, 0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b,
-0x15f, 0xea, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e,
-0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x79, 0x3b, 0x64, 0x3b, 0x73, 0x3b, 0xe7, 0x3b, 0x70, 0x3b, 0xee, 0x3b, 0x15f, 0x3b,
-0xead, 0xeb2, 0x2e, 0x3b, 0xe88, 0x2e, 0x3b, 0xead, 0x2e, 0x3b, 0xe9e, 0x2e, 0x3b, 0xe9e, 0xeab, 0x2e, 0x3b, 0xeaa, 0xe81, 0x2e,
-0x3b, 0xeaa, 0x2e, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99,
-0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2,
-0x3b, 0x53, 0x76, 0x3b, 0x50, 0x72, 0x3b, 0x4f, 0x74, 0x3b, 0x54, 0x72, 0x3b, 0x43, 0x65, 0x3b, 0x50, 0x6b, 0x3b, 0x53,
-0x65, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e,
-0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61,
-0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69,
-0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b,
-0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x65, 0x79, 0x65, 0x3b, 0x6d, 0x31, 0x3b, 0x6d, 0x32, 0x3b, 0x6d, 0x33,
-0x3b, 0x6d, 0x34, 0x3b, 0x6d, 0x35, 0x3b, 0x6d, 0x70, 0x73, 0x3b, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x6d, 0x6f,
-0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x6f, 0x73, 0xf3, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c,
-0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79,
-0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d,
-0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e,
-0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x3b, 0x53, 0x6b, 0x3b, 0x50, 0x69, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b,
-0x3b, 0x50, 0x65, 0x3b, 0x160, 0x3b, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69,
-0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69,
-0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x76, 0x69,
-0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e,
-0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x41,
-0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x3b, 0x53, 0x6b, 0x3b, 0x50, 0x72, 0x3b, 0x41, 0x6e, 0x3b, 0x54, 0x72,
-0x3b, 0x4b, 0x74, 0x3b, 0x50, 0x6e, 0x3b, 0x160, 0x74, 0x3b, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b,
-0x432, 0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441,
-0x430, 0x431, 0x2e, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438,
-0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432,
-0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x41, 0x6c,
-0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c,
-0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79, 0x3b,
-0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41,
-0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a, 0x6f,
-0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x41, 0x3b,
-0x41, 0x3b, 0x5a, 0x3b, 0x41, 0x3b, 0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61,
-0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x49,
-0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x68, 0x61,
-0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0xd1e, 0xd3e, 0xd2f,
-0xd30, 0xd4d, 0x200d, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd4d, 0x200d, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c,
-0xd41, 0xd27, 0xd28, 0xd4d, 0x200d, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b,
-0xd36, 0xd28, 0xd3f, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e,
-0xd34, 0xd4d, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34,
-0xd4d, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f,
-0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd1e, 0xd3e, 0x3b, 0xd24, 0xd3f, 0x3b,
-0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0x126, 0x61, 0x64, 0x3b,
-0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b,
-0x53, 0x69, 0x62, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e,
-0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b,
-0x49, 0x6c, 0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49,
-0x73, 0x2d, 0x53, 0x69, 0x62, 0x74, 0x3b, 0x126, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x126, 0x3b, 0x120, 0x3b, 0x53,
-0x3b, 0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x6e, 0x65, 0x3b, 0x54, 0x16b, 0x72, 0x65, 0x69, 0x3b, 0x57,
-0x65, 0x6e, 0x65, 0x72, 0x65, 0x69, 0x3b, 0x54, 0x101, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x61, 0x72, 0x61, 0x69, 0x72, 0x65,
-0x3b, 0x48, 0x101, 0x74, 0x61, 0x72, 0x65, 0x69, 0x3b, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917,
-0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f,
-0x3b, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x935,
-0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941,
-0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b,
-0x41c, 0x44f, 0x3b, 0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x3b, 0x43d, 0x44f, 0x43c, 0x3b, 0x434,
-0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f,
-0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x3b, 0x906, 0x907,
-0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x940,
-0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b,
-0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930,
-0x3b, 0x92c, 0x93f, 0x939, 0x940, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x928,
-0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x906,
-0x907, 0x924, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x935, 0x93e,
-0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x940, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915,
-0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0x61, 0x2e,
-0x3b, 0x74, 0x69, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0xf8, 0x2e,
-0x3b, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e,
-0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8, 0x72, 0x2e, 0x3b, 0x44, 0x69, 0x6d, 0x65,
-0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x69,
-0x6d, 0xe8, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0xf2, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0xe8, 0x6e, 0x64,
-0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e,
-0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d,
-0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0x3b, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b,
-0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41,
-0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b,
-0xb30, 0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x3b, 0x6cc, 0x6a9,
-0x634, 0x646, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628, 0x647, 0x3b,
-0x686, 0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639,
-0x647, 0x3b, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634,
-0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e,
-0x3b, 0x63, 0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a,
-0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74,
-0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b, 0x3b,
-0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b,
-0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x73, 0x65, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b,
-0x71, 0x75, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x3b, 0x73, 0x65, 0x78, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x44, 0x6f, 0x6d, 0x69,
-0x6e, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x54, 0x65,
-0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x51, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69,
-0x72, 0x61, 0x3b, 0x51, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x78, 0x74,
-0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x54,
-0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67,
-0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69,
-0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e,
-0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61,
-0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0xa10, 0xa24, 0x2e, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x2e, 0x3b, 0xa2e, 0xa70, 0xa17,
-0xa32, 0x2e, 0x3b, 0xa2c, 0xa41, 0xa27, 0x2e, 0x3b, 0xa35, 0xa40, 0xa30, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa15, 0xa30, 0x2e, 0x3b,
-0xa38, 0xa3c, 0xa28, 0xa40, 0x2e, 0x3b, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e,
-0xa70, 0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30,
-0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa40, 0xa1a, 0xa30, 0xa35, 0xa3e, 0xa30,
-0x3b, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71,
-0x3b, 0xa38, 0xa3c, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628,
-0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1,
-0x3b, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65,
-0x3b, 0x73, 0x6f, 0x3b, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x73,
-0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67, 0x69, 0x65,
-0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x6f, 0x6e, 0x64, 0x61, 0x3b,
-0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x44, 0x75, 0x3b, 0x4c, 0x75, 0x3b,
-0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x6f, 0x3b, 0x56, 0x69, 0x3b, 0x53, 0xe2, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e,
-0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63,
-0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62, 0x103,
-0x74, 0x103, 0x3b, 0x412, 0x441, 0x3b, 0x41f, 0x43d, 0x3b, 0x412, 0x442, 0x3b, 0x421, 0x440, 0x3b, 0x427, 0x442, 0x3b, 0x41f, 0x442,
-0x3b, 0x421, 0x431, 0x3b, 0x412, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x41f, 0x43e, 0x43d, 0x435,
-0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x412, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x421, 0x440, 0x435, 0x434,
-0x430, 0x3b, 0x427, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x41f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x421, 0x443,
-0x431, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x412, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b,
-0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c,
+0x431, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447,
+0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9,
+0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9,
+0x3b, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x69, 0x67, 0x3b, 0x61, 0x6c, 0x3b, 0x61, 0x73, 0x3b, 0x61, 0x7a, 0x3b, 0x6f,
+0x67, 0x3b, 0x6f, 0x72, 0x3b, 0x6c, 0x72, 0x3b, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65,
+0x6c, 0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74,
+0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74,
+0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x3b,
+0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa,
+0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b,
+0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac,
+0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b7, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0,
+0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1,
+0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b, 0x9b6, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7,
+0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49,
+0xf72, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42,
+0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60,
+0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b,
+0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58,
+0xf0b, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b,
+0x441, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a,
+0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a,
+0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b,
+0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x1014, 0x103d, 0x1031, 0x3b, 0x101c, 0x102c, 0x3b, 0x1002,
+0x102b, 0x3b, 0x101f, 0x1030, 0x1038, 0x3b, 0x1010, 0x1031, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x3b, 0x1014, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004,
+0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002,
+0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031, 0x1038, 0x3b,
+0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x3b, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000,
+0x3b, 0x101e, 0x3b, 0x1005, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b,
+0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437,
+0x435, 0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b,
+0x447, 0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442,
+0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x17a2, 0x17b6, 0x3b, 0x1785,
+0x3b, 0x17a2, 0x3b, 0x1796, 0x17bb, 0x3b, 0x1796, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17bb, 0x3b, 0x179f, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x17a2,
+0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x200b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x1790, 0x17d2,
+0x1784, 0x17c3, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1790, 0x17d2, 0x1784,
+0x17c3, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x179f, 0x17bb, 0x1780, 0x17d2,
+0x179a, 0x3b, 0x1790, 0x17d2, 0x1784, 0x17c3, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x3b, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b,
+0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64, 0x76, 0x3b, 0x64, 0x73, 0x3b, 0x44, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65,
+0x3b, 0x44, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x44, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x44, 0x69, 0x6d,
+0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x44, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x44, 0x69, 0x76, 0x65, 0x6e, 0x64, 0x72,
+0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0x67, 0x3b, 0x6c, 0x3b, 0x74, 0x3b, 0x63, 0x3b,
+0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x3b, 0x64, 0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63,
+0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x3b, 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e,
+0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x64,
+0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0x65, 0x6e,
+0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0x47, 0x3b, 0x6c, 0x3b, 0x54, 0x3b,
+0x43, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x5468, 0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b,
+0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x3b, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c,
+0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b, 0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x3b, 0x65e5, 0x3b, 0x4e00,
+0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b, 0x516d, 0x3b, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b,
+0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b, 0x9031, 0x516d, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b,
+0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b,
+0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b,
+0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76,
+0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b,
+0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74,
+0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b,
+0x70, 0x6f, 0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61,
+0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74,
+0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x73, 0xf8, 0x6e, 0x3b,
+0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b,
+0x6c, 0xf8, 0x72, 0x3b, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69,
+0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67,
+0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54,
+0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f,
+0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b, 0x7a, 0x61, 0x3b, 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61,
+0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61,
+0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b,
+0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56,
+0x3b, 0x5a, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc13, 0xd801,
+0xdc2d, 0xd801, 0xdc46, 0x3b, 0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0x3b, 0xd801, 0xdc1b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0x3b, 0xd801, 0xdc19,
+0xd801, 0xdc49, 0xd801, 0xdc34, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc30, 0xd801, 0xdc3b, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c,
+0xd801, 0xdc29, 0x3b, 0xd801, 0xdc23, 0xd801, 0xdc32, 0xd801, 0xdc4c, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc13, 0xd801, 0xdc2d, 0xd801, 0xdc46,
+0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc0e, 0xd801, 0xdc2f, 0xd801, 0xdc4c, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc1b,
+0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801, 0xdc46, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc19, 0xd801, 0xdc49, 0xd801, 0xdc34, 0xd801, 0xdc3c, 0xd801,
+0xdc29, 0x3b, 0xd801, 0xdc1d, 0xd801, 0xdc30, 0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc49, 0xd801, 0xdc3c, 0xd801, 0xdc29, 0x3b, 0xd801, 0xdc1d, 0x3b,
+0xd801, 0xdc23, 0x3b, 0xd801, 0xdc13, 0x3b, 0xd801, 0xdc0e, 0x3b, 0xd801, 0xdc1b, 0x3b, 0xd801, 0xdc19, 0x3b, 0xd801, 0xdc1d, 0x3b, 0x50, 0x3b,
+0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x4c, 0x3b, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76,
+0x3b, 0x65, 0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76,
+0x3b, 0x6b, 0x6f, 0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76,
+0x3b, 0x72, 0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x73, 0x75, 0x6e, 0x3b, 0x6d,
+0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c,
+0x65, 0x79, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64, 0x61,
+0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67,
+0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64,
+0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x53, 0x3b, 0x4d,
+0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b,
+0x6b, 0x65, 0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61,
+0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b,
+0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b,
+0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x53,
+0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74,
+0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69,
+0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x6e, 0x61,
+0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69,
+0x6e, 0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c,
+0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76,
+0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75,
+0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x6a,
+0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69,
+0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x44, 0x6f, 0x6d, 0x3b, 0x4c,
+0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0xe9, 0x72, 0x3b, 0x58, 0x6f, 0x76, 0x3b, 0x56, 0x65, 0x6e, 0x3b, 0x53,
+0xe1, 0x62, 0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x65, 0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x65,
+0x6e, 0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b,
+0x58, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd, 0x10d7,
+0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b,
+0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd,
+0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de,
+0x10d0, 0x10e0, 0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10d9, 0x3b, 0x10dd, 0x3b,
+0x10e1, 0x3b, 0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d,
+0x69, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d,
+0x6f, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77,
+0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74,
+0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44,
+0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e,
+0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6f, 0x6e,
+0x3b, 0x44, 0x69, 0x65, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61, 0x6d,
+0x3b, 0x39a, 0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3b9, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3b5, 0x3bc,
+0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3b1, 0x3b2, 0x3b, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5,
+0x3c4, 0x3ad, 0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0,
+0x3ad, 0x3bc, 0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2,
+0x3b1, 0x3c4, 0x3bf, 0x3b, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3, 0x3b, 0x73, 0x61,
+0x62, 0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61,
+0x6c, 0x3b, 0x61, 0x72, 0x66, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e,
+0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65,
+0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69,
+0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61,
+0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72,
+0x6e, 0x65, 0x71, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0xab0, 0xab5,
+0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b,
+0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0x3b, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae,
+0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97,
+0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5,
+0xabe, 0xab0, 0x3b, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b,
+0xab6, 0x3b, 0x4c, 0x68, 0x3b, 0x4c, 0x69, 0x3b, 0x54, 0x61, 0x3b, 0x4c, 0x72, 0x3b, 0x41, 0x6c, 0x3b, 0x4a, 0x75, 0x3b,
+0x41, 0x73, 0x3b, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61,
+0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b,
+0x4a, 0x75, 0x6d, 0x6d, 0x61, 0x27, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x54,
+0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x644, 0x64e, 0x62d, 0x3b, 0x644, 0x650, 0x62a, 0x3b, 0x62a, 0x64e, 0x644,
+0x3b, 0x644, 0x64e, 0x631, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x3b, 0x62c, 0x64f, 0x645, 0x3b, 0x623, 0x64e, 0x633, 0x64e, 0x3b,
+0x644, 0x64e, 0x62d, 0x64e, 0x62f, 0x650, 0x3b, 0x644, 0x650, 0x62a, 0x650, 0x646, 0x650, 0x646, 0x652, 0x3b, 0x62a, 0x64e, 0x644, 0x64e,
+0x62a, 0x64e, 0x3b, 0x644, 0x64e, 0x631, 0x64e, 0x628, 0x64e, 0x3b, 0x623, 0x64e, 0x644, 0x652, 0x62d, 0x64e, 0x645, 0x650, 0x633, 0x652,
+0x3b, 0x62c, 0x64f, 0x645, 0x64e, 0x639, 0x64e, 0x3b, 0x623, 0x64e, 0x633, 0x64e, 0x628, 0x64e, 0x631, 0x652, 0x3b, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5d0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5,
+0x5dd, 0x20, 0x5d3, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9,
+0x5d1, 0x5ea, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9,
+0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9,
+0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b,
+0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0x5d0, 0x3b, 0x5d1, 0x3b, 0x5d2, 0x3b, 0x5d3, 0x3b, 0x5d4, 0x3b, 0x5d5, 0x3b,
+0x5e9, 0x3b, 0x930, 0x935, 0x93f, 0x2e, 0x3b, 0x938, 0x94b, 0x92e, 0x2e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x2e, 0x3b, 0x92c, 0x941,
+0x927, 0x2e, 0x3b, 0x92c, 0x943, 0x939, 0x2e, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x2e, 0x3b, 0x936, 0x928, 0x93f, 0x2e, 0x3b,
+0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e,
+0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x943, 0x939, 0x938, 0x94d, 0x92a, 0x924, 0x93f, 0x935, 0x93e, 0x930,
+0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x930, 0x3b, 0x938,
+0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x3b, 0x56, 0x3b, 0x48, 0x3b,
+0x4b, 0x3b, 0x53, 0x7a, 0x65, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x3b, 0x76, 0x61, 0x73, 0xe1, 0x72,
+0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73, 0x7a, 0x65, 0x72, 0x64,
+0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73,
+0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b, 0x50,
+0x3b, 0x53, 0x7a, 0x3b, 0x73, 0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0xfe, 0x72, 0x69, 0x3b, 0x6d, 0x69, 0xf0, 0x3b,
+0x66, 0x69, 0x6d, 0x3b, 0x66, 0xf6, 0x73, 0x3b, 0x6c, 0x61, 0x75, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67,
+0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64,
+0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69,
+0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72,
+0x3b, 0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0xfe, 0x3b, 0x6d,
+0x3b, 0x66, 0x3b, 0x66, 0x3b, 0x6c, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c,
+0x3b, 0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d,
+0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x6e, 0x69,
+0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b,
+0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69, 0x72,
+0x74, 0x3b, 0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61,
+0x74, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c,
+0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61,
+0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68,
+0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x3b, 0x44, 0x3b,
+0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b,
+0x44, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x65, 0x64, 0xec, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x47, 0x69, 0x6f, 0x76, 0x65, 0x64,
+0xec, 0x3b, 0x56, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x44, 0x3b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b,
+0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f,
+0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec,
+0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b,
+0x571f, 0x3b, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc,
+0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x3b, 0xcb0, 0x2e, 0x3b, 0xcb8, 0xccb, 0x2e, 0x3b, 0xcae, 0xc82, 0x2e,
+0x3b, 0xcac, 0xcc1, 0x2e, 0x3b, 0xc97, 0xcc1, 0x2e, 0x3b, 0xcb6, 0xcc1, 0x2e, 0x3b, 0xcb6, 0xca8, 0xcbf, 0x2e, 0x3b, 0xcb0, 0xcb5,
+0xcbf, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b,
+0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0,
+0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb0, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b, 0xcac,
+0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x3b, 0x436, 0x441, 0x2e, 0x3b, 0x434, 0x441, 0x2e, 0x3b, 0x441, 0x441,
+0x2e, 0x3b, 0x441, 0x440, 0x2e, 0x3b, 0x431, 0x441, 0x2e, 0x3b, 0x436, 0x43c, 0x2e, 0x3b, 0x441, 0x4bb, 0x2e, 0x3b, 0x436, 0x435,
+0x43a, 0x441, 0x435, 0x43d, 0x456, 0x3b, 0x434, 0x443, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435,
+0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456,
+0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65,
+0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75,
+0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b,
+0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72,
+0x69, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b,
+0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61,
+0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x3b, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9,
+0x3b, 0xae08, 0x3b, 0xd1a0, 0x3b, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c,
+0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694, 0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0x3b, 0x6cc, 0x6d5, 0x6a9, 0x634, 0x6d5, 0x645, 0x645,
+0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686,
+0x648, 0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633,
+0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x79, 0x15f, 0x3b, 0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f,
+0x3b, 0x70, 0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x3b, 0x79, 0x65, 0x6b, 0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65,
+0x6d, 0x3b, 0x15f, 0xea, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b,
+0xee, 0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x79, 0x3b, 0x64, 0x3b, 0x73, 0x3b, 0xe7, 0x3b, 0x70, 0x3b, 0xee, 0x3b,
+0x15f, 0x3b, 0xead, 0xeb2, 0x2e, 0x3b, 0xe88, 0x2e, 0x3b, 0xead, 0x2e, 0x3b, 0xe9e, 0x2e, 0x3b, 0xe9e, 0xeab, 0x2e, 0x3b, 0xeaa,
+0xe81, 0x2e, 0x3b, 0xeaa, 0x2e, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1,
+0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7,
+0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa,
+0xebb, 0xeb2, 0x3b, 0x53, 0x76, 0x3b, 0x50, 0x72, 0x3b, 0x4f, 0x74, 0x3b, 0x54, 0x72, 0x3b, 0x43, 0x65, 0x3b, 0x50, 0x6b,
+0x3b, 0x53, 0x65, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x69,
+0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65,
+0x6e, 0x61, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74,
+0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53, 0x3b, 0x50, 0x3b,
+0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x65, 0x79, 0x65, 0x3b, 0x6d, 0x31, 0x3b, 0x6d, 0x32, 0x3b,
+0x6d, 0x33, 0x3b, 0x6d, 0x34, 0x3b, 0x6d, 0x35, 0x3b, 0x6d, 0x70, 0x73, 0x3b, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b,
+0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x6f, 0x73, 0xf3, 0x3b, 0x6d, 0x6f, 0x6b,
+0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254,
+0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61,
+0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74,
+0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x3b, 0x53, 0x6b, 0x3b, 0x50, 0x69, 0x3b, 0x41, 0x3b, 0x54,
+0x3b, 0x4b, 0x3b, 0x50, 0x65, 0x3b, 0x160, 0x3b, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b,
+0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69, 0x65,
+0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65, 0x74,
+0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64, 0x69,
+0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x50,
+0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x3b, 0x53, 0x6b, 0x3b, 0x50, 0x72, 0x3b, 0x41, 0x6e, 0x3b,
+0x54, 0x72, 0x3b, 0x4b, 0x74, 0x3b, 0x50, 0x6e, 0x3b, 0x160, 0x74, 0x3b, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d,
+0x2e, 0x3b, 0x432, 0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e,
+0x3b, 0x441, 0x430, 0x431, 0x2e, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b,
 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435,
-0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e, 0x442,
-0x430, 0x3b, 0x42, 0x6b, 0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b, 0x42, 0x6b,
-0x35, 0x3b, 0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2, 0x79, 0x3b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b, 0x6f, 0x3b,
-0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74, 0xe2, 0x3b,
-0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f, 0x6b, 0xfc,
-0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x3b, 0x53, 0x3b,
-0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442,
-0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435,
-0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430,
-0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442,
-0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b, 0x447, 0x3b,
-0x43f, 0x3b, 0x441, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b,
-0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f,
-0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458,
-0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441,
-0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72,
-0x65, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a,
-0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b,
-0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b,
-0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6d, 0x61, 0x3b, 0x42, 0x65, 0x64, 0x3b,
-0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61,
-0x68, 0x61, 0x3b, 0x4d, 0x6d, 0x61, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69,
-0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62,
-0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x6f, 0x71, 0x65, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x54, 0x73, 0x68, 0x3b,
-0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x54, 0x6c, 0x61, 0x3b, 0x4d,
-0x61, 0x74, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x70, 0x69, 0x3b, 0x4d, 0x6f, 0x73, 0x6f, 0x70, 0x75, 0x6c, 0x6f, 0x67, 0x6f,
-0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c,
-0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x61, 0x74,
-0x6c, 0x68, 0x61, 0x74, 0x73, 0x6f, 0x3b, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x3b,
-0x43, 0x68, 0x69, 0x74, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53,
-0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72,
-0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x43, 0x68, 0x69, 0x73,
-0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x43, 0x3b,
-0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0xd89, 0xdbb, 0xdd2, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0x3b, 0xd85, 0xd9f, 0x3b, 0xdb6,
-0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0x3b, 0xd89, 0xdbb,
-0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b,
-0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf, 0xdcf,
-0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b,
-0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9, 0x3b, 0x53,
-0x6f, 0x6e, 0x3b, 0x4d, 0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c,
-0x61, 0x3b, 0x4d, 0x67, 0x63, 0x3b, 0x4c, 0x69, 0x73, 0x6f, 0x6e, 0x74, 0x66, 0x6f, 0x3b, 0x75, 0x4d, 0x73, 0x6f, 0x6d,
-0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69,
-0x74, 0x73, 0x61, 0x74, 0x66, 0x75, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x68, 0x6c,
-0x61, 0x6e, 0x75, 0x3b, 0x75, 0x4d, 0x67, 0x63, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b,
-0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x13e,
-0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74,
-0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b,
-0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x160, 0x3b, 0x50, 0x3b, 0x53,
-0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d, 0x65, 0x74,
-0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
-0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b,
-0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61,
-0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x41, 0x78, 0x64, 0x3b, 0x49,
-0x73, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53,
-0x61, 0x62, 0x3b, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61,
-0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69,
-0x6d, 0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x3b,
-0x4a, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b,
-0x6a, 0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
-0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c,
-0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73, 0xe1,
-0x62, 0x61, 0x64, 0x6f, 0x3b, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x68,
-0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
-0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31,
-0x3b, 0x73, 0xf6, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72,
-0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6, 0x72, 0x3b, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e,
-0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f,
-0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x3b,
-0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b,
-0x4b6, 0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x3b, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430,
-0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435,
-0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d,
-0x431, 0x435, 0x3b, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6,
-0x3b, 0xb9a, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6,
-0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd,
-0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b,
-0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b,
-0xc36, 0xc28, 0xc3f, 0x3b, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
-0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc17, 0xc41, 0xc30,
-0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35,
-0xc3e, 0xc30, 0xc02, 0x3b, 0xc06, 0x3b, 0xc38, 0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2d, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41, 0x3b,
-0xc36, 0x3b, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28,
-0x2e, 0x3b, 0xe2a, 0x2e, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34, 0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08,
-0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31, 0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e,
-0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a, 0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38,
-0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe2d, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e,
-0x3b, 0xe1e, 0x3b, 0xe28, 0x3b, 0xe2a, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58,
-0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf67, 0xfb3, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56,
-0xf74, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
-0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
-0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf67, 0xfb3, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b,
-0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58,
-0xf72, 0x3b, 0xf67, 0xfb3, 0x3b, 0xf55, 0xf74, 0x3b, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230,
-0x1291, 0x12ed, 0x3b, 0x1230, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1213, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262, 0x3b, 0x1240,
-0x12f3, 0x121d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1283, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x1230, 0x1295, 0x1260,
-0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d,
-0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x3b, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b, 0x73, 0x3b, 0x50, 0x75,
-0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x3b, 0x53, 0x101, 0x70, 0x61, 0x74,
-0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65,
-0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61,
-0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x69, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54,
-0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x42, 0x69, 0x72,
-0x3b, 0x48, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53, 0x6f, 0x6e, 0x74,
-0x6f, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x68, 0x75, 0x6e, 0x75, 0x6b, 0x75, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6d,
-0x62, 0x69, 0x72, 0x68, 0x69, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x68, 0x61, 0x72, 0x68, 0x75, 0x3b, 0x52, 0x61, 0x76,
-0x75, 0x6d, 0x75, 0x6e, 0x65, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75,
-0x67, 0x71, 0x69, 0x76, 0x65, 0x6c, 0x61, 0x3b, 0x50, 0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b,
-0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x50, 0x61, 0x7a, 0x61,
-0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72,
-0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b,
-0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b,
-0x43, 0x3b, 0x43, 0x3b, 0x41d, 0x434, 0x3b, 0x41f, 0x43d, 0x3b, 0x412, 0x442, 0x3b, 0x421, 0x440, 0x3b, 0x427, 0x442, 0x3b, 0x41f,
-0x442, 0x3b, 0x421, 0x431, 0x3b, 0x41d, 0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x41f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e,
-0x43a, 0x3b, 0x412, 0x456, 0x432, 0x442, 0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x421, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x427, 0x435,
-0x442, 0x432, 0x435, 0x440, 0x3b, 0x41f, 0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x421, 0x443, 0x431, 0x43e, 0x442, 0x430,
-0x3b, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631,
-0x3b, 0x67e, 0x64a, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a,
-0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x627, 0x3b, 0x67e, 0x3b, 0x645, 0x3b, 0x628, 0x3b, 0x62c,
-0x3b, 0x62c, 0x3b, 0x6c1, 0x3b, 0x42f, 0x43a, 0x448, 0x3b, 0x414, 0x443, 0x448, 0x3b, 0x421, 0x435, 0x448, 0x3b, 0x427, 0x43e, 0x440,
-0x3b, 0x41f, 0x430, 0x439, 0x3b, 0x416, 0x443, 0x43c, 0x3b, 0x428, 0x430, 0x43d, 0x3b, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430,
-0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440,
-0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b,
-0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0x3b,
-0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e,
-0x3b, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54,
-0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x20, 0x37, 0x3b, 0x43, 0x68, 0x1ee7, 0x20, 0x6e, 0x68,
-0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x68, 0x61, 0x69, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x62, 0x61, 0x3b, 0x54, 0x68,
-0x1ee9, 0x20, 0x74, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x6e, 0x103, 0x6d, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x73, 0xe1, 0x75,
-0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x62, 0x1ea3, 0x79, 0x3b, 0x43, 0x4e, 0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34,
-0x3b, 0x54, 0x35, 0x3b, 0x54, 0x36, 0x3b, 0x54, 0x37, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d,
-0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44,
-0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79,
-0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68,
-0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65,
-0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x3b, 0x53, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d,
-0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x3b,
-0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b,
-0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c,
-0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75,
-0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b,
-0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73,
-0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
-0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec,
-0x6b, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9,
-0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc,
-0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74,
-0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69,
-0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x73, 0x6f, 0x6d,
-0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x77, 0x65,
-0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x75, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77,
-0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x3b,
-0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b,
-0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x3b,
-0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67,
-0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64,
-0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x4e, 0x65, 0x64, 0x3b, 0x50, 0x6f, 0x6e, 0x3b, 0x55,
-0x74, 0x6f, 0x3b, 0x53, 0x72, 0x69, 0x3b, 0x10c, 0x65, 0x74, 0x3b, 0x50, 0x65, 0x74, 0x3b, 0x53, 0x75, 0x62, 0x3b, 0x4e,
-0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x50, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b,
-0x55, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x53, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10c, 0x65, 0x74, 0x76, 0x72,
-0x74, 0x61, 0x6b, 0x3b, 0x50, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x53, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4a, 0x65, 0x64,
-0x3b, 0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a,
-0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x3b, 0x4a, 0x65, 0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68,
-0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b,
-0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73,
-0x61, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72, 0x3b,
-0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x65, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44,
-0x65, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x44, 0x65, 0x20, 0x4d, 0x65, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x65, 0x20, 0x4d, 0x65,
-0x72, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x20, 0x59, 0x6f, 0x77, 0x3b, 0x44, 0x65, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65,
-0x72, 0x3b, 0x44, 0x65, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x3b, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b,
-0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x3b,
-0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f, 0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64,
-0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b,
-0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46,
-0x3b, 0x4d, 0x3b, 0x906, 0x926, 0x93f, 0x924, 0x94d, 0x92f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b,
-0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e,
-0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x48, 0x6f,
-0x3b, 0x44, 0x7a, 0x75, 0x3b, 0x44, 0x7a, 0x66, 0x3b, 0x53, 0x68, 0x6f, 0x3b, 0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68,
-0x3b, 0x48, 0x6f, 0x3b, 0x48, 0x6f, 0x67, 0x62, 0x61, 0x61, 0x3b, 0x44, 0x7a, 0x75, 0x3b, 0x44, 0x7a, 0x75, 0x66, 0x6f,
-0x3b, 0x53, 0x68, 0x6f, 0x3b, 0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x61, 0x61, 0x3b, 0x48, 0x6f, 0x3b, 0x1ee4, 0x6b,
-0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72,
-0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4d, 0x62, 0x1ecd, 0x73, 0x1ecb, 0x20, 0x1ee4, 0x6b, 0x61, 0x3b, 0x4d, 0x1ecd, 0x6e,
-0x64, 0x65, 0x3b, 0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65, 0x65, 0x3b,
-0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd,
-0x64, 0x65, 0x65, 0x3b, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74, 0x169, 0x3b,
-0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75, 0x6d, 0x77,
-0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61, 0x20,
-0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61,
-0x6e, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e,
-0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b,
-0x1230, 0x2f, 0x1245, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d,
-0x1265, 0x3b, 0x1230, 0x2f, 0x123d, 0x3b, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x1245, 0x12f3, 0x12c5, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a,
-0x131d, 0x3b, 0x1208, 0x1313, 0x20, 0x12c8, 0x122a, 0x20, 0x1208, 0x1265, 0x12cb, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265, 0x3b,
-0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x123d, 0x1313, 0x12c5, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1208, 0x3b, 0x12a3, 0x3b, 0x12a3,
-0x3b, 0x1230, 0x3b, 0x12a5, 0x1281, 0x12f5, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x122b, 0x1265, 0x12d5, 0x3b, 0x1210,
-0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1260, 0x3b, 0x1240, 0x12f3, 0x121a, 0x1275, 0x3b, 0x12a5, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x122b, 0x3b,
-0x1210, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x4c, 0x61, 0x68, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x47, 0x62, 0x61, 0x3b, 0x54, 0x61,
-0x6e, 0x3b, 0x59, 0x65, 0x69, 0x3b, 0x4b, 0x6f, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69,
-0x3b, 0x4a, 0x65, 0x2d, 0x4b, 0x75, 0x62, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x4a, 0x65, 0x2d, 0x47, 0x62, 0x61, 0x69, 0x3b,
-0x54, 0x61, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x3b, 0x4a, 0x65, 0x2d, 0x59, 0x65, 0x69, 0x3b, 0x4a, 0x65, 0x2d, 0x4b, 0x6f,
-0x79, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x6b, 0x3b,
-0x52, 0x6f, 0x77, 0x3b, 0x48, 0x61, 0x6d, 0x3b, 0x41, 0x72, 0x62, 0x3b, 0x51, 0x69, 0x64, 0x3b, 0x53, 0x61, 0x6d, 0x62,
-0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x6b, 0x69, 0x73, 0x61, 0x6e, 0x79, 0x6f,
-0x3b, 0x52, 0x6f, 0x6f, 0x77, 0x65, 0x3b, 0x48, 0x61, 0x6d, 0x75, 0x73, 0x65, 0x3b, 0x41, 0x72, 0x62, 0x65, 0x3b, 0x51,
-0x69, 0x64, 0x61, 0x61, 0x6d, 0x65, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x52, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x51,
-0x3b, 0x59, 0x6f, 0x6b, 0x3b, 0x54, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x2e, 0x20, 0x54, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73,
-0x61, 0x6e, 0x3b, 0x4e, 0x61, 0x73, 0x3b, 0x4e, 0x61, 0x74, 0x3b, 0x43, 0x68, 0x69, 0x72, 0x3b, 0x57, 0x61, 0x69, 0x20,
-0x59, 0x6f, 0x6b, 0x61, 0x20, 0x42, 0x61, 0x77, 0x61, 0x69, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x54, 0x75, 0x6e, 0x67, 0x61,
-0x3b, 0x54, 0x6f, 0x6b, 0x69, 0x20, 0x47, 0x69, 0x74, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73, 0x61, 0x6d, 0x20, 0x4b, 0x61,
-0x73, 0x75, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x4e, 0x61, 0x73, 0x3b, 0x57, 0x61, 0x69, 0x20,
-0x4e, 0x61, 0x20, 0x54, 0x69, 0x79, 0x6f, 0x6e, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x43, 0x68, 0x69, 0x72,
-0x69, 0x6d, 0x3b, 0x1230, 0x2f, 0x12d3, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x3b, 0x12a3, 0x1228, 0x122d, 0x3b, 0x12a8, 0x121a,
-0x123d, 0x3b, 0x1305, 0x121d, 0x12d3, 0x3b, 0x1230, 0x2f, 0x1295, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x12d3, 0x1263, 0x12ed, 0x3b, 0x1230,
-0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x1296, 0x3b, 0x12a3, 0x1228, 0x122d, 0x1263, 0x12d3, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305, 0x121d, 0x12d3,
-0x1275, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x1295, 0x12a2, 0x123d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1273, 0x3b, 0x12a3, 0x3b, 0x12a8,
-0x3b, 0x1305, 0x3b, 0x1230, 0x3b, 0x4c, 0x61, 0x64, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72,
-0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x4c, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69,
-0x6e, 0x74, 0x61, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c,
-0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x6f, 0x6d,
-0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e,
-0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d,
-0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65,
-0x3b, 0x76, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65, 0x3b, 0x53, 0x77, 0x6f, 0x3b, 0x4d,
-0x75, 0x73, 0x3b, 0x56, 0x68, 0x69, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x1e4a, 0x61, 0x3b, 0x1e70, 0x61, 0x6e, 0x3b, 0x4d, 0x75,
-0x67, 0x3b, 0x53, 0x77, 0x6f, 0x6e, 0x64, 0x61, 0x68, 0x61, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x75, 0x6c, 0x75,
-0x77, 0x6f, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x69, 0x6c, 0x69, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x72,
-0x61, 0x72, 0x75, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x1e4b, 0x61, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x1e71, 0x61, 0x6e,
-0x75, 0x3b, 0x4d, 0x75, 0x67, 0x69, 0x76, 0x68, 0x65, 0x6c, 0x61, 0x3b, 0x4b, 0x254, 0x73, 0x20, 0x4b, 0x77, 0x65, 0x3b,
-0x44, 0x7a, 0x6f, 0x3b, 0x42, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x256, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x256, 0x3b,
-0x4d, 0x65, 0x6d, 0x3b, 0x4b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b, 0x44, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x42, 0x72, 0x61,
-0x256, 0x61, 0x3b, 0x4b, 0x75, 0x256, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x46, 0x69, 0x256, 0x61, 0x3b,
-0x4d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4b, 0x3b, 0x59, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x12c8, 0x130b, 0x3b, 0x1233, 0x12ed, 0x1296, 0x3b, 0x121b, 0x1246, 0x1233, 0x129b, 0x3b, 0x12a0, 0x1229, 0x12cb, 0x3b, 0x1203, 0x1219,
-0x1233, 0x3b, 0x12a0, 0x122d, 0x1263, 0x3b, 0x1244, 0x122b, 0x3b, 0x12c8, 0x3b, 0x1233, 0x3b, 0x121b, 0x3b, 0x12a0, 0x3b, 0x1203, 0x3b, 0x12a0,
-0x3b, 0x1244, 0x3b, 0x4c, 0x50, 0x3b, 0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35,
-0x3b, 0x50, 0x36, 0x3b, 0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b,
-0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb,
-0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f,
-0x3b, 0x4c, 0x61, 0x64, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x4c, 0x61, 0x6d,
-0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x4c, 0x61, 0x64, 0x69, 0x3b, 0x54, 0x61, 0x6e, 0x69, 0x69, 0x3b,
-0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x57,
-0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x57, 0x65, 0x72, 0x3b, 0x4c,
-0x61, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4c, 0x6f, 0x6c, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x63,
-0x68, 0x69, 0x77, 0x69, 0x72, 0x69, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x61, 0x63,
-0x68, 0x69, 0x6e, 0x61, 0x79, 0x69, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4c, 0x6f, 0x77,
-0x65, 0x72, 0x75, 0x6b, 0x61, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69,
-0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f,
-0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b,
-0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65,
-0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42,
-0x3b, 0x53, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x79, 0x65, 0x3b, 0x48,
-0x75, 0x77, 0x3b, 0x42, 0x79, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a,
-0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53,
-0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63,
-0x68, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68,
-0x74, 0x69, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69,
-0x67, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b,
-0xa18f, 0xa0d8, 0x3b, 0xa46d, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa315, 0x3b, 0xa18f,
-0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282, 0xa0d8, 0x3b, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6,
-0x3b, 0xa26c, 0x3b, 0xa0d8, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61,
-0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x47, 0x71, 0x69, 0x3b, 0x75, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x75,
-0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x75, 0x4c, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69,
-0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x75, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x6e, 0x67, 0x6f, 0x4c, 0x65,
-0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x75, 0x6d, 0x47, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x6f,
-0x6e, 0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61,
-0x3b, 0x4d, 0x6f, 0x6b, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x67, 0x61, 0x3b, 0x4d, 0x6f, 0x73, 0x75, 0x70, 0x61, 0x6c,
-0x6f, 0x67, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72,
-0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
-0x6f, 0x6b, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x3b, 0x6d, 0x61,
-0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76,
-0x3b, 0x61, 0x65, 0x6a, 0x6c, 0x65, 0x67, 0x65, 0x3b, 0x6d, 0xe5, 0x61, 0x6e, 0x74, 0x61, 0x3b, 0x64, 0xe4, 0x6a, 0x73,
-0x74, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x65, 0x76, 0x61, 0x68, 0x6b, 0x6f, 0x65, 0x3b, 0x64, 0xe5, 0x61, 0x72, 0x73,
-0x74, 0x61, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x68, 0x6b, 0x65, 0x3b, 0x6c, 0x61, 0x61, 0x76, 0x61,
-0x64, 0x61, 0x68, 0x6b, 0x65, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b,
-0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67,
-0x61, 0x3b, 0x6d, 0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61,
-0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a,
-0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72, 0x64, 0x61, 0x74, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4d,
-0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x45, 0x6d, 0x70, 0x3b, 0x4b, 0x69, 0x6e, 0x3b, 0x44, 0x68, 0x61,
-0x3b, 0x54, 0x72, 0x75, 0x3b, 0x53, 0x70, 0x61, 0x3b, 0x52, 0x69, 0x6d, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x4a, 0x69, 0x79,
-0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20,
-0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74,
-0x67, 0x44, 0x68, 0x61, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61,
-0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x54, 0x72, 0x75, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78,
-0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x53, 0x70, 0x61, 0x63, 0x20, 0x6a, 0x69, 0x79, 0x61,
-0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x52, 0x69, 0x6d,
-0x61, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e,
-0x3b, 0x74, 0x67, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78,
-0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52,
-0x3b, 0x4d, 0x3b, 0x43, 0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x41,
-0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69,
-0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b,
-0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63,
-0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43,
-0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x45, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b,
-0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x49, 0x74, 0x75, 0x6b, 0x75,
-0x20, 0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a,
-0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x20, 0x6b, 0x61, 0x77,
-0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75,
-0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61,
-0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75, 0x77, 0x6f,
-0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x64, 0x65, 0x77, 0x3b, 0x61,
-0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68,
-0x62, 0x69, 0x3b, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61,
-0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61,
-0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
-0x72, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x4b, 0x4d, 0x41, 0x3b,
-0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b,
-0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169,
-0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b,
-0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
-0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x4e,
-0x3b, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65,
-0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b, 0x77, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61,
-0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64,
-0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72,
-0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65,
-0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b,
-0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b,
-0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b,
-0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x69,
-0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b,
-0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68,
-0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64, 0x75, 0x3b, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x53, 0x69, 0x74,
-0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d,
-0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75,
-0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65,
-0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x49, 0x6a, 0x70,
-0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
-0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x74, 0x75, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74,
+0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e, 0x442, 0x430, 0x3b,
+0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b,
+0x41, 0x6c, 0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64,
+0x79, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61,
+0x3b, 0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b,
+0x5a, 0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b,
+0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0x3b, 0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b,
+0x52, 0x61, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x68, 0x61, 0x64,
+0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b,
+0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0xd1e,
+0xd3e, 0xd2f, 0xd30, 0xd4d, 0x200d, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd4d, 0x200d, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35,
+0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd4d, 0x200d, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33,
+0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15,
+0xd33, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28,
+0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33,
+0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd1e, 0xd3e, 0x3b, 0xd24,
+0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0x126, 0x61,
+0x64, 0x3b, 0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69,
+0x6d, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65,
+0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127,
+0x61, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69, 0x6d, 0x67, 0x127, 0x61,
+0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74, 0x3b, 0x126, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x126, 0x3b, 0x120,
+0x3b, 0x53, 0x3b, 0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x6e, 0x65, 0x3b, 0x54, 0x16b, 0x72, 0x65, 0x69,
+0x3b, 0x57, 0x65, 0x6e, 0x65, 0x72, 0x65, 0x69, 0x3b, 0x54, 0x101, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x61, 0x72, 0x61, 0x69,
+0x72, 0x65, 0x3b, 0x48, 0x101, 0x74, 0x61, 0x72, 0x65, 0x69, 0x3b, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e,
+0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x3b, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917,
+0x933, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b,
+0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x41d, 0x44f, 0x3b, 0x414,
+0x430, 0x3b, 0x41c, 0x44f, 0x3b, 0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x3b, 0x43d, 0x44f, 0x43c,
+0x3b, 0x434, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430,
+0x3b, 0x43f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x3b,
+0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x93f,
+0x939, 0x940, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b,
+0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c,
+0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x940, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b,
+0x936, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d,
+0x3b, 0x906, 0x907, 0x924, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932,
+0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x940, 0x935, 0x93e, 0x930, 0x3b, 0x936,
+0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d,
+0x61, 0x2e, 0x3b, 0x74, 0x69, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c,
+0xf8, 0x2e, 0x3b, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e,
+0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8, 0x72, 0x2e, 0x3b, 0x44, 0x69,
+0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0xe7, 0x3b,
+0x64, 0x69, 0x6d, 0xe8, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0xf2, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0xe8,
+0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38,
+0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41,
+0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0x3b, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e,
+0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41,
+0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e,
+0xb30, 0x3b, 0xb30, 0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x3b,
+0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628,
+0x647, 0x3b, 0x686, 0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c,
+0x645, 0x639, 0x647, 0x3b, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c,
+0x3b, 0x634, 0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b,
+0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x3b, 0x6e, 0x69, 0x65,
+0x64, 0x7a, 0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b,
+0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65,
+0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b,
+0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x73, 0x65, 0x67, 0x3b, 0x74, 0x65,
+0x72, 0x3b, 0x71, 0x75, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x3b, 0x73, 0x65, 0x78, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x44, 0x6f,
+0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
+0x54, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x51, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66,
+0x65, 0x69, 0x72, 0x61, 0x3b, 0x51, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x53, 0x65,
+0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0x54, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73,
+0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66,
+0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75,
+0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69,
+0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0xa10, 0xa24, 0x2e, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x2e, 0x3b, 0xa2e,
+0xa70, 0xa17, 0xa32, 0x2e, 0x3b, 0xa2c, 0xa41, 0xa27, 0x2e, 0x3b, 0xa35, 0xa40, 0xa30, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa15, 0xa30,
+0x2e, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa40, 0x2e, 0x3b, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30,
+0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30, 0xa35,
+0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa40, 0xa1a, 0xa30, 0xa35,
+0xa3e, 0xa30, 0x3b, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c,
+0xa41, 0xa71, 0x3b, 0xa38, 0xa3c, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644,
+0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641,
+0x62a, 0x6c1, 0x3b, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b,
+0x76, 0x65, 0x3b, 0x73, 0x6f, 0x3b, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
+0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67,
+0x69, 0x65, 0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x6f, 0x6e, 0x64,
+0x61, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x44, 0x75, 0x3b, 0x4c,
+0x75, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x6f, 0x3b, 0x56, 0x69, 0x3b, 0x53, 0xe2, 0x3b, 0x64, 0x75, 0x6d,
+0x69, 0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65,
+0x72, 0x63, 0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d,
+0x62, 0x103, 0x74, 0x103, 0x3b, 0x412, 0x441, 0x3b, 0x41f, 0x43d, 0x3b, 0x412, 0x442, 0x3b, 0x421, 0x440, 0x3b, 0x427, 0x442, 0x3b,
+0x41f, 0x442, 0x3b, 0x421, 0x431, 0x3b, 0x412, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x41f, 0x43e,
+0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x412, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x421, 0x440,
+0x435, 0x434, 0x430, 0x3b, 0x427, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x41f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b,
+0x421, 0x443, 0x431, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x412, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b,
+0x421, 0x3b, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435,
+0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b,
+0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431,
+0x43e, 0x442, 0x430, 0x3b, 0x42, 0x6b, 0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b,
+0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2, 0x79, 0x3b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b,
+0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74,
+0xe2, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f,
+0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x3b,
+0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b,
+0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b,
+0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e,
+0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f,
+0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b,
+0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440,
+0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430,
+0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440,
+0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a,
+0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b,
+0x73, 0x72, 0x65, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65,
+0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61,
+0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74,
+0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6d, 0x61, 0x3b, 0x42, 0x65,
+0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x71, 0x3b, 0x53, 0x6f, 0x6e,
+0x74, 0x61, 0x68, 0x61, 0x3b, 0x4d, 0x6d, 0x61, 0x6e, 0x74, 0x61, 0x68, 0x61, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65,
+0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c,
+0x61, 0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x6f, 0x71, 0x65, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x54, 0x73,
+0x68, 0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x54, 0x6c, 0x61,
+0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x54, 0x73, 0x68, 0x69, 0x70, 0x69, 0x3b, 0x4d, 0x6f, 0x73, 0x6f, 0x70, 0x75, 0x6c, 0x6f,
+0x67, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62, 0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f,
+0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
+0x61, 0x74, 0x6c, 0x68, 0x61, 0x74, 0x73, 0x6f, 0x3b, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x69,
+0x70, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x3b, 0x4d, 0x75, 0x67,
+0x3b, 0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70,
+0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x43, 0x68,
+0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x3b, 0x53, 0x3b, 0x4d, 0x3b,
+0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0xd89, 0xdbb, 0xdd2, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0x3b, 0xd85, 0xd9f,
+0x3b, 0xdb6, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0x3b,
+0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf,
+0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca,
+0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf,
+0xdcf, 0x3b, 0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9,
+0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x73, 0x61, 0x3b, 0x4e, 0x65, 0x3b,
+0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x63, 0x3b, 0x4c, 0x69, 0x73, 0x6f, 0x6e, 0x74, 0x66, 0x6f, 0x3b, 0x75, 0x4d, 0x73,
+0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65,
+0x73, 0x69, 0x74, 0x73, 0x61, 0x74, 0x66, 0x75, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x65, 0x73, 0x69,
+0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x75, 0x4d, 0x67, 0x63, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x6e, 0x65, 0x3b, 0x70,
+0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64,
+0x65, 0x13e, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b,
+0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f,
+0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x160, 0x3b, 0x50,
+0x3b, 0x53, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d,
+0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70,
+0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64,
+0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f,
+0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x41, 0x78, 0x64,
+0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x69, 0x6d,
+0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b,
+0x4a, 0x69, 0x6d, 0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b,
+0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69,
+0xe9, 0x3b, 0x6a, 0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67,
+0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63,
+0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b,
+0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41,
+0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
-0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b,
-0x37, 0x3b, 0x31, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b,
-0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x3b, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73,
-0x3b, 0x61, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b,
-0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61,
-0x73, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53,
-0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x3b, 0x59, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53,
-0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73,
-0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61,
-0x73, 0x73, 0x3b, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x41, 0x4e,
-0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53, 0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54,
-0x3b, 0x4f, 0x4d, 0x4b, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e,
-0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61,
-0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b,
-0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53,
-0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c,
-0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64, 0x3b, 0x48, 0x69, 0x74, 0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d,
-0x3b, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75,
-0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20,
-0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61, 0x79, 0x69, 0x3b, 0x70, 0x61, 0x20,
-0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d, 0x62, 0x65,
-0x6c, 0x61, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x4a, 0x70, 0x69,
-0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75,
-0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
-0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a,
-0x3b, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61,
-0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x6b, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b,
-0x74, 0x61, 0x72, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61,
-0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41,
-0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x4b, 0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54,
-0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69,
-0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65,
-0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b,
-0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x3b, 0x4b,
-0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af,
-0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be,
-0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1,
-0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd,
-0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b,
-0x13e7, 0x3b, 0x13a4, 0x3b, 0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b,
-0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69,
-0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a,
-0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x3b, 0x64,
-0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73, 0x3b, 0x4c, 0x6c, 0x32, 0x3b, 0x4c, 0x6c, 0x33,
-0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31,
-0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75,
-0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79,
-0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e,
-0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61,
-0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c,
-0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c,
-0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b,
-0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65, 0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b,
-0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
-0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f,
-0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c,
-0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b, 0x4c, 0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x3b, 0x53, 0x61, 0x62, 0x62, 0x69,
-0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69,
-0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c,
-0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61,
-0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x50, 0x61, 0x20, 0x4d, 0x75,
-0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c, 0x69,
-0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b,
-0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e,
-0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x73,
-0x69, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73,
-0x61, 0x62, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66,
-0x65, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74,
-0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65,
-0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x64, 0x75, 0x3b, 0x64, 0x3b, 0x73, 0x3b,
-0x74, 0x3b, 0x6b, 0x3b, 0x6b, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41,
-0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x3b, 0x4b, 0x69,
-0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b,
-0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57, 0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57,
-0x3b, 0x4a, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x41, 0x65, 0x6e, 0x3b, 0x53, 0x6f, 0x6d, 0x3b, 0x41,
-0x6e, 0x67, 0x3b, 0x4d, 0x75, 0x74, 0x3b, 0x4c, 0x6f, 0x68, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x74,
-0x69, 0x73, 0x61, 0x70, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x20, 0x6e, 0x65, 0x74, 0x61, 0x69, 0x3b, 0x42, 0x65, 0x74,
-0x75, 0x74, 0x61, 0x62, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x27, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x73,
-0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x61, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e,
-0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x6d, 0x75, 0x74, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62,
-0x20, 0x6c, 0x6f, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x53, 0x6f,
-0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74,
-0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78, 0x74,
-0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75,
-0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x74, 0x61, 0x78,
-0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53,
-0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57,
-0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d,
-0x65, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x64,
-0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x6f, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73,
-0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72,
-0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d,
-0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e, 0x254,
-0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x6d, 0xf3, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69, 0x3b,
-0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x3b,
-0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75,
-0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75,
-0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b,
-0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4a,
-0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61,
-0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b,
-0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a,
-0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a,
-0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e, 0x69, 0x3b, 0x55,
-0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61,
-0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65,
-0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x67, 0x27, 0x6f, 0x6e, 0x3b,
-0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x3b,
-0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x53, 0x61,
-0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x51, 0x75,
-0x6e, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x20, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x6e, 0x69, 0x3b, 0x53,
-0x61, 0x6c, 0x75, 0x73, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x71, 0x3b, 0x43, 0x61, 0x6d, 0x75, 0x73, 0x3b, 0x4a, 0x75, 0x6d,
-0x71, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x4e, 0x3b,
-0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x51, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b,
-0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x3b,
-0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61,
-0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c,
-0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c,
-0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54,
-0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e, 0x47, 0x53, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70,
-0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72,
-0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41,
-0x6e, 0x67, 0x27, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67,
-0x65, 0x73, 0x6f, 0x3b, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x41, 0x73,
-0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73,
-0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x3b, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41,
-0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73,
-0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b,
-0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b,
-0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41, 0x73, 0x69, 0x3b, 0x41, 0x6c, 0x68, 0x61,
-0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41,
-0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x7a, 0x75,
-0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d,
-0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x61, 0x70, 0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
-0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69,
-0x3b
+0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49,
+0x3b, 0x31, 0x3b, 0x73, 0xf6, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74,
+0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6, 0x72, 0x3b, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d,
+0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61,
+0x67, 0x3b, 0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448,
+0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x3b, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443,
+0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d,
+0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428,
+0x430, 0x43d, 0x431, 0x435, 0x3b, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b,
+0xbb5, 0xbc6, 0x3b, 0xb9a, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b,
+0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4,
+0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b,
+0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d,
+0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0x3b, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30,
+0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc17,
+0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28,
+0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc06, 0x3b, 0xc38, 0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2d, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36,
+0xc41, 0x3b, 0xc36, 0x3b, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e,
+0x3b, 0xe28, 0x2e, 0x3b, 0xe2a, 0x2e, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34, 0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31,
+0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31, 0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31,
+0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a, 0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19,
+0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe2d, 0x3b, 0xe08, 0x3b, 0xe2d,
+0x3b, 0xe1e, 0x3b, 0xe1e, 0x3b, 0xe28, 0x3b, 0xe2a, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf67, 0xfb3, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62,
+0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf67, 0xfb3, 0xf42, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xf44,
+0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3,
+0x3b, 0xf58, 0xf72, 0x3b, 0xf67, 0xfb3, 0x3b, 0xf55, 0xf74, 0x3b, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275,
+0x3b, 0x1230, 0x1291, 0x12ed, 0x3b, 0x1230, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1213, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262,
+0x3b, 0x1240, 0x12f3, 0x121d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1283, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x1230,
+0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b,
+0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x3b, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b, 0x73, 0x3b,
+0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x3b, 0x53, 0x101, 0x70,
+0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x75,
+0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b,
+0x46, 0x61, 0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x69, 0x3b, 0x53, 0x3b, 0x4d,
+0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x42,
+0x69, 0x72, 0x3b, 0x48, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x54, 0x6c, 0x68, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53, 0x6f,
+0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x68, 0x75, 0x6e, 0x75, 0x6b, 0x75, 0x3b, 0x52, 0x61, 0x76,
+0x75, 0x6d, 0x62, 0x69, 0x72, 0x68, 0x69, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x68, 0x61, 0x72, 0x68, 0x75, 0x3b, 0x52,
+0x61, 0x76, 0x75, 0x6d, 0x75, 0x6e, 0x65, 0x3b, 0x52, 0x61, 0x76, 0x75, 0x6e, 0x74, 0x6c, 0x68, 0x61, 0x6e, 0x75, 0x3b,
+0x4d, 0x75, 0x67, 0x71, 0x69, 0x76, 0x65, 0x6c, 0x61, 0x3b, 0x50, 0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61,
+0x6c, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x50, 0x61,
+0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7,
+0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d,
+0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b,
+0x50, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41d, 0x434, 0x3b, 0x41f, 0x43d, 0x3b, 0x412, 0x442, 0x3b, 0x421, 0x440, 0x3b, 0x427, 0x442,
+0x3b, 0x41f, 0x442, 0x3b, 0x421, 0x431, 0x3b, 0x41d, 0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x41f, 0x43e, 0x43d, 0x435, 0x434, 0x456,
+0x43b, 0x43e, 0x43a, 0x3b, 0x412, 0x456, 0x432, 0x442, 0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x421, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b,
+0x427, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x41f, 0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x421, 0x443, 0x431, 0x43e,
+0x442, 0x430, 0x3b, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b, 0x627, 0x62a, 0x648,
+0x627, 0x631, 0x3b, 0x67e, 0x64a, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x631,
+0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x627, 0x3b, 0x67e, 0x3b, 0x645, 0x3b, 0x628,
+0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x6c1, 0x3b, 0x42f, 0x43a, 0x448, 0x3b, 0x414, 0x443, 0x448, 0x3b, 0x421, 0x435, 0x448, 0x3b, 0x427,
+0x43e, 0x440, 0x3b, 0x41f, 0x430, 0x439, 0x3b, 0x416, 0x443, 0x43c, 0x3b, 0x428, 0x430, 0x43d, 0x3b, 0x44f, 0x43a, 0x448, 0x430, 0x43d,
+0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447,
+0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c,
+0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b,
+0x428, 0x3b, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b,
+0x634, 0x2e, 0x3b, 0x59, 0x61, 0x6b, 0x73, 0x68, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43,
+0x68, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x3b, 0x79, 0x61, 0x6b,
+0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x68,
+0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x79, 0x73,
+0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x59, 0x3b,
+0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b,
+0x54, 0x68, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b,
+0x54, 0x68, 0x20, 0x37, 0x3b, 0x43, 0x68, 0x1ee7, 0x20, 0x6e, 0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x68, 0x61,
+0x69, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x62, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x74, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20,
+0x6e, 0x103, 0x6d, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x73, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x62, 0x1ea3, 0x79, 0x3b,
+0x43, 0x4e, 0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54, 0x36, 0x3b, 0x54, 0x37,
+0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61,
+0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44,
+0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68,
+0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49,
+0x61, 0x75, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20,
+0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53,
+0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61,
+0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42,
+0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x43,
+0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6e, 0x69, 0x3b,
+0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b,
+0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b,
+0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd,
+0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9,
+0x301, 0x74, 0x61, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41,
+0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301,
+0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc,
+0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73, 0x6f,
+0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71,
+0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b, 0x4c, 0x77,
+0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b,
+0x75, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b,
+0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48,
+0x3b, 0x4d, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b, 0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74,
+0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x3b, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5,
+0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74,
+0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61,
+0x67, 0x3b, 0x4e, 0x65, 0x64, 0x3b, 0x50, 0x6f, 0x6e, 0x3b, 0x55, 0x74, 0x6f, 0x3b, 0x53, 0x72, 0x69, 0x3b, 0x10c, 0x65,
+0x74, 0x3b, 0x50, 0x65, 0x74, 0x3b, 0x53, 0x75, 0x62, 0x3b, 0x4e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x50,
+0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x55, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x53, 0x72,
+0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10c, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x50, 0x65, 0x74, 0x61, 0x6b,
+0x3b, 0x53, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4a, 0x65, 0x64, 0x3b, 0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b,
+0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x3b, 0x4a, 0x65,
+0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79,
+0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e, 0x3b, 0x4a,
+0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c,
+0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53,
+0x61, 0x64, 0x3b, 0x44, 0x65, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44, 0x65, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x44, 0x65, 0x20,
+0x4d, 0x65, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x65, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x20, 0x59,
+0x6f, 0x77, 0x3b, 0x44, 0x65, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x20, 0x53, 0x61, 0x64, 0x6f,
+0x72, 0x6e, 0x3b, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59,
+0x61, 0x77, 0x3b, 0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x3b, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44,
+0x77, 0x6f, 0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b,
+0x59, 0x61, 0x77, 0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61, 0x3b,
+0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x906, 0x926, 0x93f, 0x924, 0x94d, 0x92f,
+0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941,
+0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
+0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x48, 0x6f, 0x3b, 0x44, 0x7a, 0x75, 0x3b, 0x44, 0x7a, 0x66, 0x3b,
+0x53, 0x68, 0x6f, 0x3b, 0x53, 0x6f, 0x6f, 0x3b, 0x53, 0x6f, 0x68, 0x3b, 0x48, 0x6f, 0x3b, 0x48, 0x6f, 0x67, 0x62, 0x61,
+0x61, 0x3b, 0x44, 0x7a, 0x75, 0x3b, 0x44, 0x7a, 0x75, 0x66, 0x6f, 0x3b, 0x53, 0x68, 0x6f, 0x3b, 0x53, 0x6f, 0x6f, 0x3b,
+0x53, 0x6f, 0x68, 0x61, 0x61, 0x3b, 0x48, 0x6f, 0x3b, 0x1ee4, 0x6b, 0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75,
+0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4d, 0x62,
+0x1ecd, 0x73, 0x1ecb, 0x20, 0x1ee4, 0x6b, 0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x69, 0x75, 0x7a, 0x64, 0x65,
+0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46,
+0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x6b, 0x79, 0x3b, 0x57,
+0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74, 0x169, 0x3b, 0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57,
+0x74, 0x68, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6d,
+0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b,
+0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74,
+0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x59, 0x3b, 0x57,
+0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x1230, 0x2f, 0x1245, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a,
+0x131d, 0x3b, 0x1208, 0x1313, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265, 0x3b, 0x1230, 0x2f, 0x123d, 0x3b, 0x1230, 0x1295, 0x1260,
+0x122d, 0x20, 0x1245, 0x12f3, 0x12c5, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x120a, 0x131d, 0x3b, 0x1208, 0x1313, 0x20, 0x12c8, 0x122a, 0x20, 0x1208,
+0x1265, 0x12cb, 0x3b, 0x12a3, 0x121d, 0x12f5, 0x3b, 0x12a3, 0x122d, 0x1265, 0x3b, 0x1230, 0x1295, 0x1260, 0x122d, 0x20, 0x123d, 0x1313, 0x12c5, 0x3b,
+0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1208, 0x3b, 0x12a3, 0x3b, 0x12a3, 0x3b, 0x1230, 0x3b, 0x12a5, 0x1281, 0x12f5, 0x3b, 0x1230, 0x1291,
+0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x122b, 0x1265, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1260, 0x3b, 0x1240, 0x12f3,
+0x121a, 0x1275, 0x3b, 0x12a5, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x122b, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x4c, 0x61, 0x68,
+0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x47, 0x62, 0x61, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x59, 0x65, 0x69, 0x3b, 0x4b, 0x6f, 0x79,
+0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4a, 0x65, 0x2d, 0x4b, 0x75, 0x62, 0x61, 0x63,
+0x68, 0x61, 0x3b, 0x4a, 0x65, 0x2d, 0x47, 0x62, 0x61, 0x69, 0x3b, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x3b, 0x4a,
+0x65, 0x2d, 0x59, 0x65, 0x69, 0x3b, 0x4a, 0x65, 0x2d, 0x4b, 0x6f, 0x79, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x69, 0x3b, 0x53,
+0x61, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x6b, 0x3b, 0x52, 0x6f, 0x77, 0x3b, 0x48, 0x61, 0x6d, 0x3b, 0x41,
+0x72, 0x62, 0x3b, 0x51, 0x69, 0x64, 0x3b, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x79, 0x6f,
+0x3b, 0x4d, 0x61, 0x61, 0x6b, 0x69, 0x73, 0x61, 0x6e, 0x79, 0x6f, 0x3b, 0x52, 0x6f, 0x6f, 0x77, 0x65, 0x3b, 0x48, 0x61,
+0x6d, 0x75, 0x73, 0x65, 0x3b, 0x41, 0x72, 0x62, 0x65, 0x3b, 0x51, 0x69, 0x64, 0x61, 0x61, 0x6d, 0x65, 0x3b, 0x53, 0x3b,
+0x53, 0x3b, 0x4d, 0x3b, 0x52, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x51, 0x3b, 0x59, 0x6f, 0x6b, 0x3b, 0x54, 0x75, 0x6e, 0x67,
+0x3b, 0x54, 0x2e, 0x20, 0x54, 0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73, 0x61, 0x6e, 0x3b, 0x4e, 0x61, 0x73, 0x3b, 0x4e, 0x61,
+0x74, 0x3b, 0x43, 0x68, 0x69, 0x72, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x59, 0x6f, 0x6b, 0x61, 0x20, 0x42, 0x61, 0x77, 0x61,
+0x69, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x54, 0x75, 0x6e, 0x67, 0x61, 0x3b, 0x54, 0x6f, 0x6b, 0x69, 0x20, 0x47, 0x69, 0x74,
+0x75, 0x6e, 0x67, 0x3b, 0x54, 0x73, 0x61, 0x6d, 0x20, 0x4b, 0x61, 0x73, 0x75, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x69, 0x20,
+0x4e, 0x61, 0x20, 0x4e, 0x61, 0x73, 0x3b, 0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x54, 0x69, 0x79, 0x6f, 0x6e, 0x3b,
+0x57, 0x61, 0x69, 0x20, 0x4e, 0x61, 0x20, 0x43, 0x68, 0x69, 0x72, 0x69, 0x6d, 0x3b, 0x1230, 0x2f, 0x12d3, 0x3b, 0x1230, 0x1296,
+0x3b, 0x1273, 0x120b, 0x1238, 0x3b, 0x12a3, 0x1228, 0x122d, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305, 0x121d, 0x12d3, 0x3b, 0x1230, 0x2f, 0x1295,
+0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x12d3, 0x1263, 0x12ed, 0x3b, 0x1230, 0x1296, 0x3b, 0x1273, 0x120b, 0x1238, 0x1296, 0x3b, 0x12a3, 0x1228,
+0x122d, 0x1263, 0x12d3, 0x3b, 0x12a8, 0x121a, 0x123d, 0x3b, 0x1305, 0x121d, 0x12d3, 0x1275, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x20, 0x1295, 0x12a2,
+0x123d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1273, 0x3b, 0x12a3, 0x3b, 0x12a8, 0x3b, 0x1305, 0x3b, 0x1230, 0x3b, 0x4c, 0x61, 0x64, 0x3b,
+0x4c, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b,
+0x41, 0x73, 0x61, 0x3b, 0x4c, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x6e, 0x74, 0x61, 0x6e, 0x69, 0x3b, 0x54, 0x61, 0x6c,
+0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
+0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x65,
+0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69,
+0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73,
+0x61, 0x62, 0x69, 0x64, 0x65, 0x3b, 0x53, 0x77, 0x6f, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x56, 0x68, 0x69, 0x3b, 0x52, 0x61,
+0x72, 0x3b, 0x1e4a, 0x61, 0x3b, 0x1e70, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53, 0x77, 0x6f, 0x6e, 0x64, 0x61, 0x68,
+0x61, 0x3b, 0x4d, 0x75, 0x73, 0x75, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x77, 0x6f, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x76,
+0x68, 0x69, 0x6c, 0x69, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75,
+0x1e4b, 0x61, 0x3b, 0x1e3c, 0x61, 0x76, 0x68, 0x75, 0x1e71, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x69, 0x76, 0x68, 0x65,
+0x6c, 0x61, 0x3b, 0x4b, 0x254, 0x73, 0x20, 0x4b, 0x77, 0x65, 0x3b, 0x44, 0x7a, 0x6f, 0x3b, 0x42, 0x72, 0x61, 0x3b, 0x4b,
+0x75, 0x256, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69, 0x256, 0x3b, 0x4d, 0x65, 0x6d, 0x3b, 0x4b, 0x254, 0x73, 0x69, 0x256,
+0x61, 0x3b, 0x44, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x42, 0x72, 0x61, 0x256, 0x61, 0x3b, 0x4b, 0x75, 0x256, 0x61, 0x3b, 0x59,
+0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x46, 0x69, 0x256, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61, 0x3b, 0x4b,
+0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4b, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x12c8, 0x130b, 0x3b, 0x1233, 0x12ed, 0x1296, 0x3b,
+0x121b, 0x1246, 0x1233, 0x129b, 0x3b, 0x12a0, 0x1229, 0x12cb, 0x3b, 0x1203, 0x1219, 0x1233, 0x3b, 0x12a0, 0x122d, 0x1263, 0x3b, 0x1244, 0x122b, 0x3b,
+0x12c8, 0x3b, 0x1233, 0x3b, 0x121b, 0x3b, 0x12a0, 0x3b, 0x1203, 0x3b, 0x12a0, 0x3b, 0x1244, 0x3b, 0x4c, 0x50, 0x3b, 0x50, 0x31, 0x3b,
+0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35, 0x3b, 0x50, 0x36, 0x3b, 0x4c, 0x101, 0x70, 0x75, 0x6c,
+0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61, 0x3b, 0x50,
+0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c,
+0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x3b, 0x4c, 0x61, 0x64, 0x3b, 0x54, 0x61, 0x6e, 0x3b,
+0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x3b,
+0x4c, 0x61, 0x64, 0x69, 0x3b, 0x54, 0x61, 0x6e, 0x69, 0x69, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61,
+0x72, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x6d, 0x69, 0x74, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61,
+0x74, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x57, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61,
+0x69, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x57, 0x65, 0x72, 0x3b, 0x4c, 0x61, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b,
+0x4c, 0x6f, 0x6c, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x77, 0x69, 0x72, 0x69, 0x3b, 0x4c, 0x61,
+0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x61, 0x79, 0x69, 0x3b, 0x4c, 0x61,
+0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6b, 0x61, 0x3b, 0x4c, 0x69, 0x6e,
+0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79,
+0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61,
+0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65,
+0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x3b,
+0x4c, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42, 0x3b, 0x53, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75,
+0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x79, 0x65, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x79, 0x65, 0x3b, 0x53, 0x61,
+0x62, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75,
+0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4,
+0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74,
+0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74,
+0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f,
+0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0x3b, 0xa46d, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa282,
+0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282,
+0xa0d8, 0x3b, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x3b, 0x53, 0x6f, 0x6e, 0x3b,
+0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x47,
+0x71, 0x69, 0x3b, 0x75, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x75, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x75, 0x4c, 0x65,
+0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x75, 0x4c,
+0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x6e, 0x67, 0x6f, 0x4c, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x75,
+0x6d, 0x47, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x64,
+0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4e, 0x65, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x6f, 0x6b, 0x3b, 0x53, 0x6f, 0x6e, 0x74,
+0x61, 0x67, 0x61, 0x3b, 0x4d, 0x6f, 0x73, 0x75, 0x70, 0x61, 0x6c, 0x6f, 0x67, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x62,
+0x65, 0x64, 0x69, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x72, 0x6f, 0x3b, 0x4c, 0x61, 0x62, 0x6f, 0x6e, 0x65, 0x3b,
+0x4c, 0x61, 0x62, 0x6f, 0x68, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x6f, 0x6b, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x73,
+0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75,
+0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76, 0x3b, 0x61, 0x65, 0x6a, 0x6c, 0x65, 0x67, 0x65, 0x3b,
+0x6d, 0xe5, 0x61, 0x6e, 0x74, 0x61, 0x3b, 0x64, 0xe4, 0x6a, 0x73, 0x74, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x65, 0x76,
+0x61, 0x68, 0x6b, 0x6f, 0x65, 0x3b, 0x64, 0xe5, 0x61, 0x72, 0x73, 0x74, 0x61, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61,
+0x64, 0x61, 0x68, 0x6b, 0x65, 0x3b, 0x6c, 0x61, 0x61, 0x76, 0x61, 0x64, 0x61, 0x68, 0x6b, 0x65, 0x3b, 0x53, 0x3b, 0x4d,
+0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69,
+0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d, 0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1,
+0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72,
+0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76,
+0x61, 0x72, 0x64, 0x61, 0x74, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b,
+0x45, 0x6d, 0x70, 0x3b, 0x4b, 0x69, 0x6e, 0x3b, 0x44, 0x68, 0x61, 0x3b, 0x54, 0x72, 0x75, 0x3b, 0x53, 0x70, 0x61, 0x3b,
+0x52, 0x69, 0x6d, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x4a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61,
+0x6e, 0x3b, 0x74, 0x67, 0x4b, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61,
+0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x44, 0x68, 0x61, 0x20, 0x6a, 0x69, 0x79, 0x61,
+0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x54, 0x72, 0x75,
+0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b,
+0x74, 0x67, 0x53, 0x70, 0x61, 0x63, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e,
+0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x52, 0x69, 0x6d, 0x61, 0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69,
+0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b, 0x74, 0x67, 0x4d, 0x61, 0x74, 0x61, 0x72, 0x75,
+0x20, 0x6a, 0x69, 0x79, 0x61, 0x78, 0x20, 0x69, 0x79, 0x61, 0x78, 0x20, 0x73, 0x6e, 0x67, 0x61, 0x79, 0x61, 0x6e, 0x3b,
+0x45, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x43, 0x70, 0x72, 0x3b, 0x43, 0x74,
+0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b, 0x45, 0x73,
+0x74, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74,
+0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62,
+0x61, 0x74, 0x6f, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x45, 0x3b, 0x4a, 0x75,
+0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61,
+0x73, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x49, 0x74, 0x75, 0x6b, 0x75, 0x20, 0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61,
+0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75,
+0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b,
+0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61,
+0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4b,
+0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75, 0x77, 0x6f, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a,
+0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68, 0x62, 0x69, 0x3b, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61,
+0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c,
+0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64,
+0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69, 0x72, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e,
+0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x4b, 0x4d, 0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e,
+0x4d, 0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69,
+0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65,
+0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b,
+0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x3b, 0x4b, 0x3b,
+0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b,
+0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b, 0x77, 0x65, 0x3b,
+0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74,
+0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f,
+0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6e, 0x65,
+0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72,
+0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65,
+0x20, 0x6b, 0x77, 0x65, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x44,
+0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53,
+0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f,
+0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43,
+0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64,
+0x75, 0x3b, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x6e, 0x3b,
+0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b,
+0x4d, 0x67, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69,
+0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68,
+0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b,
+0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x49, 0x6a, 0x70, 0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b,
+0x49, 0x6a, 0x74, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
+0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
+0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69,
+0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x31, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61,
+0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x3b,
+0x41, 0x73, 0x69, 0x1e0d, 0x3b, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x73,
+0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69,
+0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f,
+0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59,
+0x2d49, 0x2d39, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f,
+0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30,
+0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72,
+0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x3b,
+0x59, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73,
+0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73,
+0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x3b, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53,
+0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f,
+0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72,
+0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61,
+0x6e, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d,
+0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4d,
+0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64, 0x3b, 0x48, 0x69, 0x74,
+0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b,
+0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
+0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
+0x74, 0x61, 0x79, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68,
+0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x61, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x48,
+0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e,
+0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c,
+0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
+0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72,
+0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x6b, 0x61, 0x72,
+0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61,
+0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69,
+0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x4b, 0x6d, 0x61, 0x3b, 0x54,
+0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e,
+0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
+0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41,
+0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61,
+0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e,
+0x3b, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1,
+0x3b, 0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be, 0x13d9,
+0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1,
+0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13c6, 0x3b,
+0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x3b, 0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x64,
+0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65,
+0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69,
+0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73,
+0x3b, 0x4c, 0x6c, 0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36,
+0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70,
+0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c,
+0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61,
+0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b,
+0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
+0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64,
+0x69, 0x3b, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65, 0x3b, 0x54, 0xe1,
+0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69,
+0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x42,
+0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b, 0x4c, 0x77, 0x35, 0x3b, 0x4c,
+0x77, 0x36, 0x3b, 0x53, 0x61, 0x62, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c,
+0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c,
+0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77,
+0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c,
+0x3b, 0x4c, 0x3b, 0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68,
+0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69,
+0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61,
+0x6c, 0x69, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6c, 0x75, 0x73,
+0x68, 0x69, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b,
+0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73,
+0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65,
+0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61,
+0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62,
+0x61, 0x64, 0x75, 0x3b, 0x64, 0x3b, 0x73, 0x3b, 0x74, 0x3b, 0x6b, 0x3b, 0x6b, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x4b, 0x49,
+0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54,
+0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b,
+0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61,
+0x3b, 0x57, 0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4b, 0x3b, 0x4d,
+0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x41,
+0x65, 0x6e, 0x3b, 0x53, 0x6f, 0x6d, 0x3b, 0x41, 0x6e, 0x67, 0x3b, 0x4d, 0x75, 0x74, 0x3b, 0x4c, 0x6f, 0x68, 0x3b, 0x42,
+0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x74, 0x69, 0x73, 0x61, 0x70, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x20, 0x6e,
+0x65, 0x74, 0x61, 0x69, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x27, 0x3b, 0x42,
+0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x73, 0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62,
+0x20, 0x61, 0x6e, 0x67, 0x27, 0x77, 0x61, 0x6e, 0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x6d, 0x75, 0x74,
+0x3b, 0x42, 0x65, 0x74, 0x75, 0x74, 0x61, 0x62, 0x20, 0x6c, 0x6f, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44,
+0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73,
+0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78,
+0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44,
+0x6f, 0x6e, 0x64, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61,
+0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73,
+0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d,
+0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53,
+0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x6f, 0x6e, 0x64, 0x61, 0x61,
+0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63,
+0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64,
+0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70,
+0xed, 0x6c, 0xed, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e, 0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61,
+0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69, 0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75,
+0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61,
+0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61,
+0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e,
+0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53,
+0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41,
+0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61,
+0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75,
+0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f,
+0x73, 0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41,
+0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41,
+0x61, 0x72, 0x3b, 0x55, 0x6e, 0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e,
+0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61,
+0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b,
+0x61, 0x75, 0x6e, 0x67, 0x27, 0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b,
+0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x3b, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b, 0x3b,
+0x53, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x43, 0x61,
+0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x51, 0x75, 0x6e, 0x3b, 0x4e, 0x61, 0x62, 0x61, 0x20, 0x53, 0x61, 0x6d, 0x62, 0x61,
+0x74, 0x3b, 0x53, 0x61, 0x6e, 0x69, 0x3b, 0x53, 0x61, 0x6c, 0x75, 0x73, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x71, 0x3b, 0x43,
+0x61, 0x6d, 0x75, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x71, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x75, 0x6e, 0x78, 0x61, 0x20, 0x53,
+0x61, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x4e, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x51, 0x3b,
+0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b,
+0x41, 0x6c, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69,
+0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61,
+0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75,
+0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x4a, 0x4d, 0x50, 0x3b, 0x57,
+0x55, 0x54, 0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e,
+0x47, 0x53, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68,
+0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65,
+0x6b, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x6e, 0x67, 0x27, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20,
+0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x3b, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54, 0x3b,
+0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b,
+0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x3b, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73,
+0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b,
+0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79, 0x61,
+0x73, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6c, 0x68, 0x3b,
+0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b,
+0x41, 0x73, 0x69, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74,
+0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69,
+0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x3b, 0x4a, 0x70,
+0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a,
+0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61,
+0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61,
+0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a,
+0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b
 };
 
 static const ushort am_data[] = {
 0x41, 0x4d, 0x57, 0x44, 0x76, 0x6d, 0x2e, 0x50, 0x44, 0x1321, 0x12cb, 0x1275, 0x635, 0x531, 0x57c, 0x2024, 0x9aa, 0x9c2, 0x9f0, 0x9cd,
 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a3, 0x9aa, 0x9c2, 0x9b0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a3, 0x43f, 0x440, 0x2e, 0x20, 0x43e, 0x431,
 0x2e, 0x434, 0x430, 0x20, 0x43f, 0x430, 0x43b, 0x443, 0x434, 0x43d, 0x44f, 0x1796, 0x17d2, 0x179a, 0x17b9, 0x1780, 0x61, 0x2e, 0x6d, 0x2e,
-0x4e0a, 0x5348, 0x64, 0x6f, 0x70, 0x2e, 0x66, 0x2e, 0x6d, 0x2e, 0x65, 0x6e, 0x6e, 0x65, 0x20, 0x6b, 0x65, 0x73, 0x6b, 0x70,
-0xe4, 0x65, 0x76, 0x61, 0x61, 0x70, 0x2e, 0x76, 0x6f, 0x72, 0x6d, 0x2e, 0x3c0, 0x2e, 0x3bc, 0x2e, 0xaaa, 0xac2, 0xab0, 0xacd,
-0xab5, 0x20, 0xaae, 0xaa7, 0xacd, 0xaaf, 0xabe, 0xab9, 0xacd, 0xaa8, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6, 0x92a, 0x942, 0x930, 0x94d,
-0x935, 0x93e, 0x939, 0x94d, 0x928, 0x64, 0x65, 0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x6d, 0x2e, 0x5348, 0x524d, 0x61, 0x6d, 0xc624, 0xc804,
-0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x70, 0x72, 0x69, 0x65, 0x161, 0x70,
-0x69, 0x65, 0x74, 0x43f, 0x440, 0x435, 0x442, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0xd30, 0xd3e, 0xd35, 0xd3f, 0xd32, 0xd46, 0x51,
-0x4e, 0x92a, 0x942, 0x930, 0x94d, 0x935, 0x20, 0x92e, 0x927, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x939, 0x63a, 0x2e, 0x645, 0x2e, 0x642,
-0x628, 0x644, 0x20, 0x627, 0x632, 0x20, 0x638, 0x647, 0x631, 0x41, 0x6e, 0x74, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6d, 0x65,
-0x69, 0x6f, 0x2d, 0x64, 0x69, 0x61, 0xa38, 0xa35, 0xa47, 0xa30, 0xa47, 0x4e, 0x44, 0x43f, 0x440, 0x435, 0x20, 0x43f, 0x43e, 0x434,
-0x43d, 0x435, 0x70, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x64, 0x6f, 0x70, 0x6f,
-0x6c, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x6e, 0x2e, 0x61, 0x73, 0x75, 0x62, 0x75, 0x68, 0x69, 0x66, 0x6d, 0xc09, 0xe01,
-0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1295, 0x1309, 0x1206, 0x20,
-0x1230, 0x12d3, 0x1270, 0x434, 0x43f, 0x53, 0x41, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61,
-0x67, 0x41, 0x4e, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x41, 0x2e, 0x4d, 0x2e, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79,
-0x61, 0xa3b8, 0xa111, 0x4d, 0x61, 0x2f, 0x4d, 0x6f, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b, 0x73, 0x75,
-0x62, 0x61, 0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x6e,
-0x67, 0x27, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x70, 0x61,
-0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75, 0x6b, 0x6f, 0x4b, 0x49, 0x13cc, 0x13be, 0x13b4, 0x4d, 0x75, 0x68, 0x69, 0x54,
-0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x52, 0x168, 0x42, 0x65, 0x65, 0x74, 0x1c1, 0x67, 0x6f, 0x61,
-0x67, 0x61, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f, 0x69, 0x63,
-0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70, 0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0x41, 0x64, 0x64, 0x75,
-0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x61, 0x6c, 0x6d, 0x61, 0x6b, 0x65, 0x6f
+0x4e0a, 0x5348, 0x64, 0x6f, 0x70, 0x2e, 0x66, 0x2e, 0x6d, 0x2e, 0xd801, 0xdc08, 0xd801, 0xdc23, 0x65, 0x6e, 0x6e, 0x65, 0x20, 0x6b,
+0x65, 0x73, 0x6b, 0x70, 0xe4, 0x65, 0x76, 0x61, 0x61, 0x70, 0x2e, 0x76, 0x6f, 0x72, 0x6d, 0x2e, 0x3c0, 0x2e, 0x3bc, 0x2e,
+0xaaa, 0xac2, 0xab0, 0xacd, 0xab5, 0x20, 0xaae, 0xaa7, 0xacd, 0xaaf, 0xabe, 0xab9, 0xacd, 0xaa8, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6,
+0x92a, 0x942, 0x930, 0x94d, 0x935, 0x93e, 0x939, 0x94d, 0x928, 0x64, 0x65, 0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x6d, 0x2e, 0x5348, 0x524d,
+0x61, 0x6d, 0xc624, 0xc804, 0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x70, 0x72,
+0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x440, 0x435, 0x442, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0xd30, 0xd3e, 0xd35,
+0xd3f, 0xd32, 0xd46, 0x51, 0x4e, 0x92a, 0x942, 0x930, 0x94d, 0x935, 0x20, 0x92e, 0x927, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x939, 0x63a,
+0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x20, 0x627, 0x632, 0x20, 0x638, 0x647, 0x631, 0x41, 0x6e, 0x74, 0x65, 0x73, 0x20, 0x64,
+0x6f, 0x20, 0x6d, 0x65, 0x69, 0x6f, 0x2d, 0x64, 0x69, 0x61, 0xa38, 0xa35, 0xa47, 0xa30, 0xa47, 0x4e, 0x44, 0x43f, 0x440, 0x435,
+0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e,
+0x64, 0x6f, 0x70, 0x6f, 0x6c, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x6e, 0x2e, 0x61, 0x73, 0x75, 0x62, 0x75, 0x68, 0x69,
+0x66, 0x6d, 0xc09, 0xe01, 0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b,
+0x1295, 0x1309, 0x1206, 0x20, 0x1230, 0x12d3, 0x1270, 0x434, 0x43f, 0x53, 0x41, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0x66, 0x6f, 0x72, 0x6d,
+0x69, 0x64, 0x64, 0x61, 0x67, 0x41, 0x4e, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x41, 0x2e, 0x4d, 0x2e, 0x128, 0x79, 0x61, 0x6b,
+0x77, 0x61, 0x6b, 0x79, 0x61, 0xa3b8, 0xa111, 0x4d, 0x61, 0x2f, 0x4d, 0x6f, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61,
+0x20, 0x4b, 0x73, 0x75, 0x62, 0x61, 0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69, 0x72, 0x61,
+0x6e, 0x6b, 0x61, 0x6e, 0x67, 0x27, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61,
+0x2d5c, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75, 0x6b, 0x6f,
+0x4b, 0x49, 0x13cc, 0x13be, 0x13b4, 0x4d, 0x75, 0x68, 0x69, 0x54, 0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f,
+0x52, 0x168, 0x42, 0x65, 0x65, 0x74, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e,
+0x79, 0xe1, 0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f, 0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70,
+0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0x41, 0x64, 0x64, 0x75, 0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61,
+0x7a, 0x61, 0x6c, 0x6d, 0x61, 0x6b, 0x65, 0x6f
 };
 
 static const ushort pm_data[] = {
 0x50, 0x4d, 0x57, 0x42, 0x6e, 0x6d, 0x2e, 0x4d, 0x44, 0x12a8, 0x1233, 0x12d3, 0x1275, 0x645, 0x53f, 0x565, 0x2024, 0x985, 0x9aa, 0x9f0,
 0x9be, 0x9b9, 0x9cd, 0x9a3, 0x985, 0x9aa, 0x9b0, 0x9be, 0x9b9, 0x9cd, 0x9a3, 0x441, 0x43b, 0x2e, 0x20, 0x43e, 0x431, 0x2e, 0x43f, 0x430,
 0x441, 0x43b, 0x44f, 0x20, 0x43f, 0x430, 0x43b, 0x443, 0x434, 0x43d, 0x44f, 0x179b, 0x17d2, 0x1784, 0x17b6, 0x1785, 0x70, 0x2e, 0x6d, 0x2e,
-0x4e0b, 0x5348, 0x6f, 0x64, 0x70, 0x2e, 0x65, 0x2e, 0x6d, 0x2e, 0x70, 0xe4, 0x72, 0x61, 0x73, 0x74, 0x20, 0x6b, 0x65, 0x73,
-0x6b, 0x70, 0xe4, 0x65, 0x76, 0x61, 0x69, 0x70, 0x2e, 0x6e, 0x61, 0x63, 0x68, 0x6d, 0x2e, 0x3bc, 0x2e, 0x3bc, 0x2e, 0xa89,
-0xaa4, 0xacd, 0xaa4, 0xab0, 0x20, 0xaae, 0xaa7, 0xacd, 0xaaf, 0xabe, 0xab9, 0xacd, 0xaa8, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x905, 0x92a,
-0x930, 0x93e, 0x939, 0x94d, 0x928, 0x64, 0x75, 0x2e, 0x65, 0x2e, 0x68, 0x2e, 0x70, 0x2e, 0x5348, 0x5f8c, 0x70, 0x6d, 0xc624, 0xd6c4,
-0x70, 0x113, 0x63, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x43e, 0x43f,
-0x43b, 0x430, 0x434, 0x43d, 0x435, 0xd35, 0xd48, 0xd15, 0xd41, 0xd28, 0xd4d, 0xd28, 0xd47, 0xd30, 0xd02, 0x57, 0x4e, 0x909, 0x924, 0x94d,
-0x924, 0x930, 0x20, 0x92e, 0x927, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x939, 0x63a, 0x2e, 0x648, 0x2e, 0x628, 0x639, 0x62f, 0x20, 0x627,
-0x632, 0x20, 0x638, 0x647, 0x631, 0x44, 0x65, 0x70, 0x6f, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6d, 0x65, 0x69, 0x6f, 0x2d,
-0x64, 0x69, 0x61, 0xa38, 0xa3c, 0xa3e, 0xa2e, 0x73, 0x6d, 0x4c, 0x4b, 0x43f, 0x43e, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x6f,
-0x70, 0x6f, 0x64, 0x6e, 0x65, 0xdb4, 0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x6f, 0x6c, 0x75, 0x64, 0x6e, 0xed, 0x70, 0x6f,
-0x70, 0x2e, 0x67, 0x6e, 0x2e, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x72, 0x69, 0x65, 0x6d, 0xc38, 0xc3e, 0xe2b, 0xe25, 0xe31, 0xe07,
-0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x1215, 0x122d, 0x20, 0x1230, 0x12d3,
-0x1275, 0x43f, 0x43f, 0x43, 0x48, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61,
-0x67, 0x45, 0x57, 0x92e, 0x2e, 0x928, 0x902, 0x2e, 0x50, 0x2e, 0x4d, 0x2e, 0x128, 0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0x6e,
-0x61, 0x6d, 0x2e, 0xa06f, 0xa2d2, 0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x6c, 0x75, 0x6d, 0x61, 0x20,
-0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129,
-0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74,
-0x6e, 0x20, 0x74, 0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69, 0x75,
-0x6b, 0x6f, 0x6e, 0x79, 0x69, 0x55, 0x54, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d, 0x55,
-0x55, 0x61, 0x6b, 0x61, 0x73, 0x75, 0x62, 0x61, 0x168, 0x47, 0x4b, 0x65, 0x6d, 0x6f, 0x1c3, 0x75, 0x69, 0x61, 0x73, 0x190,
-0x6e, 0x64, 0xe1, 0x6d, 0xe2, 0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x45,
-0x62, 0x6f, 0x6e, 0x67, 0x69, 0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20,
-0x61, 0x7a, 0x61, 0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f
+0x4e0b, 0x5348, 0x6f, 0x64, 0x70, 0x2e, 0x65, 0x2e, 0x6d, 0x2e, 0xd801, 0xdc11, 0xd801, 0xdc23, 0x70, 0xe4, 0x72, 0x61, 0x73, 0x74,
+0x20, 0x6b, 0x65, 0x73, 0x6b, 0x70, 0xe4, 0x65, 0x76, 0x61, 0x69, 0x70, 0x2e, 0x6e, 0x61, 0x63, 0x68, 0x6d, 0x2e, 0x3bc,
+0x2e, 0x3bc, 0x2e, 0xa89, 0xaa4, 0xacd, 0xaa4, 0xab0, 0x20, 0xaae, 0xaa7, 0xacd, 0xaaf, 0xabe, 0xab9, 0xacd, 0xaa8, 0x5d0, 0x5d7, 0x5d4,
+0x5f4, 0x5e6, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x64, 0x75, 0x2e, 0x65, 0x2e, 0x68, 0x2e, 0x70, 0x2e, 0x5348, 0x5f8c,
+0x70, 0x6d, 0xc624, 0xd6c4, 0x70, 0x113, 0x63, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x70, 0x6f, 0x70, 0x69, 0x65,
+0x74, 0x43f, 0x43e, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0xd35, 0xd48, 0xd15, 0xd41, 0xd28, 0xd4d, 0xd28, 0xd47, 0xd30, 0xd02, 0x57,
+0x4e, 0x909, 0x924, 0x94d, 0x924, 0x930, 0x20, 0x92e, 0x927, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x939, 0x63a, 0x2e, 0x648, 0x2e, 0x628,
+0x639, 0x62f, 0x20, 0x627, 0x632, 0x20, 0x638, 0x647, 0x631, 0x44, 0x65, 0x70, 0x6f, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6d,
+0x65, 0x69, 0x6f, 0x2d, 0x64, 0x69, 0x61, 0xa38, 0xa3c, 0xa3e, 0xa2e, 0x73, 0x6d, 0x4c, 0x4b, 0x43f, 0x43e, 0x43f, 0x43e, 0x434,
+0x43d, 0x435, 0x70, 0x6f, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0xdb4, 0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x6f, 0x6c, 0x75, 0x64,
+0x6e, 0xed, 0x70, 0x6f, 0x70, 0x2e, 0x67, 0x6e, 0x2e, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x72, 0x69, 0x65, 0x6d, 0xc38, 0xc3e,
+0xe2b, 0xe25, 0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x1215,
+0x122d, 0x20, 0x1230, 0x12d3, 0x1275, 0x43f, 0x43f, 0x43, 0x48, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x72, 0x6d,
+0x69, 0x64, 0x64, 0x61, 0x67, 0x45, 0x57, 0x92e, 0x2e, 0x928, 0x902, 0x2e, 0x50, 0x2e, 0x4d, 0x2e, 0x128, 0x79, 0x61, 0x77,
+0x129, 0x6f, 0x6f, 0x6e, 0x61, 0x6d, 0x2e, 0xa06f, 0xa2d2, 0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x6c,
+0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65, 0x48, 0x77, 0x61, 0x129,
+0x2d, 0x69, 0x6e, 0x129, 0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x74, 0x61, 0x64, 0x67,
+0x67, 0x2b7, 0x61, 0x74, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x6e, 0x20, 0x74, 0x6d, 0x65, 0x64, 0x64, 0x69,
+0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69, 0x55, 0x54, 0x13d2,
+0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d, 0x55, 0x55, 0x61, 0x6b, 0x61, 0x73, 0x75, 0x62, 0x61,
+0x168, 0x47, 0x4b, 0x65, 0x6d, 0x6f, 0x1c3, 0x75, 0x69, 0x61, 0x73, 0x190, 0x6e, 0x64, 0xe1, 0x6d, 0xe2, 0x45, 0x69, 0x67,
+0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x45, 0x62, 0x6f, 0x6e, 0x67, 0x69, 0x41, 0x6c, 0x75,
+0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61, 0x6e, 0x79, 0x69, 0x61, 0x67,
+0x68, 0x75, 0x6f
 };
 
 static const ushort currency_symbol_data[] = {
@@ -4323,18 +4446,18 @@ static const ushort currency_symbol_data[] = {
 0x2e, 0x639, 0x2e, 0x200f, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644, 0x2e, 0x644, 0x2e, 0x200f, 0x62f,
 0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639, 0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x644,
 0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0x564,
-0x580, 0x2e, 0x99f, 0x995, 0x9be, 0x6d, 0x61, 0x6e, 0x2e, 0x20ac, 0x9f3, 0x99f, 0x9be, 0x995, 0x9be, 0x4e, 0x75, 0x2e, 0x43b, 0x432,
-0x2e, 0x4b, 0x17db, 0xffe5, 0x24, 0x4d, 0x4f, 0x50, 0x24, 0x53, 0x24, 0x4e, 0x54, 0x24, 0x6b, 0x6e, 0x4b, 0x10d, 0x6b, 0x72,
-0x50, 0x52, 0x73, 0x4d, 0x55, 0x52, 0x73, 0x20a8, 0x20b1, 0xa3, 0x58, 0x41, 0x46, 0x43, 0x46, 0x41, 0x47, 0x4e, 0x46, 0x43,
-0x48, 0x46, 0xab0, 0xac1, 0x47, 0x48, 0x20b5, 0x20a6, 0x20aa, 0x930, 0x941, 0x2e, 0x46, 0x74, 0x52, 0x70, 0x930, 0x941, 0x442, 0x4a3,
-0x433, 0x2e, 0x52, 0x46, 0x441, 0x43e, 0x43c, 0x20a9, 0x53, 0x59, 0xa3, 0x54, 0x4c, 0x20ad, 0x4c, 0x73, 0x46, 0x46, 0x43, 0x46,
-0x41, 0x4c, 0x74, 0x52, 0x4d, 0xd30, 0xd42, 0x4e, 0x5a, 0x24, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0xfdfc,
-0x7a, 0x142, 0x52, 0x24, 0x4d, 0x54, 0x6e, 0xa30, 0xa41, 0x2e, 0x631, 0x52, 0x4f, 0x4e, 0x440, 0x443, 0x431, 0x2e, 0x20b4, 0x41a,
-0x41c, 0x2e, 0x434, 0x438, 0x43d, 0x2e, 0x4b, 0x4d, 0x55, 0x53, 0x24, 0x53, 0x4c, 0x20, 0x52, 0x65, 0x45, 0x53, 0x73, 0x68,
-0x42, 0x73, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x4c, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x20b2, 0x53, 0x2f, 0x2e, 0x42, 0x73, 0x2e,
-0x46, 0x2e, 0x54, 0x53, 0x68, 0xbb0, 0xbc2, 0x53, 0x4c, 0x52, 0x73, 0xc30, 0xc42, 0x2e, 0xe3f, 0x54, 0x24, 0x631, 0x648, 0x67e,
-0x6d2, 0x441, 0x45e, 0x43c, 0x41, 0x66, 0x20ab, 0x783, 0x2e, 0x46, 0x47, 0x4e, 0x6b, 0x72, 0x44, 0x41, 0x55, 0x53, 0x68, 0x5a,
-0x4b, 0x43, 0x56, 0x24
+0x580, 0x2e, 0x99f, 0x995, 0x9be, 0x6d, 0x61, 0x6e, 0x2e, 0x43c, 0x430, 0x43d, 0x2e, 0x20ac, 0x9f3, 0x99f, 0x9be, 0x995, 0x9be, 0x4e,
+0x75, 0x2e, 0x43b, 0x432, 0x2e, 0x4b, 0x17db, 0xffe5, 0x24, 0x4d, 0x4f, 0x50, 0x24, 0x53, 0x24, 0x4e, 0x54, 0x24, 0x6b, 0x6e,
+0x4b, 0x10d, 0x6b, 0x72, 0x50, 0x52, 0x73, 0x4d, 0x55, 0x52, 0x73, 0x20a8, 0x20b1, 0xa3, 0x58, 0x41, 0x46, 0x43, 0x46, 0x41,
+0x47, 0x4e, 0x46, 0x43, 0x48, 0x46, 0xab0, 0xac1, 0x47, 0x48, 0x20b5, 0x20a6, 0x20aa, 0x930, 0x941, 0x2e, 0x46, 0x74, 0x52, 0x70,
+0x930, 0x941, 0x442, 0x4a3, 0x433, 0x2e, 0x52, 0x46, 0x441, 0x43e, 0x43c, 0x20a9, 0x53, 0x59, 0xa3, 0x54, 0x4c, 0x20ad, 0x4c, 0x73,
+0x46, 0x46, 0x43, 0x46, 0x41, 0x4c, 0x74, 0x52, 0x4d, 0xd30, 0xd42, 0x4e, 0x5a, 0x24, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947,
+0x930, 0x942, 0x60b, 0xfdfc, 0x7a, 0x142, 0x52, 0x24, 0x4d, 0x54, 0x6e, 0xa30, 0xa41, 0x2e, 0x631, 0x52, 0x4f, 0x4e, 0x440, 0x443,
+0x431, 0x2e, 0x20b4, 0x41a, 0x41c, 0x2e, 0x434, 0x438, 0x43d, 0x2e, 0x4b, 0x4d, 0x64, 0x69, 0x6e, 0x2e, 0x55, 0x53, 0x24, 0x53,
+0x4c, 0x20, 0x52, 0x65, 0x45, 0x53, 0x73, 0x68, 0x42, 0x73, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x4c, 0x43, 0x24, 0x42, 0x2f,
+0x2e, 0x20b2, 0x53, 0x2f, 0x2e, 0x42, 0x73, 0x2e, 0x46, 0x2e, 0x54, 0x53, 0x68, 0xbb0, 0xbc2, 0x53, 0x4c, 0x52, 0x73, 0xc30,
+0xc42, 0x2e, 0xe3f, 0x54, 0x24, 0x631, 0x648, 0x67e, 0x6d2, 0x441, 0x45e, 0x43c, 0x41, 0x66, 0x73, 0x6f, 0x2bf, 0x6d, 0x20ab, 0x783,
+0x2e, 0x46, 0x47, 0x4e, 0x6b, 0x72, 0x44, 0x41, 0x55, 0x53, 0x68, 0x5a, 0x4b, 0x43, 0x56, 0x24
 };
 
 static const ushort currency_display_name_data[] = {
@@ -4410,308 +4533,318 @@ static const ushort currency_display_name_data[] = {
 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20,
 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63,
 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x130, 0x72, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x61, 0x6c, 0x131,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x130, 0x72, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x61, 0x6c, 0x131, 0x3b, 0x9ac, 0x9be, 0x982,
-0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be,
-0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf51, 0xf44, 0xf74,
-0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x431,
-0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433,
-0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b,
-0x1015, 0x103a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440,
-0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x73, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x65b0, 0x81fa, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x6b,
-0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x65, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
-0x4b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x20, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44,
-0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72,
-0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72,
-0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
-0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73,
-0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x74,
-0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77,
-0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
-0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
-0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70,
-0x65, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b,
-0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4d, 0x61, 0x75,
-0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74,
-0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69,
-0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x73, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
-0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x50, 0x65,
-0x73, 0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x3b,
-0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x69,
-0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69,
-0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x54, 0x72, 0x69,
-0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f,
-0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69,
-0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x65,
-0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
-0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
-0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x45, 0x65, 0x73,
-0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f,
-0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x69, 0x3b, 0x64, 0x6f,
-0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3,
-0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20,
-0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20,
-0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20,
-0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41,
-0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9,
-0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x3b, 0x61, 0x72, 0x69,
-0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79,
-0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73,
-0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69,
-0x73, 0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7,
-0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b,
-0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69,
-0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68,
-0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x395, 0x3c5, 0x3c1, 0x3ce, 0x3b,
-0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x69,
-0x6e, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x75,
-0x257, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54,
-0x61, 0x20, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6d, 0x20, 0x6b, 0x69, 0x6e, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5f4, 0x5d7, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd,
-0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x92f, 0x93e, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xcd, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b,
-0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73,
-0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x75, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68,
-0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72,
-0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x53, 0x76, 0x69, 0x7a, 0x7a,
-0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0xe9, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x74, 0x61, 0x73, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73,
-0x20, 0x6c, 0x69, 0x74, 0x61, 0x73, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74,
-0x61, 0x69, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x69, 0x3b, 0x41c,
-0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67,
-0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28,
-0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28,
-0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20,
-0xd30, 0xd42, 0xd2a, 0x3b, 0x45, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940,
-0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942,
-0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f,
-0x901, 0x92f, 0x93e, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b, 0x6e,
-0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65,
-0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0xb1f, 0xb19, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627,
-0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631,
-0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627,
-0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f,
-0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b,
-0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79,
-0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61,
-0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c,
-0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c,
-0x65, 0x69, 0x72, 0x6f, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x43, 0x45,
-0x41, 0x4f, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0x42, 0x43,
-0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64,
-0x65, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x20, 0x4d,
-0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64,
-0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69,
-0x63, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b,
-0xa30, 0xa41, 0xa2a, 0xa3f, 0xa2f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63,
-0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69,
-0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x6c,
-0x65, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438,
-0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441,
-0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438,
-0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440,
-0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443,
-0x431, 0x43b, 0x44f, 0x3b, 0x41c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432,
-0x43d, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41,
-0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440,
-0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d,
-0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d,
-0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e,
-0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20,
-0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x3b, 0x431,
-0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438,
-0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x430, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440,
-0x430, 0x43a, 0x430, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
-0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438,
-0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x45, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b,
-0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x421, 0x440, 0x43f, 0x441,
-0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d,
-0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440,
-0x43f, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20,
-0x434, 0x438, 0x43d, 0x430, 0x440, 0x438, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63,
-0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c,
-0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68,
-0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69,
-0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b,
-0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65,
-0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f,
-0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x3b,
-0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b,
-0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61,
-0x72, 0x61, 0x6b, 0x61, 0x3b, 0x44, 0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0xdca, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72,
-0x61, 0x3b, 0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
-0x20, 0x73, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x72, 0x61,
-0x6e, 0x20, 0x4a, 0x61, 0x62, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x69, 0x72,
-0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
-0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
-0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x61,
-0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b,
-0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x70,
-0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
-0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d,
-0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61,
-0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61,
-0x6e, 0x6f, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65,
-0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63,
-0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73, 0x74,
-0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69,
-0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75,
-0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65,
-0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65,
-0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b, 0x3b, 0x71,
-0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61,
-0x6c, 0x74, 0x65, 0x63, 0x6f, 0x73, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75,
-0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72,
-0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64,
-0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f,
-0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
-0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f,
-0x62, 0x61, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b,
-0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67,
-0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20, 0x6f, 0x72,
-0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x62,
-0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20,
-0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20,
-0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61,
-0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72,
-0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20,
-0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c,
-0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c, 0x20,
-0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x73, 0x20, 0x73, 0x6f,
-0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72,
-0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79,
-0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73,
-0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66, 0x75, 0x65, 0x72, 0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65,
-0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66, 0x75, 0x65, 0x72,
-0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c,
-0xed, 0x76, 0x61, 0x72, 0x65, 0x73, 0x20, 0x66, 0x75, 0x65, 0x72, 0x74, 0x65, 0x73, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a,
-0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76,
-0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
-0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e,
-0x6f, 0x72, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf,
-0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0xf58,
-0xf7c, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440,
-0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456,
-0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x627, 0x646, 0x688, 0x6cc,
-0x646, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627,
-0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a,
-0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627,
-0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x111, 0x1ed3, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x50, 0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69,
-0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed,
-0x6c, 0x1eb9, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
-0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f,
-0x6e, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61,
-0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6d, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x331, 0x6e, 0x61,
-0x69, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x65, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4e, 0x65, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e,
-0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70,
-0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x65, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77,
-0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63,
-0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x6e, 0x6f,
-0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
-0x69, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x77, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x130, 0x72, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x61, 0x6c, 0x131, 0x3b, 0x43c, 0x430, 0x43d,
+0x430, 0x442, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d,
+0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf51, 0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441,
+0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435,
+0x432, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x3b,
+0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x435,
+0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x52, 0x69, 0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
+0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x81fa, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x6fb3, 0x95e8, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x6b, 0x75,
+0x6e, 0x61, 0x3b, 0x3b, 0x6b, 0x75, 0x6e, 0x65, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4b,
+0x6f, 0x72, 0x75, 0x6e, 0x61, 0x20, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61,
+0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f,
+0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b,
+0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x55,
+0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c,
+0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
+0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73,
+0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61,
+0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x73, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x49,
+0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65,
+0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
+0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4a,
+0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4d, 0x61, 0x75, 0x72,
+0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69,
+0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61,
+0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x73, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x73, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b,
+0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
+0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x50, 0x65, 0x73,
+0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x3b, 0x3b,
+0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x3b, 0x53,
+0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x69, 0x6e,
+0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6e,
+0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68,
+0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68,
+0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75,
+0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x54, 0x72, 0x69, 0x6e,
+0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62,
+0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64,
+0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x73, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x65, 0x72,
+0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x20,
+0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20,
+0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x45, 0x65, 0x73, 0x74,
+0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e,
+0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x65, 0x73, 0x74, 0x69, 0x20, 0x6b, 0x72, 0x6f, 0x6f, 0x6e, 0x69, 0x3b, 0x64, 0x6f, 0x6e,
+0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e,
+0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63,
+0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20, 0x63,
+0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42,
+0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20,
+0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65,
+0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x3b, 0x61, 0x72, 0x69, 0x61,
+0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20,
+0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73, 0x20,
+0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73,
+0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3,
+0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
+0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a,
+0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77,
+0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x395, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b,
+0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x6e,
+0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x75, 0x257,
+0x69, 0x6e, 0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61,
+0x20, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6d, 0x20, 0x6b, 0x69, 0x6e, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x646, 0x64e, 0x64a, 0x652, 0x631, 0x64e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5f4,
+0x5d7, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x92d,
+0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61,
+0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xcd, 0x73,
+0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b,
+0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x75, 0x20, 0x6b,
+0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73,
+0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x46, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x61, 0x74, 0x76, 0x69,
+0x6a, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x6c, 0xe1, 0x6e,
+0x67, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0xe9, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x74,
+0x61, 0x73, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x73, 0x3b, 0x3b,
+0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x69, 0x3b, 0x3b, 0x4c, 0x69, 0x65, 0x74,
+0x75, 0x76, 0x6f, 0x73, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x69, 0x3b, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a,
+0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79,
+0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20,
+0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b,
+0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd28, 0xd4d, 0x200d, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x45, 0x77, 0x72, 0x6f,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f,
+0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b,
+0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x6e, 0x6f, 0x72, 0x73,
+0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f,
+0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b,
+0xb1f, 0xb19, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142,
+0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f,
+0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
+0x69, 0x63, 0x68, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b,
+0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
+0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x73, 0x3b, 0x46, 0x72,
+0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e,
+0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x46,
+0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b,
+0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75,
+0x65, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62,
+0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x64, 0x65,
+0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0xa30, 0xa41, 0xa2a, 0xa3f, 0xa2f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x75,
+0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20,
+0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f,
+0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x6c, 0x65, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65,
+0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443,
+0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b,
+0x44c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b,
+0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x420, 0x43e,
+0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x41c, 0x43e, 0x43b, 0x434,
+0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440,
+0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20,
+0x41c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446,
+0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
+0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445,
+0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438,
+0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d,
+0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440,
+0x442, 0x430, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x431, 0x43e, 0x441, 0x430,
+0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a,
+0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430,
+0x3b, 0x45, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76,
+0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440,
+0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441,
+0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x434, 0x438,
+0x43d, 0x430, 0x440, 0x430, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x438, 0x3b, 0x415,
+0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x435, 0x432, 0x440, 0x430,
+0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65,
+0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e,
+0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65,
+0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62,
+0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f,
+0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73,
+0x6b, 0x6f, 0x2d, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e,
+0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x3b, 0x62,
+0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69,
+0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72,
+0x61, 0x6b, 0x61, 0x3b, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72,
+0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x61, 0x20, 0x64,
+0x69, 0x6e, 0x61, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x61,
+0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x69, 0x3b, 0x44, 0x6f, 0x72, 0x61, 0x20,
+0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xdbd, 0xd82, 0xd9a,
+0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0xdca, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f,
+0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76,
+0x72, 0x6f, 0x76, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62, 0x62, 0x75, 0x75, 0x74, 0x69,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69,
+0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74,
+0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b,
+0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x3b,
+0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f,
+0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
+0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e,
+0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x3b,
+0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73,
+0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f,
+0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20,
+0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e,
+0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f,
+0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73,
+0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73,
+0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72,
+0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c,
+0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b,
+0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65,
+0x6e, 0x73, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65,
+0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x20, 0x67, 0x75, 0x61,
+0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c,
+0x65, 0x73, 0x20, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x74, 0x65, 0x63, 0x6f, 0x73, 0x3b, 0x6c, 0x65, 0x6d,
+0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70,
+0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d,
+0x70, 0x69, 0x72, 0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73,
+0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78,
+0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63,
+0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63,
+0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6f,
+0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63,
+0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20, 0x6f, 0x72, 0x6f, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc,
+0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1,
+0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b,
+0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x73, 0x3b,
+0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x67,
+0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
+0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73,
+0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b,
+0x6e, 0x75, 0x65, 0x76, 0x6f, 0x20, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x6e, 0x75, 0x65, 0x76, 0x6f, 0x73, 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e,
+0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
+0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66,
+0x75, 0x65, 0x72, 0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f,
+0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x66, 0x75, 0x65, 0x72, 0x74, 0x65, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c,
+0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x65, 0x73, 0x20, 0x66, 0x75, 0x65,
+0x72, 0x74, 0x65, 0x73, 0x20, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x73, 0x68, 0x69,
 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65,
-0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65,
-0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x20,
-0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x68,
-0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55,
-0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42,
-0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x13a4, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x3b, 0x13a4, 0x13c3,
-0x13cd, 0x13d7, 0x3b, 0x3b, 0x3b, 0x3b, 0x13e7, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72,
-0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67,
-0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72,
-0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x74,
-0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
-0x6d, 0x69, 0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c,
-0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c,
-0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43,
-0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b
+0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
+0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61,
+0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76,
+0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42,
+0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf62, 0xf92, 0xfb1,
+0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0xf58, 0xf7c, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x54,
+0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x423, 0x43a, 0x440,
+0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432,
+0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433,
+0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x627, 0x646, 0x688, 0x6cc, 0x646, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4f,
+0x2bf, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2bf, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x111, 0x1ed3, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x53, 0x74,
+0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x301, 0xe8, 0x64, 0x65, 0x20,
+0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
+0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b,
+0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x4b, 0x6f, 0x6e,
+0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6d,
+0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x331, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x53, 0x65, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x72, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x65,
+0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46,
+0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72,
+0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72,
+0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x69, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69,
+0x77, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75,
+0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79,
+0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d,
+0x65, 0x6c, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73,
+0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x64, 0x72,
+0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x2d30, 0x2d37,
+0x2d54, 0x2d49, 0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41,
+0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x48, 0x75,
+0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69,
+0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x13a4, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x3b, 0x13a4, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x3b, 0x3b, 0x3b,
+0x13e7, 0x13c3, 0x13cd, 0x13d7, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54,
+0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20,
+0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x20,
+0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79,
+0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49,
+0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65,
+0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
+0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e,
+0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x27, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x27, 0x20,
+0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61,
+0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69,
+0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44,
+0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b
 };
 
 static const ushort currency_format_data[] = {
@@ -4941,7 +5074,7 @@ static const char language_name_list[] =
 ;
 
 static const quint16 language_name_index[] = {
-     0, // Unused
+     0, // AnyLanguage
      8, // C
     10, // Abkhazian
     20, // Afan
@@ -5158,6 +5291,32 @@ static const quint16 language_name_index[] = {
   1694, // Shambala
 };
 
+static const char script_name_list[] =
+"Default\0"
+"Arabic\0"
+"Cyrillic\0"
+"Deseret\0"
+"Gurmukhi\0"
+"Simplified Han\0"
+"Traditional Han\0"
+"Latin\0"
+"Mongolian\0"
+"Tifinagh\0"
+;
+
+static const quint16 script_name_index[] = {
+     0, // AnyScript
+     8, // Arabic
+    15, // Cyrillic
+    24, // Deseret
+    32, // Gurmukhi
+    41, // Simplified Han
+    56, // Traditional Han
+    72, // Latin
+    78, // Mongolian
+    88, // Tifinagh
+};
+
 static const char country_name_list[] =
 "Default\0"
 "Afghanistan\0"
@@ -5659,7 +5818,7 @@ static const quint16 country_name_index[] = {
 };
 
 static const unsigned char language_code_list[] =
-"  \0" // Unused
+"  \0" // AnyLanguage
 "  \0" // C
 "ab\0" // Abkhazian
 "om\0" // Afan
@@ -5876,6 +6035,18 @@ static const unsigned char language_code_list[] =
 "ksb" // Shambala
 ;
 
+static const unsigned char script_code_list[] =
+"\0\0\0\0" // AnyScript
+"Arab" // Arabic
+"Cyrl" // Cyrillic
+"Dsrt" // Deseret
+"Guru" // Gurmukhi
+"Hans" // Simplified Han
+"Hant" // Traditional Han
+"Latn" // Latin
+"Mong" // Mongolian
+"Tfng" // Tifinagh
+;
 static const unsigned char country_code_list[] =
 "  \0" // AnyCountry
 "AF\0" // Afghanistan
-- 
cgit v0.12


From f57305f37b967a761fe922d3ab1a9d530a4408bb Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 2 Mar 2011 19:15:22 +0100
Subject: Compile fix for Windows.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_win.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 10e9ba1..6b49062 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -563,7 +563,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         QLocale::Language lang;
         QLocale::Script script;
         QLocale::Country cntry;
-        getLangAndCountry(locale, lang, script, cntry);
+        QLocalePrivate::getLangAndCountry(locale, lang, script, cntry);
         if (type == LanguageId)
             return lang;
         if (cntry == QLocale::AnyCountry)
-- 
cgit v0.12


From 6380fc16d5127b28804d16b1d1672105f3851605 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 3 Mar 2011 17:42:45 +0100
Subject: Fixed parsing on the locale name in QLocale.

Fixes QLocale autotests on Windows.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index efa1f6c..609bf0c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -280,10 +280,12 @@ static bool parse_locale_tag(const QString &input, int &i, QString *result, cons
     const QChar *uc = input.data() + i;
     const int l = input.length();
     int size = 0;
-    for (; i < l && size < 5; ++i, ++size) {
+    for (; i < l && size < 8; ++i, ++size) {
         if (separators.contains(*uc))
             break;
-        if (uc->unicode() > 0xFF) // latin only
+        if (! ((uc->unicode() >= 'a' && uc->unicode() <= 'z') ||
+               (uc->unicode() >= 'A' && uc->unicode() <= 'Z') ||
+               (uc->unicode() >= '0' && uc->unicode() <= '9')) ) // latin only
             return false;
         *pch++ = *uc++;
     }
@@ -307,6 +309,10 @@ bool splitLocaleName(const QString &name, QString &lang, QString &script, QStrin
         QChar sep = i < length ? name.at(i) : QChar();
         switch (state) {
         case LangState:
+            if (!sep.isNull() && !separators.contains(sep)) {
+                state = NoState;
+                break;
+            }
             lang = value;
             if (i == length) {
                 // just language was specified
-- 
cgit v0.12


From dc2280dbcd27d3ff9cbcb230943cc1036e8a2761 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 4 Mar 2011 10:06:22 +0100
Subject: Fixed spelling in the comment.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 609bf0c..58ac867 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -262,7 +262,7 @@ const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Script scr
             ++d;
         }
     } else {
-        // both script and country are explicitely specified
+        // both script and country are explicitly specified
         while (d->m_language_id == language_id) {
             if (d->m_script_id == script_id && d->m_country_id == country_id)
                 return d;
-- 
cgit v0.12


From 2a21c69a038c6aeee23b249ac70572a92f27ec1a Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 4 Mar 2011 14:52:27 +0100
Subject: Added convenience script enum values to QLocale.

Apparently SimplifiedHan and TraditionalHan are not widely used terms, hence
adding convenience names SimplifiedChineseScript and TraditionalChineseScript.

Also added the missing documentation for the Script enum.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.h           |  3 +++
 src/corelib/tools/qlocale.qdoc        | 27 +++++++++++++++++++++++++--
 util/local_database/qlocalexml2cpp.py |  2 ++
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index d5c41d0..4af6e82 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -372,6 +372,8 @@ public:
         LatinScript = 7,
         MongolianScript = 8,
         TifinaghScript = 9,
+        SimplifiedChineseScript = SimplifiedHanScript,
+        TraditionalChineseScript = TraditionalHanScript,
         LastScript = TifinaghScript
     };
     enum Country {
@@ -734,6 +736,7 @@ public:
     inline bool operator!=(const QLocale &other) const;
 
     static QString languageToString(Language language);
+    static QString languageToString(Language language, Script script);
     static QString countryToString(Country country);
     static QString scriptToString(Script script);
     static void setDefault(const QLocale &locale);
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 4f5e0e5..253edb3 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -118,6 +118,7 @@
 
     This enumerated type is used to specify a language.
 
+    \value AnyLanguage
     \value C The "C" locale is identical in behavior to English/UnitedStates.
     \value Abkhazian
     \value Afan
@@ -340,7 +341,7 @@
     \value Shambala
     \omitvalue LastLanguage
 
-    \sa language()
+    \sa language(), languageToString()
 */
 
 /*!
@@ -598,7 +599,29 @@
     \value LatinAmericaAndTheCaribbean
     \omitvalue LastCountry
 
-    \sa country()
+    \sa country(), countryToString()
+*/
+
+/*!
+    \enum QLocale::Script
+
+    This enumerated type is used to specify a script.
+
+    \value AnyScript
+    \value ArabicScript
+    \value CyrillicScript
+    \value DeseretScript
+    \value GurmukhiScript
+    \value SimplifiedHanScript same as SimplifiedChineseScript
+    \value SimplifiedChineseScript same as SimplifiedHanScript
+    \value TraditionalHanScript same as TraditionalChineseScript
+    \value TraditionalChineseScript same as TraditionalHanScript
+    \value LatinScript
+    \value MongolianScript
+    \value TifinaghScript
+    \omitvalue LastScript
+
+    \sa script(), scriptToString(), languageToString()
 */
 
 /*!
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index b8e4e89..cf1ced6 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -798,6 +798,8 @@ def main():
     for key in script_map.keys():
         script = fixedScriptName(script_map[key][0], dupes)
         qlocaleh_temp_file.write("        " + script + " = " + str(key) + ",\n")
+    qlocaleh_temp_file.write("        SimplifiedChineseScript = SimplifiedHanScript,\n")
+    qlocaleh_temp_file.write("        TraditionalChineseScript = TraditionalHanScript,\n")
     qlocaleh_temp_file.write("        LastScript = " + script + "\n")
     qlocaleh_temp_file.write("    };\n")
 
-- 
cgit v0.12


From 2b12529253add5c6e9095474e2030576176c1f31 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Fri, 4 Mar 2011 15:16:22 +0100
Subject: Extended documentation for QLocale.

Reviewed-by: axis
---
 src/corelib/tools/qlocale.cpp | 37 ++++++++++++++++++++++++++++---------
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 58ac867..5b25c97 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -635,7 +635,7 @@ static quint16 localePrivateIndex(const QLocalePrivate *p)
 
     This constructor is much slower than QLocale(Country, Script, Language).
 
-    \sa name()
+    \sa bcp47Name()
 */
 
 QLocale::QLocale(const QString &name)
@@ -843,13 +843,20 @@ void QLocale::setDefault(const QLocale &locale)
 /*!
     Returns the language of this locale.
 
-    \sa country(), languageToString(), name()
+    \sa script(), country(), languageToString(), bcp47Name()
 */
 QLocale::Language QLocale::language() const
 {
     return Language(d()->languageId());
 }
 
+/*!
+    \since 4.8
+
+    Returns the script of this locale.
+
+    \sa language(), country(), languageToString(), scriptToString(), bcp47Name()
+*/
 QLocale::Script QLocale::script() const
 {
     return Script(d()->m_script_id);
@@ -858,7 +865,7 @@ QLocale::Script QLocale::script() const
 /*!
     Returns the country of this locale.
 
-    \sa language(), countryToString(), name()
+    \sa language(), script(), countryToString(), bcp47Name()
 */
 QLocale::Country QLocale::country() const
 {
@@ -871,11 +878,11 @@ QLocale::Country QLocale::country() const
     language is a lowercase, two-letter ISO 639 language code,
     and country is an uppercase, two- or three-letter ISO 3166 country code.
 
-    Note that even if QLocale object was constructed with a specific script,
-    name() will ignore it for compatibility reasons. Use bcp47Name() instead
+    Note that even if QLocale object was constructed with an explicit script,
+    name() will not contain it for compatibility reasons. Use bcp47Name() instead
     if you need a full locale name.
 
-    \sa QLocale(const QString &), language(), country(), bcp47Name()
+    \sa QLocale(const QString &), language(), script(), country(), bcp47Name()
 */
 
 QString QLocale::name() const
@@ -903,9 +910,13 @@ QString QLocale::name() const
     Returns the dash-separated language, script and country (and possibly other BCP47 fields)
     of this locale as a string.
 
+    Unlike the uiLanguages() the returned value of the bcp47Name() represents
+    the locale name of the QLocale data but not the language the user-interface
+    should be in.
+
     This function tries to conform the locale name to BCP47.
 
-    \sa language(), country(), script()
+    \sa language(), country(), script(), uiLanguages()
 */
 QString QLocale::bcp47Name() const
 {
@@ -3151,8 +3162,16 @@ QString QLocale::toCurrencyString(double value, const QString &symbol) const
 /*!
     \since 4.8
 
-    Returns a sorted list of locale names that could be used for translation
-    of messages presented to the user.
+    Returns an ordered list of locale names for translation purposes in
+    preference order.
+
+    The return value represents locale names that the user expects to see the
+    UI translation in.
+
+    Most like you do not need to use this function directly, but just pass the
+    QLocale object to the QTranslator::load() function.
+
+    The first item in the list is the most preferred one.
 
     \sa QTranslator, bcp47Name()
 */
-- 
cgit v0.12


From e5deaaa6ab843913bdf3ade47611f61f968db130 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 7 Mar 2011 14:18:52 +0100
Subject: Improved QLocale::quoteString.

Whenever the system locale doesn't return the proper alternate quotes
we should try the standard quotes before falling back to the CLDR data.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 5b25c97..4c0b154 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -803,11 +803,10 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
         QVariant res;
-        if (style == QLocale::StandardQuotation)
-            res = systemLocale()->query(QSystemLocale::StringToStandardQuotation, QVariant::fromValue(str));
-        else
+        if (style == QLocale::AlternateQuotation)
             res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation, QVariant::fromValue(str));
-
+        if (res.isNull() || style == QLocale::StandardQuotation)
+            res = systemLocale()->query(QSystemLocale::StringToStandardQuotation, QVariant::fromValue(str));
         if (!res.isNull())
             return res.toString();
     }
-- 
cgit v0.12


From 09fe2cd62df80373e602d47c570ae317a60a5293 Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@nokia.com>
Date: Tue, 8 Mar 2011 17:32:24 +0100
Subject: Using list patterns to get a string from list in QLocale.

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17097
---
 src/corelib/tools/qlocale.cpp          | 39 ++++++++++++++++++++++++++++++++++
 src/corelib/tools/qlocale.h            |  4 +++-
 src/corelib/tools/qlocale_p.h          |  4 ++++
 src/corelib/tools/qlocale_unix.cpp     |  2 ++
 tests/auto/qlocale/tst_qlocale.cpp     | 35 ++++++++++++++++++++++++++++++
 tests/manual/qlocale/miscellaneous.cpp | 11 ++++++++++
 tests/manual/qlocale/miscellaneous.h   |  3 +++
 util/local_database/cldr2qlocalexml.py | 20 +++++++++++++++++
 util/local_database/qlocalexml2cpp.py  | 23 +++++++++++++++++---
 9 files changed, 137 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 58ac867..c3d15d8 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -820,6 +820,45 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
 }
 
 /*!
+    \since 4.8
+
+    Returns a string according to the current locale.
+*/
+QString QLocale::createSeparatedList(const QStringList &strl) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res;
+        res = systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(strl));
+
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+
+    const int size = strl.size();
+    if (size == 1)
+        return strl.at(0);
+    else if (size == 2) {
+        QString format = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_two_idx, d()->m_list_pattern_part_two_size);
+        return format.arg(strl.at(0), strl.at(1));
+    }
+    else if (size > 2) {
+        QString formatStart = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_start_idx, d()->m_list_pattern_part_start_size);
+        QString formatMid = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_mid_idx, d()->m_list_pattern_part_mid_size);
+        QString formatEnd = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_end_idx, d()->m_list_pattern_part_end_size);
+        QString result = formatStart.arg(strl.at(0), strl.at(1));
+        int i;
+        for (i = 2; i < size - 1; ++i)
+            result = formatMid.arg(result, strl.at(i));
+        result = formatEnd.arg(result, strl.at(size - 1));
+        return result;
+    }
+
+    return QString();
+}
+
+/*!
     \nonreentrant
 
     Sets the global default locale to \a locale. These
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index d5c41d0..4cee162 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -113,7 +113,8 @@ public:
         UILanguages, // QStringList
         StringToStandardQuotation, // QString in: QStringRef to quote
         StringToAlternateQuotation, // QString in: QStringRef to quote
-        ScriptId // uint
+        ScriptId, // uint
+        ListToSeparatedString // QString
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -751,6 +752,7 @@ public:
     QString quoteString(const QString &str, QuotationStyle style = StandardQuotation) const;
     QString quoteString(const QStringRef &str, QuotationStyle style = StandardQuotation) const;
 
+    QString createSeparatedList(const QStringList &strl) const;
 //private:                        // this should be private, but can't be
     struct Data {
         quint16 index;
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 1f73982..ab7fde6 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -180,6 +180,10 @@ public:
     quint16 m_quotation_start, m_quotation_end;
     quint16 m_alternate_quotation_start, m_alternate_quotation_end;
 
+    quint16 m_list_pattern_part_start_idx, m_list_pattern_part_start_size;
+    quint16 m_list_pattern_part_mid_idx, m_list_pattern_part_mid_size;
+    quint16 m_list_pattern_part_end_idx, m_list_pattern_part_end_size;
+    quint16 m_list_pattern_part_two_idx, m_list_pattern_part_two_size;
     quint16 m_short_date_format_idx, m_short_date_format_size;
     quint16 m_long_date_format_idx, m_long_date_format_size;
     quint16 m_short_time_format_idx, m_short_time_format_size;
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 3701b2b..117e2e4 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -214,6 +214,8 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
         return lc_messages.quoteString(in.value<QStringRef>());
     case StringToAlternateQuotation:
         return lc_messages.quoteString(in.value<QStringRef>(), QLocale::AlternateQuotation);
+    case ListToSeparatedString:
+        return lc_messages.createSeparatedList(in.value<QStringList>());
     default:
         break;
     }
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index cb69d54..b6c66d5 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -144,6 +144,7 @@ private slots:
     void quoteString();
     void uiLanguages();
     void weekendDays();
+    void listPatterns();
 
 private:
     QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
@@ -2236,5 +2237,39 @@ void tst_QLocale::weekendDays()
     QCOMPARE(c.weekendEnd(), Qt::Sunday);
 }
 
+void tst_QLocale::listPatterns()
+{
+    QStringList sl1;
+    QStringList sl2;
+    sl2 << "aaa";
+    QStringList sl3;
+    sl3 << "aaa" << "bbb";
+    QStringList sl4;
+    sl4 << "aaa" << "bbb" << "ccc";
+    QStringList sl5;
+    sl5 << "aaa" << "bbb" << "ccc" << "ddd";
+
+    const QLocale c(QLocale::C);
+    QCOMPARE(c.createSeparatedList(sl1), QString(""));
+    QCOMPARE(c.createSeparatedList(sl2), QString("aaa"));
+    QCOMPARE(c.createSeparatedList(sl3), QString("aaa, bbb"));
+    QCOMPARE(c.createSeparatedList(sl4), QString("aaa, bbb, ccc"));
+    QCOMPARE(c.createSeparatedList(sl5), QString("aaa, bbb, ccc, ddd"));
+
+    const QLocale en_US("en_US");
+    QCOMPARE(en_US.createSeparatedList(sl1), QString(""));
+    QCOMPARE(en_US.createSeparatedList(sl2), QString("aaa"));
+    QCOMPARE(en_US.createSeparatedList(sl3), QString("aaa and bbb"));
+    QCOMPARE(en_US.createSeparatedList(sl4), QString("aaa, bbb, and ccc"));
+    QCOMPARE(en_US.createSeparatedList(sl5), QString("aaa, bbb, ccc, and ddd"));
+
+    const QLocale zh_CN("zh_CN");
+    QCOMPARE(zh_CN.createSeparatedList(sl1), QString(""));
+    QCOMPARE(zh_CN.createSeparatedList(sl2), QString("aaa"));
+    QCOMPARE(zh_CN.createSeparatedList(sl3), QString::fromUtf8("aaa" "\xe5\x92\x8c" "bbb"));
+    QCOMPARE(zh_CN.createSeparatedList(sl4), QString::fromUtf8("aaa" "\xe3\x80\x81" "bbb" "\xe5\x92\x8c" "ccc"));
+    QCOMPARE(zh_CN.createSeparatedList(sl5), QString::fromUtf8("aaa" "\xe3\x80\x81" "bbb" "\xe3\x80\x81" "ccc" "\xe5\x92\x8c" "ddd"));
+}
+
 QTEST_APPLESS_MAIN(tst_QLocale)
 #include "tst_qlocale.moc"
diff --git a/tests/manual/qlocale/miscellaneous.cpp b/tests/manual/qlocale/miscellaneous.cpp
index 0b2250a..a9694bf 100644
--- a/tests/manual/qlocale/miscellaneous.cpp
+++ b/tests/manual/qlocale/miscellaneous.cpp
@@ -49,6 +49,7 @@ MiscWidget::MiscWidget()
     createLineEdit("Alternate quotes:", &alternateQuotedTextLabel, &alternateQuotedText);
     textToQuote->setText("some text");
     createLineEdit("Text direction:", &textDirectionLabel, &textDirection);
+    createLineEdit("List to seperated string:", &listToSeparatedStringLabel, &listToSeparatedStringText);
 
     l->addWidget(textToQuoteLabel, 0, 0);
     l->addWidget(textToQuote, 0, 1);
@@ -58,6 +59,8 @@ MiscWidget::MiscWidget()
     l->addWidget(alternateQuotedText, 1, 3);
     l->addWidget(textDirectionLabel, 2, 0);
     l->addWidget(textDirection, 2, 1, 1, 3);
+    l->addWidget(listToSeparatedStringLabel, 3, 0);
+    l->addWidget(listToSeparatedStringText, 3, 1, 1, 3);
 
     connect(textToQuote, SIGNAL(textChanged(QString)), this, SLOT(updateQuotedText(QString)));
 
@@ -72,10 +75,18 @@ void MiscWidget::updateQuotedText(QString str)
     alternateQuotedText->setText(locale().quoteString(str, QLocale::AlternateQuotation));
 }
 
+void MiscWidget::updateListToSeparatedStringText()
+{
+    QStringList test;
+    test << "aaa" << "bbb" << "ccc" << "ddd";
+    listToSeparatedStringText->setText(locale().createSeparatedList(test));
+}
+
 void MiscWidget::localeChanged(QLocale locale)
 {
     setLocale(locale);
     updateQuotedText(textToQuote->text());
+    updateListToSeparatedStringText();
     textDirection->setText(locale.textDirection() == Qt::LeftToRight ? "Left To Right" : "Right To Left");
 }
 
diff --git a/tests/manual/qlocale/miscellaneous.h b/tests/manual/qlocale/miscellaneous.h
index 33d8ef9..3b635b8 100644
--- a/tests/manual/qlocale/miscellaneous.h
+++ b/tests/manual/qlocale/miscellaneous.h
@@ -56,14 +56,17 @@ private:
     QLabel *standardQuotedTextLabel;
     QLabel *alternateQuotedTextLabel;
     QLabel *textDirectionLabel;
+    QLabel *listToSeparatedStringLabel;
     QLineEdit *textToQuote;
     QLineEdit *standardQuotedText;
     QLineEdit *alternateQuotedText;
     QLineEdit *textDirection;
+    QLineEdit *listToSeparatedStringText;
 
 private slots:
     void localeChanged(QLocale locale);
     void updateQuotedText(QString str);
+    void updateListToSeparatedStringText();
 };
 
 #endif // MISCELLANEOUS_H
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index fb0e5db..a67971b 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -82,6 +82,14 @@ def parse_number_format(patterns, data):
         result.append(pattern)
     return result
 
+def parse_list_pattern_part_format(pattern):
+    # this is a very limited parsing of the format for list pattern part only.
+    result = ""
+    result = pattern.replace("{0}", "%1")
+    result = result.replace("{1}", "%2")
+    result = result.replace("{2}", "%3")
+    return result
+
 def ordStr(c):
     if len(c) == 1:
         return str(ord(c))
@@ -215,6 +223,10 @@ def generateLocaleInfo(path):
     result['quotationEnd'] = findEntry(path, "delimiters/quotationEnd")
     result['alternateQuotationStart'] = findEntry(path, "delimiters/alternateQuotationStart")
     result['alternateQuotationEnd'] = findEntry(path, "delimiters/alternateQuotationEnd")
+    result['listPatternPartStart'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[start]"))
+    result['listPatternPartMiddle'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[middle]"))
+    result['listPatternPartEnd'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[end]"))
+    result['listPatternPartTwo'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[2]"))
     result['am'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[am]", draft)
     result['pm'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[pm]", draft)
     result['longDateFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[full]/dateFormat/pattern"))
@@ -689,6 +701,10 @@ print \
             <quotationEnd>\"</quotationEnd>\n\
             <alternateQuotationStart>\'</alternateQuotationStart>\n\
             <alternateQuotationEnd>\'</alternateQuotationEnd>\n\
+            <listPatternPartStart>%1, %2</listPatternPartStart>\n\
+            <listPatternPartMiddle>%1, %2</listPatternPartMiddle>\n\
+            <listPatternPartEnd>%1, %2</listPatternPartEnd>\n\
+            <listPatternPartTwo>%1, %2</listPatternPartTwo>\n\
             <am>AM</am>\n\
             <pm>PM</pm>\n\
             <firstDayOfWeek>mon</firstDayOfWeek>\n\
@@ -741,6 +757,10 @@ for key in locale_keys:
     print "            <quotationEnd>" + l['quotationEnd'].encode('utf-8')   + "</quotationEnd>"
     print "            <alternateQuotationStart>" + l['alternateQuotationStart'].encode('utf-8') + "</alternateQuotationStart>"
     print "            <alternateQuotationEnd>" + l['alternateQuotationEnd'].encode('utf-8')   + "</alternateQuotationEnd>"
+    print "            <listPatternPartStart>" + l['listPatternPartStart'].encode('utf-8')   + "</listPatternPartStart>"
+    print "            <listPatternPartMiddle>" + l['listPatternPartMiddle'].encode('utf-8')   + "</listPatternPartMiddle>"
+    print "            <listPatternPartEnd>" + l['listPatternPartEnd'].encode('utf-8')   + "</listPatternPartEnd>"
+    print "            <listPatternPartTwo>" + l['listPatternPartTwo'].encode('utf-8')   + "</listPatternPartTwo>"
     print "            <am>"       + l['am'].encode('utf-8') + "</am>"
     print "            <pm>"       + l['pm'].encode('utf-8') + "</pm>"
     print "            <firstDayOfWeek>"  + l['firstDayOfWeek'].encode('utf-8') + "</firstDayOfWeek>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index b8e4e89..e646999 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -251,6 +251,10 @@ class Locale:
         self.quotationEnd = ord(assertSingleChar(eltText(firstChildElt(elt, "quotationEnd"))))
         self.alternateQuotationStart = ord(assertSingleChar(eltText(firstChildElt(elt, "alternateQuotationStart"))))
         self.alternateQuotationEnd = ord(assertSingleChar(eltText(firstChildElt(elt, "alternateQuotationEnd"))))
+        self.listPatternPartStart = eltText(firstChildElt(elt, "listPatternPartStart"))
+        self.listPatternPartMiddle = eltText(firstChildElt(elt, "listPatternPartMiddle"))
+        self.listPatternPartEnd = eltText(firstChildElt(elt, "listPatternPartEnd"))
+        self.listPatternPartTwo = eltText(firstChildElt(elt, "listPatternPartTwo"))
         self.am = eltText(firstChildElt(elt, "am"))
         self.pm = eltText(firstChildElt(elt, "pm"))
         self.firstDayOfWeek = convertToQtDayOfWeek(eltText(firstChildElt(elt, "firstDayOfWeek")))
@@ -494,6 +498,7 @@ def main():
 
     data_temp_file.write("\n")
 
+    list_pattern_part_data = StringData()
     date_format_data = StringData()
     time_format_data = StringData()
     months_data = StringData()
@@ -507,7 +512,7 @@ def main():
 
     # Locale data
     data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
-    data_temp_file.write("//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
+    data_temp_file.write("//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len\n")
 
     locale_keys = locale_map.keys()
     compareLocaleKeys.default_map = default_map
@@ -516,7 +521,7 @@ def main():
 
     for key in locale_keys:
         l = locale_map[key]
-        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s/%s\n" \
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s/%s\n" \
                     % (key[0], key[1], key[2],
                         l.decimal,
                         l.group,
@@ -530,6 +535,10 @@ def main():
                         l.quotationEnd,
                         l.alternateQuotationStart,
                         l.alternateQuotationEnd,
+                        list_pattern_part_data.append(l.listPatternPartStart),
+                        list_pattern_part_data.append(l.listPatternPartMiddle),
+                        list_pattern_part_data.append(l.listPatternPartEnd),
+                        list_pattern_part_data.append(l.listPatternPartTwo),
                         date_format_data.append(l.shortDateFormat),
                         date_format_data.append(l.longDateFormat),
                         time_format_data.append(l.shortTimeFormat),
@@ -561,11 +570,19 @@ def main():
                         l.language,
                         l.script,
                         l.country))
-    data_temp_file.write("    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
     data_temp_file.write("};\n")
 
     data_temp_file.write("\n")
 
+    # List patterns data
+    #check_static_char_array_length("list_pattern_part", list_pattern_part_data.data)
+    data_temp_file.write("static const ushort list_pattern_part_data[] = {\n")
+    data_temp_file.write(wrap_list(list_pattern_part_data.data))
+    data_temp_file.write("\n};\n")
+
+    data_temp_file.write("\n")
+
     # Date format data
     #check_static_char_array_length("date_format", date_format_data.data)
     data_temp_file.write("static const ushort date_format_data[] = {\n")
-- 
cgit v0.12


From a70f9f5908f2db187e6818103d9599e1e45c130d Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@nokia.com>
Date: Tue, 8 Mar 2011 17:35:45 +0100
Subject: Updated CLDR data for QLocale.

This is a temporary commit and meant to be removed before merging the branch
into Qt as we don't want to bloat the repository size by updating CLDR every
time we make a small change to QLocale, but do that only once when we are done.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 765 +++++++++++++++++++------------------
 1 file changed, 394 insertions(+), 371 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index a13255d..fadc72e 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -75,7 +75,7 @@ static const int ImperialMeasurementSystemsCount =
 // GENERATED PART STARTS HERE
 
 /*
-    This part of the file was generated on 2011-03-02 from the
+    This part of the file was generated on 2011-03-08 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -305,376 +305,399 @@ static const quint16 locale_index[] = {
 };
 
 static const QLocalePrivate locale_data[] = {
-//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyScript/AnyCountry
-    {      3,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Ethiopia
-    {      3,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Kenya
-    {      4,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/AnyScript/Djibouti
-    {      4,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Eritrea
-    {      4,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Ethiopia
-    {      5,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/SouthAfrica
-    {      5,     0,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/Namibia
-    {      6,     0,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/AnyScript/Albania
-    {      7,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/AnyScript/Ethiopia
-    {      8,     0,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/SaudiArabia
-    {      8,     0,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/Algeria
-    {      8,     0,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Bahrain
-    {      8,     0,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Egypt
-    {      8,     0,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/AnyScript/Iraq
-    {      8,     0,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Jordan
-    {      8,     0,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Kuwait
-    {      8,     0,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/AnyScript/Lebanon
-    {      8,     0,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/LibyanArabJamahiriya
-    {      8,     0,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Morocco
-    {      8,     0,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/AnyScript/Oman
-    {      8,     0,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Qatar
-    {      8,     0,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Sudan
-    {      8,     0,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/AnyScript/SyrianArabRepublic
-    {      8,     0,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Tunisia
-    {      8,     0,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/AnyScript/UnitedArabEmirates
-    {      8,     0,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/AnyScript/Yemen
-    {      9,     0,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/AnyScript/Armenia
-    {     10,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/AnyScript/India
-    {     12,     0,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/AnyScript/Azerbaijan
-    {     12,     0,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/AnyScript/Iran
-    {     12,     1,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Arabic/Iran
-    {     12,     2,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1785,77 , 1483,27 , 1660,48 , 1785,77 , 134,27 , 907,26 , 1000,67 , 99,14 , 907,26 , 1000,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  109,4 , 1457,29 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Cyrillic/Azerbaijan
-    {     12,     7,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Latin/Azerbaijan
-    {     14,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 248,31 , 37,5 , 8,10 , 1862,48 , 1910,93 , 2003,24 , 1862,48 , 1910,93 , 2003,24 , 1067,21 , 1088,68 , 798,14 , 1067,21 , 1088,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/AnyScript/Spain
-    {     15,     0,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {66,68,84},  114,1 , 1486,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/AnyScript/Bangladesh
-    {     15,     0,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {73,78,82},  115,4 , 1507,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/AnyScript/India
-    {     16,     0,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 72,10 , 285,29 , 93,22 , 115,35 , 2150,75 , 2225,205 , 1483,27 , 2150,75 , 2225,205 , 134,27 , 1269,34 , 1303,79 , 798,14 , 1269,34 , 1303,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  119,3 , 1526,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/AnyScript/Bhutan
-    {     19,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/AnyScript/France
-    {     20,     0,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 332,8 , 340,18 , 37,5 , 8,10 , 2430,59 , 2489,82 , 2571,24 , 2430,59 , 2489,82 , 2571,24 , 1382,21 , 1403,55 , 1458,14 , 1382,21 , 1403,55 , 1458,14 , 34,7 , 31,7 , {66,71,78},  122,3 , 1553,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/AnyScript/Bulgaria
-    {     21,     0,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 2595,43 , 2638,88 , 2726,24 , 2595,43 , 2638,88 , 2726,24 , 1472,25 , 1497,54 , 1551,14 , 1472,25 , 1497,54 , 1551,14 , 0,2 , 0,2 , {77,77,75},  125,1 , 1600,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/AnyScript/Myanmar
-    {     22,     0,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 358,6 , 10,17 , 150,5 , 155,10 , 2750,48 , 2798,99 , 2897,24 , 2750,48 , 2798,95 , 2893,24 , 1565,21 , 1586,56 , 1642,14 , 1565,21 , 1586,56 , 1642,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1618,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/AnyScript/Belarus
-    {     23,     0,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 372,30 , 165,4 , 169,26 , 2921,27 , 2948,71 , 1483,27 , 2917,27 , 2944,71 , 134,27 , 1656,19 , 1675,76 , 798,14 , 1656,19 , 1675,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  126,1 , 1641,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/AnyScript/Cambodia
-    {     24,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 402,21 , 165,4 , 195,9 , 3019,60 , 3079,82 , 3161,24 , 3015,93 , 3108,115 , 3223,24 , 1751,21 , 1772,60 , 1832,14 , 1846,28 , 1874,60 , 1934,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/AnyScript/Spain
-    {     25,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/China
-    {     25,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/HongKong
-    {     25,     0,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Macau
-    {     25,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Singapore
-    {     25,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Taiwan
-    {     25,     5,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/China
-    {     25,     5,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/HongKong
-    {     25,     5,   126,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1722,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Macau
-    {     25,     5,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Singapore
-    {     25,     6,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/HongKong
-    {     25,     6,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Macau
-    {     25,     6,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Taiwan
-    {     27,     0,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 470,13 , 483,19 , 37,5 , 8,10 , 3262,49 , 3311,94 , 3405,39 , 3286,49 , 3335,98 , 3433,39 , 2032,28 , 2060,58 , 2118,14 , 2032,28 , 2060,58 , 2118,14 , 0,2 , 0,2 , {72,82,75},  138,2 , 1732,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/AnyScript/Croatia
-    {     28,     0,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 358,6 , 502,18 , 165,4 , 195,9 , 3405,39 , 3444,82 , 3526,24 , 134,27 , 3472,84 , 3556,24 , 2132,21 , 2153,49 , 2202,14 , 2132,21 , 2153,49 , 2202,14 , 62,4 , 62,4 , {67,90,75},  140,2 , 1759,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/AnyScript/CzechRepublic
-    {     29,     0,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 27,8 , 520,23 , 150,5 , 155,10 , 3550,48 , 3598,84 , 134,24 , 3580,59 , 3639,84 , 320,24 , 2216,28 , 2244,51 , 2295,14 , 2216,28 , 2244,51 , 2295,14 , 66,4 , 66,4 , {68,75,75},  142,2 , 1778,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/AnyScript/Denmark
-    {     30,     0,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Netherlands
-    {     30,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Belgium
-    {     31,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStates
-    {     31,     0,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/AmericanSamoa
-    {     31,     0,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  128,1 , 1874,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Australia
-    {     31,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belgium
-    {     31,     0,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  128,1 , 1953,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belize
-    {     31,     0,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  144,1 , 2000,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Botswana
-    {     31,     0,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2050,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Canada
-    {     31,     0,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Guam
-    {     31,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  128,1 , 2103,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/HongKong
-    {     31,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 2159,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/AnyScript/India
-    {     31,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Ireland
-    {     31,     0,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  128,1 , 2203,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Jamaica
-    {     31,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Malta
-    {     31,     0,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/MarshallIslands
-    {     31,     0,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 2256,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/AnyScript/Mauritius
-    {     31,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  128,1 , 2309,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Namibia
-    {     31,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  128,1 , 2362,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NewZealand
-    {     31,     0,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NorthernMarianaIslands
-    {     31,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  151,1 , 2424,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/AnyScript/Pakistan
-    {     31,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 2477,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Philippines
-    {     31,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  128,1 , 2519,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Singapore
-    {     31,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2575,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/SouthAfrica
-    {     31,     0,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  128,1 , 2636,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/TrinidadAndTobago
-    {     31,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 2722,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/UnitedKingdom
-    {     31,     0,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStatesMinorOutlyingIslands
-    {     31,     0,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/USVirginIslands
-    {     31,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Zimbabwe
-    {     31,     3,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 3818,80 , 3898,154 , 4052,36 , 3870,80 , 3950,154 , 4104,36 , 2403,49 , 2452,85 , 2537,21 , 2403,49 , 2452,85 , 2537,21 , 70,4 , 70,4 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Deseret/UnitedStates
-    {     33,     0,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 332,8 , 502,18 , 165,4 , 263,9 , 4088,59 , 4147,91 , 4238,24 , 4140,59 , 4199,91 , 4290,24 , 2558,14 , 2572,63 , 2558,14 , 2558,14 , 2572,63 , 2558,14 , 74,14 , 74,16 , {69,69,75},  142,2 , 2796,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/AnyScript/Estonia
-    {     34,     0,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 543,8 , 82,17 , 37,5 , 8,10 , 4262,48 , 4310,83 , 134,24 , 4314,48 , 4362,83 , 320,24 , 2635,28 , 2663,74 , 2737,14 , 2635,28 , 2663,74 , 2737,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 2837,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/AnyScript/FaroeIslands
-    {     36,     0,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 586,8 , 594,17 , 272,4 , 276,9 , 4393,69 , 4462,105 , 4567,24 , 4445,129 , 4445,129 , 4574,24 , 2751,21 , 2772,67 , 2839,14 , 2751,21 , 2853,81 , 2839,14 , 88,3 , 90,3 , {69,85,82},  113,1 , 2879,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/AnyScript/Finland
-    {     37,     0,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/France
-    {     37,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 551,7 , 99,16 , 37,5 , 285,23 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Belgium
-    {     37,     0,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Cameroon
-    {     37,     0,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 115,8 , 99,16 , 37,5 , 239,24 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2955,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/AnyScript/Canada
-    {     37,     0,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/CentralAfricanRepublic
-    {     37,     0,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/IvoryCoast
-    {     37,     0,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Guadeloupe
-    {     37,     0,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {71,78,70},  160,3 , 3068,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Guinea
-    {     37,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Luxembourg
-    {     37,     0,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3116,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Madagascar
-    {     37,     0,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Mali
-    {     37,     0,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Martinique
-    {     37,     0,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Monaco
-    {     37,     0,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Niger
-    {     37,     0,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Reunion
-    {     37,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Senegal
-    {     37,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,72,70},  163,3 , 3170,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/AnyScript/Switzerland
-    {     37,     0,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Barthelemy
-    {     37,     0,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Martin
-    {     40,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 4739,48 , 4787,87 , 4874,24 , 4746,48 , 4794,87 , 4881,24 , 3035,28 , 3063,49 , 3112,14 , 3035,28 , 3063,49 , 3112,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/AnyScript/Spain
-    {     41,     0,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 4898,48 , 4946,99 , 5045,24 , 4905,48 , 4953,99 , 5052,24 , 3126,28 , 3154,62 , 3216,14 , 3126,28 , 3154,62 , 3216,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3215,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/AnyScript/Georgia
-    {     42,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Germany
-    {     42,     0,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 611,19 , 37,5 , 8,10 , 5069,52 , 5204,83 , 134,24 , 5207,48 , 5255,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Austria
-    {     42,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 551,7 , 99,16 , 37,5 , 239,24 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3353,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Belgium
-    {     42,     0,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Liechtenstein
-    {     42,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Luxembourg
-    {     42,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Switzerland
-    {     43,     0,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Greece
-    {     43,     0,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Cyprus
-    {     44,     0,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 72,10 , 82,17 , 18,7 , 25,12 , 3550,48 , 5476,96 , 134,24 , 5527,48 , 5575,96 , 320,24 , 3478,28 , 3506,98 , 3604,14 , 3478,28 , 3506,98 , 3604,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 3313,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/AnyScript/Greenland
-    {     46,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 630,7 , 203,18 , 322,8 , 330,13 , 5572,67 , 5639,87 , 5726,31 , 5671,67 , 5738,87 , 5825,31 , 3618,32 , 3650,53 , 3703,19 , 3618,32 , 3650,53 , 3703,19 , 100,14 , 103,14 , {73,78,82},  166,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/AnyScript/India
-    {     47,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Ghana
-    {     47,     0,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/AnyScript/Niger
-    {     47,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Nigeria
-    {     47,     0,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/AnyScript/Sudan
-    {     47,     1,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3405,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Arabic/Nigeria
-    {     47,     1,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Arabic/Sudan
-    {     47,     7,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Ghana
-    {     47,     7,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Latin/Niger
-    {     47,     7,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Nigeria
-    {     48,     0,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 27,8 , 637,18 , 37,5 , 8,10 , 6068,58 , 6126,72 , 1483,27 , 6167,48 , 6215,72 , 134,27 , 3897,46 , 3943,65 , 4008,14 , 3897,46 , 3943,65 , 4008,14 , 114,6 , 117,5 , {73,76,83},  172,1 , 3418,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/AnyScript/Israel
-    {     49,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 10,17 , 18,7 , 25,12 , 6198,75 , 6198,75 , 6273,30 , 6287,75 , 6287,75 , 6362,30 , 4022,38 , 4060,57 , 4117,19 , 4022,38 , 4060,57 , 4117,19 , 120,9 , 122,7 , {73,78,82},  173,3 , 3439,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/AnyScript/India
-    {     50,     0,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 661,11 , 672,19 , 165,4 , 195,9 , 6303,64 , 6367,98 , 6465,25 , 6392,64 , 6456,98 , 6554,25 , 4136,19 , 4155,52 , 4207,17 , 4136,19 , 4155,52 , 4207,17 , 129,3 , 129,3 , {72,85,70},  176,2 , 3458,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/AnyScript/Hungary
-    {     51,     0,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 586,8 , 502,18 , 37,5 , 8,10 , 6490,48 , 6538,82 , 6620,24 , 6579,48 , 6627,82 , 6709,24 , 4224,28 , 4252,81 , 4333,14 , 4224,28 , 4252,81 , 4347,14 , 132,4 , 132,4 , {73,83,75},  142,2 , 3478,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/AnyScript/Iceland
-    {     52,     0,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 123,18 , 150,5 , 276,9 , 6644,48 , 6692,87 , 134,24 , 6733,48 , 6781,87 , 320,24 , 4361,28 , 4389,43 , 4432,14 , 4361,28 , 4389,43 , 4432,14 , 0,2 , 0,2 , {73,68,82},  178,2 , 3526,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/AnyScript/Indonesia
-    {     57,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 6779,62 , 6841,107 , 6948,24 , 6868,62 , 6930,107 , 7037,24 , 4446,37 , 4483,75 , 4558,14 , 4446,37 , 4483,75 , 4558,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 3549,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/AnyScript/Ireland
-    {     58,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 99,16 , 37,5 , 8,10 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/AnyScript/Italy
-    {     58,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 332,8 , 10,17 , 37,5 , 308,14 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {67,72,70},  0,0 , 3560,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/AnyScript/Switzerland
-    {     59,     0,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 221,8 , 429,13 , 165,4 , 343,10 , 3223,39 , 3223,39 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 4728,14 , 4742,28 , 4728,14 , 4728,14 , 4742,28 , 4728,14 , 138,2 , 138,2 , {74,80,89},  127,1 , 3582,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/AnyScript/Japan
-    {     61,     0,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 322,8 , 330,13 , 7138,86 , 7138,86 , 7224,31 , 7227,86 , 7227,86 , 7313,31 , 4770,28 , 4798,53 , 4851,19 , 4770,28 , 4798,53 , 4851,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/AnyScript/India
-    {     63,     0,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/AnyScript/Kazakhstan
-    {     63,     2,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Cyrillic/Kazakhstan
-    {     64,     0,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 221,8 , 314,18 , 37,5 , 8,10 , 7399,60 , 7459,101 , 1483,27 , 7488,60 , 7548,101 , 134,27 , 4952,35 , 4987,84 , 798,14 , 4952,35 , 4987,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  186,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/AnyScript/Rwanda
-    {     65,     0,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  188,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/AnyScript/Kyrgyzstan
-    {     66,     0,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 713,9 , 722,16 , 353,7 , 360,13 , 7560,39 , 7560,39 , 7560,39 , 7649,39 , 7649,39 , 7649,39 , 5071,14 , 5085,28 , 5071,14 , 5071,14 , 5085,28 , 5071,14 , 142,2 , 142,2 , {75,82,87},  191,1 , 3592,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/AnyScript/RepublicOfKorea
-    {     67,     0,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/AnyScript/Iran
-    {     67,     0,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/AnyScript/Iraq
-    {     67,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/AnyScript/SyrianArabRepublic
-    {     67,     0,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/AnyScript/Turkey
-    {     67,     1,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Arabic/Iran
-    {     67,     1,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Arabic/Iraq
-    {     67,     7,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/Latin/SyrianArabRepublic
-    {     67,     7,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Latin/Turkey
-    {     69,     0,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 364,8 , 738,18 , 165,4 , 373,21 , 7718,63 , 7781,75 , 1483,27 , 7807,63 , 7870,75 , 134,27 , 5242,24 , 5266,57 , 798,14 , 5242,24 , 5266,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  197,1 , 3605,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/AnyScript/Lao
-    {     71,     0,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 756,26 , 37,5 , 8,10 , 7856,65 , 7921,101 , 134,24 , 7945,65 , 8010,101 , 320,24 , 5323,21 , 5344,72 , 5416,14 , 5323,21 , 5344,72 , 5416,14 , 144,14 , 144,11 , {76,86,76},  198,2 , 3615,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/AnyScript/Latvia
-    {     72,     0,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  200,1 , 3635,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/AnyScript/DemocraticRepublicOfCongo
-    {     72,     0,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  201,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/AnyScript/PeoplesRepublicOfCongo
-    {     73,     0,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 72,10 , 782,26 , 37,5 , 8,10 , 8264,69 , 8333,96 , 8429,24 , 8353,48 , 8401,96 , 8497,24 , 5551,17 , 5568,89 , 5657,14 , 5671,21 , 5568,89 , 5657,14 , 158,9 , 155,6 , {76,84,76},  205,2 , 3657,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/AnyScript/Lithuania
-    {     74,     0,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 808,7 , 123,18 , 37,5 , 8,10 , 8453,63 , 8516,85 , 8601,24 , 8521,63 , 8584,85 , 8669,24 , 5692,34 , 5726,54 , 1458,14 , 5692,34 , 5726,54 , 1458,14 , 167,10 , 161,8 , {77,75,68},  0,0 , 3711,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/AnyScript/Macedonia
-    {     75,     0,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 8625,48 , 8673,92 , 134,24 , 8693,48 , 8741,92 , 320,24 , 5780,34 , 5814,60 , 5874,14 , 5780,34 , 5814,60 , 5874,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3734,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/AnyScript/Madagascar
-    {     76,     0,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 815,16 , 394,4 , 25,12 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  207,2 , 3747,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/Malaysia
-    {     76,     0,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 564,12 , 165,4 , 398,14 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/BruneiDarussalam
-    {     77,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 831,18 , 18,7 , 25,12 , 8896,66 , 8962,101 , 9063,31 , 8964,66 , 9030,101 , 9131,31 , 5959,47 , 6006,70 , 6076,22 , 5959,47 , 6006,70 , 6076,22 , 177,6 , 169,10 , {73,78,82},  209,2 , 3770,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/AnyScript/India
-    {     78,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 849,23 , 37,5 , 8,10 , 9094,48 , 9142,86 , 9228,24 , 9162,48 , 9210,86 , 9296,24 , 6098,28 , 6126,63 , 6189,14 , 6098,28 , 6126,63 , 6189,14 , 183,2 , 179,2 , {69,85,82},  113,1 , 3816,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/AnyScript/Malta
-    {     79,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9252,83 , 9252,83 , 1483,27 , 9320,83 , 9320,83 , 134,27 , 6203,48 , 6203,48 , 798,14 , 6203,48 , 6203,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/AnyScript/NewZealand
-    {     80,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 655,6 , 99,16 , 412,7 , 419,12 , 9335,86 , 9335,86 , 9421,32 , 9403,86 , 9403,86 , 9489,32 , 6251,32 , 6283,53 , 4117,19 , 6251,32 , 6283,53 , 4117,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/AnyScript/India
-    {     82,     0,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/AnyScript/Mongolia
-    {     82,     0,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/AnyScript/China
-    {     82,     2,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Cyrillic/Mongolia
-    {     82,     8,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/Mongolian/China
-    {     84,     0,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9623,85 , 9708,27 , 9635,56 , 9691,85 , 9776,27 , 6400,33 , 6433,54 , 6487,14 , 6400,33 , 6433,54 , 6487,14 , 185,14 , 181,14 , {78,80,82},  218,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/AnyScript/Nepal
-    {     84,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9735,80 , 9708,27 , 9635,56 , 9803,80 , 9776,27 , 6400,33 , 6501,54 , 6487,14 , 6400,33 , 6501,54 , 6487,14 , 120,9 , 122,7 , {73,78,82},  145,2 , 3827,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/AnyScript/India
-    {     85,     0,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 332,8 , 594,17 , 37,5 , 431,16 , 9815,59 , 9874,83 , 134,24 , 9883,59 , 9942,83 , 320,24 , 6555,28 , 2244,51 , 2295,14 , 6583,35 , 2244,51 , 2295,14 , 0,2 , 0,2 , {78,79,75},  142,2 , 3876,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/AnyScript/Norway
-    {     86,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 9957,83 , 9957,83 , 1483,27 , 10025,83 , 10025,83 , 134,27 , 6618,57 , 6618,57 , 798,14 , 6618,57 , 6618,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/AnyScript/France
-    {     87,     0,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 10,17 , 18,7 , 25,12 , 10040,89 , 10040,89 , 10129,32 , 10108,89 , 10108,89 , 10197,32 , 6675,33 , 6708,54 , 6762,18 , 6675,33 , 6708,54 , 6762,18 , 140,2 , 140,2 , {73,78,82},  145,2 , 3920,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/AnyScript/India
-    {     88,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 872,20 , 165,4 , 447,11 , 10161,68 , 10161,68 , 1483,27 , 10229,68 , 10229,68 , 134,27 , 6780,49 , 6780,49 , 798,14 , 6780,49 , 6780,49 , 798,14 , 199,4 , 195,4 , {65,70,78},  222,1 , 3931,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/AnyScript/Afghanistan
-    {     89,     0,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10229,71 , 10300,70 , 10370,25 , 10297,71 , 10368,73 , 10441,25 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {73,82,82},  223,1 , 3944,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Iran
-    {     89,     0,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 558,6 , 35,18 , 165,4 , 447,11 , 10395,63 , 10300,70 , 10458,24 , 10466,63 , 10529,68 , 10597,24 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {65,70,78},  222,1 , 3961,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Afghanistan
-    {     90,     0,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 892,10 , 10,17 , 37,5 , 8,10 , 10482,48 , 10530,97 , 10627,24 , 10621,48 , 10669,99 , 10768,24 , 6843,34 , 6877,59 , 6936,14 , 6843,34 , 6877,59 , 6936,14 , 0,2 , 0,2 , {80,76,78},  224,2 , 3984,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/AnyScript/Poland
-    {     91,     0,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10651,48 , 10699,89 , 134,24 , 10792,48 , 10840,89 , 320,24 , 6950,28 , 6978,79 , 7057,14 , 6950,28 , 6978,79 , 7057,14 , 213,17 , 209,18 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Portugal
-    {     91,     0,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {66,82,76},  226,2 , 4044,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Brazil
-    {     91,     0,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 4098,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/AnyScript/GuineaBissau
-    {     91,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 4160,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Mozambique
-    {     92,     0,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/AnyScript/India
-    {     92,     0,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/AnyScript/Pakistan
-    {     92,     1,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Arabic/Pakistan
-    {     92,     4,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/Gurmukhi/India
-    {     94,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 11087,67 , 11154,92 , 11246,24 , 11228,67 , 11295,92 , 11387,24 , 7303,23 , 7326,56 , 7382,14 , 7303,23 , 7326,56 , 7382,14 , 140,2 , 231,2 , {67,72,70},  0,0 , 4257,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/AnyScript/Switzerland
-    {     95,     0,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4277,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Moldova
-    {     95,     0,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {82,79,78},  235,3 , 4331,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Romania
-    {     96,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {82,85,66},  238,4 , 4347,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/RussianFederation
-    {     96,     0,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4436,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Moldova
-    {     96,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 939,22 , 37,5 , 8,10 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {85,65,72},  242,1 , 4457,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Ukraine
-    {     98,     0,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 11618,48 , 11666,91 , 11757,24 , 11762,48 , 11810,91 , 11901,24 , 7624,28 , 7652,66 , 7718,14 , 7624,28 , 7652,66 , 7718,14 , 235,2 , 233,2 , {88,65,70},  201,4 , 4481,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/AnyScript/CentralAfricanRepublic
-    {     99,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  180,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/AnyScript/India
-    {    100,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/SerbiaAndMontenegro
-    {    100,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/BosniaAndHerzegowina
-    {    100,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Yugoslavia
-    {    100,     0,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Montenegro
-    {    100,     0,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/AnyScript/Serbia
-    {    100,     2,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/BosniaAndHerzegowina
-    {    100,     2,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Yugoslavia
-    {    100,     2,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/SerbiaAndMontenegro
-    {    100,     2,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {69,85,82},  113,1 , 4799,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Montenegro
-    {    100,     2,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Cyrillic/Serbia
-    {    100,     7,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/BosniaAndHerzegowina
-    {    100,     7,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Yugoslavia
-    {    100,     7,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/SerbiaAndMontenegro
-    {    100,     7,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Montenegro
-    {    100,     7,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {82,83,68},  252,4 , 5044,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Latin/Serbia
-    {    101,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/SerbiaAndMontenegro
-    {    101,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/BosniaAndHerzegowina
-    {    101,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/Yugoslavia
-    {    102,     0,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/Lesotho
-    {    102,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/SouthAfrica
-    {    103,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12299,48 , 12347,117 , 1483,27 , 12443,48 , 12491,117 , 134,27 , 8078,27 , 8105,64 , 798,14 , 8078,27 , 8105,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/AnyScript/SouthAfrica
-    {    104,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 12464,47 , 12511,100 , 12611,24 , 12608,47 , 12655,100 , 12755,24 , 8169,32 , 8201,55 , 8256,14 , 8169,32 , 8201,55 , 8256,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 5115,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/AnyScript/Zimbabwe
-    {    106,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 576,10 , 988,17 , 18,7 , 25,12 , 12635,54 , 12689,92 , 12781,32 , 12779,54 , 12833,92 , 12925,32 , 8270,30 , 8300,62 , 8362,19 , 8270,30 , 8300,62 , 8362,19 , 255,5 , 249,4 , {76,75,82},  259,5 , 5137,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/AnyScript/SriLanka
-    {    107,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/SouthAfrica
-    {    107,     0,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  264,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/Swaziland
-    {    108,     0,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 586,8 , 502,18 , 165,4 , 195,9 , 12975,48 , 13023,82 , 12122,24 , 13119,48 , 13167,89 , 12266,24 , 8476,21 , 8497,52 , 8549,14 , 8476,21 , 8497,52 , 8549,14 , 260,10 , 253,9 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/AnyScript/Slovakia
-    {    109,     0,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 1005,9 , 611,19 , 37,5 , 8,10 , 11993,48 , 13105,86 , 12122,24 , 12137,48 , 13256,86 , 12266,24 , 8563,28 , 8591,52 , 8643,14 , 8563,28 , 8591,52 , 8643,14 , 62,4 , 262,4 , {69,85,82},  113,1 , 5156,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/AnyScript/Slovenia
-    {    110,     0,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {83,79,83},  265,3 , 5184,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Somalia
-    {    110,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {68,74,70},  5,3 , 5206,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Djibouti
-    {    110,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {69,84,66},  0,2 , 5227,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Ethiopia
-    {    110,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Kenya
-    {    111,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Spain
-    {    111,     0,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 517,14 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {65,82,83},  128,1 , 5249,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/Argentina
-    {    111,     0,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {66,79,66},  268,2 , 5300,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Bolivia
-    {    111,     0,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 543,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,76,80},  128,1 , 5335,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Chile
-    {    111,     0,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,79,80},  128,1 , 5380,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Colombia
-    {    111,     0,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,82,67},  270,1 , 5434,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/CostaRica
-    {    111,     0,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {68,79,80},  271,3 , 5501,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/DominicanRepublic
-    {    111,     0,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Ecuador
-    {    111,     0,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  256,3 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/ElSalvador
-    {    111,     0,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {88,65,70},  201,4 , 5625,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/EquatorialGuinea
-    {    111,     0,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {71,84,81},  274,1 , 5647,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Guatemala
-    {    111,     0,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1040,27 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {72,78,76},  275,1 , 5717,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Honduras
-    {    111,     0,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {77,88,78},  128,1 , 5777,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Mexico
-    {    111,     0,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {78,73,79},  276,2 , 5825,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Nicaragua
-    {    111,     0,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,65,66},  278,3 , 5906,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Panama
-    {    111,     0,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,89,71},  281,1 , 5960,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Paraguay
-    {    111,     0,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 551,7 , 1014,26 , 37,5 , 531,15 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,69,78},  282,3 , 6021,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Peru
-    {    111,     0,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/PuertoRico
-    {    111,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 558,6 , 1014,26 , 18,7 , 25,12 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/UnitedStates
-    {    111,     0,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,89,85},  128,1 , 6083,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Uruguay
-    {    111,     0,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {86,69,70},  285,5 , 6131,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Venezuela
-    {    111,     0,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4506,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/LatinAmericaAndTheCaribbean
-    {    113,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {75,69,83},  2,3 , 6217,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/AnyScript/Kenya
-    {    113,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {84,90,83},  290,3 , 6241,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/AnyScript/Tanzania
-    {    114,     0,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {83,69,75},  142,2 , 6268,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Sweden
-    {    114,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {69,85,82},  113,1 , 6313,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Finland
-    {    116,     0,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/AnyScript/Tajikistan
-    {    116,     2,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Cyrillic/Tajikistan
-    {    117,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {73,78,82},  293,2 , 6345,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/AnyScript/India
-    {    117,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {76,75,82},  295,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/AnyScript/SriLanka
-    {    118,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/AnyScript/RussianFederation
-    {    119,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 543,8 , 99,16 , 18,7 , 25,12 , 14127,86 , 14127,86 , 14213,30 , 14278,86 , 14278,86 , 14364,30 , 9154,32 , 9186,60 , 9246,18 , 9154,32 , 9186,60 , 9246,18 , 282,1 , 278,2 , {73,78,82},  299,3 , 6358,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/AnyScript/India
-    {    120,     0,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 1108,19 , 165,4 , 546,27 , 14243,63 , 14306,98 , 14243,63 , 14394,63 , 14457,98 , 14555,24 , 9264,23 , 9287,68 , 9355,14 , 9264,23 , 9287,68 , 9355,14 , 283,10 , 280,10 , {84,72,66},  302,1 , 6371,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/AnyScript/Thailand
-    {    121,     0,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {67,78,89},  215,3 , 6384,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/AnyScript/China
-    {    121,     0,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {73,78,82},  145,2 , 6397,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/AnyScript/India
-    {    122,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1127,23 , 18,7 , 25,12 , 14625,46 , 14671,54 , 1034,24 , 14800,46 , 14846,54 , 1061,24 , 9516,29 , 9516,29 , 9545,14 , 9516,29 , 9516,29 , 9545,14 , 300,7 , 298,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Eritrea
-    {    122,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9559,29 , 9559,29 , 9545,14 , 9559,29 , 9559,29 , 9545,14 , 300,7 , 298,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Ethiopia
-    {    123,     0,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 279,6 , 99,16 , 37,5 , 8,10 , 14725,51 , 14776,87 , 14863,24 , 14900,51 , 14951,87 , 15038,24 , 9588,29 , 9617,60 , 9677,14 , 9588,29 , 9617,60 , 9677,14 , 0,2 , 0,2 , {84,79,80},  303,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/AnyScript/Tonga
-    {    124,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 14887,48 , 14935,122 , 1483,27 , 15062,48 , 15110,122 , 134,27 , 9691,27 , 9718,72 , 798,14 , 9691,27 , 9718,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/AnyScript/SouthAfrica
-    {    125,     0,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 929,10 , 1173,17 , 37,5 , 8,10 , 15057,48 , 15105,75 , 15180,24 , 15232,48 , 15280,75 , 15355,24 , 9790,28 , 9818,54 , 9872,14 , 9790,28 , 9818,54 , 9872,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 6419,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/AnyScript/Turkey
-    {    128,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/AnyScript/China
-    {    128,     1,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/Arabic/China
-    {    129,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 332,8 , 1190,22 , 37,5 , 8,10 , 15204,48 , 15252,95 , 15347,24 , 15379,67 , 15446,87 , 15533,24 , 9886,21 , 9907,56 , 9963,14 , 9886,21 , 9907,56 , 9963,14 , 307,2 , 305,2 , {85,65,72},  242,1 , 6437,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/AnyScript/Ukraine
-    {    130,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 6486,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/AnyScript/India
-    {    130,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {80,75,82},  305,4 , 6504,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/AnyScript/Pakistan
-    {    131,     0,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/AnyScript/Uzbekistan
-    {    131,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/AnyScript/Afghanistan
-    {    131,     1,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Arabic/Afghanistan
-    {    131,     2,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Cyrillic/Uzbekistan
-    {    131,     7,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 15669,52 , 15438,115 , 15721,24 , 15787,52 , 15624,115 , 15839,24 , 10143,34 , 10177,61 , 10238,14 , 10143,34 , 10177,61 , 10238,14 , 0,2 , 0,2 , {85,90,83},  314,4 , 6559,23 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Latin/Uzbekistan
-    {    132,     0,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1263,31 , 37,5 , 8,10 , 15745,75 , 15820,130 , 1483,27 , 15863,75 , 15938,130 , 134,27 , 10252,33 , 10285,55 , 10340,21 , 10252,33 , 10285,55 , 10340,21 , 309,2 , 307,2 , {86,78,68},  318,1 , 6582,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/AnyScript/VietNam
-    {    134,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 123,18 , 18,7 , 25,12 , 15950,53 , 16003,87 , 16090,24 , 16068,62 , 16130,86 , 16216,24 , 10361,29 , 10390,77 , 10467,14 , 10481,30 , 10390,77 , 10467,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 6593,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/AnyScript/UnitedKingdom
-    {    135,     0,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/AnyScript/Senegal
-    {    135,     7,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Latin/Senegal
-    {    136,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 16114,48 , 16162,91 , 1483,27 , 16240,48 , 16288,91 , 134,27 , 10511,28 , 10539,61 , 798,14 , 10511,28 , 10539,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/AnyScript/SouthAfrica
-    {    138,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 16253,73 , 16326,121 , 1483,27 , 16379,73 , 16452,121 , 134,27 , 10600,44 , 10644,69 , 798,14 , 10600,44 , 10644,69 , 798,14 , 311,5 , 309,5 , {78,71,78},  171,1 , 6621,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/AnyScript/Nigeria
-    {    140,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 82,17 , 18,7 , 25,12 , 16447,48 , 16495,104 , 134,24 , 16573,48 , 16621,90 , 320,24 , 10713,28 , 10741,68 , 10809,14 , 10713,28 , 10741,68 , 10809,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/AnyScript/SouthAfrica
-    {    141,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 332,8 , 594,17 , 37,5 , 431,16 , 4262,48 , 9874,83 , 134,24 , 4314,48 , 9942,83 , 320,24 , 10823,28 , 10851,51 , 2295,14 , 10823,28 , 10851,51 , 2295,14 , 316,9 , 314,11 , {78,79,75},  142,2 , 6655,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/AnyScript/Norway
-    {    142,     0,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 16599,48 , 16647,83 , 1483,27 , 16711,48 , 16759,83 , 134,27 , 10902,28 , 10930,58 , 798,14 , 10902,28 , 10930,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  250,2 , 6697,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/AnyScript/BosniaAndHerzegowina
-    {    143,     0,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  319,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/AnyScript/Maldives
-    {    144,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 82,17 , 37,5 , 8,10 , 16730,102 , 16832,140 , 1483,27 , 16842,102 , 16944,140 , 134,27 , 10988,30 , 11018,57 , 798,14 , 10988,30 , 11018,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/AnyScript/UnitedKingdom
-    {    145,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 99,16 , 37,5 , 8,10 , 16972,46 , 17018,124 , 1483,27 , 17084,46 , 17130,124 , 134,27 , 11075,28 , 11103,60 , 798,14 , 11075,28 , 11103,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/AnyScript/UnitedKingdom
-    {    146,     0,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 221,8 , 314,18 , 37,5 , 8,10 , 17142,48 , 17190,192 , 1483,27 , 17254,48 , 17302,192 , 134,27 , 11163,28 , 11191,49 , 11240,14 , 11163,28 , 11191,49 , 11240,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/AnyScript/Ghana
-    {    147,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 655,6 , 99,16 , 18,7 , 25,12 , 17382,87 , 17382,87 , 1483,27 , 17494,87 , 17494,87 , 134,27 , 6251,32 , 11254,55 , 798,14 , 6251,32 , 11254,55 , 798,14 , 327,5 , 327,5 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/AnyScript/India
-    {    148,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 221,8 , 314,18 , 37,5 , 8,10 , 17469,48 , 17517,94 , 1483,27 , 17581,48 , 17629,94 , 134,27 , 11309,26 , 11335,34 , 798,14 , 11309,26 , 11335,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/AnyScript/Ghana
-    {    149,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17611,48 , 17659,86 , 1483,27 , 17723,48 , 17771,86 , 134,27 , 11369,29 , 11398,57 , 798,14 , 11369,29 , 11398,57 , 798,14 , 332,4 , 332,4 , {78,71,78},  171,1 , 6723,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/AnyScript/Nigeria
-    {    150,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 17745,48 , 17793,189 , 17982,24 , 17857,48 , 17905,189 , 18094,24 , 11455,28 , 11483,74 , 11557,14 , 11455,28 , 11483,74 , 11557,14 , 336,9 , 336,7 , {75,69,83},  2,3 , 6735,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/AnyScript/Kenya
-    {    151,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 141,10 , 1294,13 , 394,4 , 25,12 , 18006,65 , 18006,65 , 1483,27 , 18118,65 , 18118,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/AnyScript/SyrianArabRepublic
-    {    152,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1307,22 , 18,7 , 25,12 , 18071,47 , 18118,77 , 18195,24 , 18183,47 , 18230,77 , 18307,24 , 11571,26 , 11597,43 , 11640,14 , 11571,26 , 11597,43 , 11640,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/AnyScript/Eritrea
-    {    153,     0,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Eritrea
-    {    153,     0,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Ethiopia
-    {    154,     0,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18292,48 , 18340,124 , 1483,27 , 18404,48 , 18452,124 , 134,27 , 11697,28 , 11725,54 , 798,14 , 11697,28 , 11725,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/AnyScript/IvoryCoast
-    {    155,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11779,28 , 11807,51 , 11858,14 , 11779,28 , 11807,51 , 11858,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/AnyScript/Ethiopia
-    {    156,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18464,59 , 18523,129 , 1483,27 , 18576,59 , 18635,129 , 134,27 , 11872,35 , 11907,87 , 798,14 , 11872,35 , 11907,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6758,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/AnyScript/Nigeria
-    {    157,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11994,27 , 12021,41 , 12062,14 , 11994,27 , 12021,41 , 12062,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/AnyScript/Eritrea
-    {    158,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 18652,57 , 18709,178 , 1483,27 , 18764,57 , 18821,178 , 134,27 , 12076,28 , 12104,44 , 798,14 , 12076,28 , 12104,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6769,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/AnyScript/Nigeria
-    {    159,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 27,8 , 1373,27 , 37,5 , 8,10 , 18887,48 , 18935,77 , 19012,24 , 18999,48 , 19047,77 , 19124,24 , 12148,28 , 12176,50 , 3021,14 , 12148,28 , 12176,50 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/AnyScript/Italy
-    {    160,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 19036,48 , 19084,111 , 1483,27 , 19148,48 , 19196,111 , 134,27 , 12226,27 , 12253,70 , 798,14 , 12226,27 , 12253,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/AnyScript/SouthAfrica
-    {    161,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/AnyScript/Ghana
-    {    161,     0,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {88,79,70},  157,3 , 6783,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/AnyScript/Togo
-    {    162,     0,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12413,27 , 12413,27 , 12440,14 , 12413,27 , 12413,27 , 12440,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/AnyScript/Ethiopia
-    {    163,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 279,6 , 10,17 , 18,7 , 25,12 , 19354,59 , 19413,95 , 1483,27 , 19466,59 , 19525,95 , 134,27 , 12454,21 , 12475,57 , 798,14 , 12454,21 , 12475,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/AnyScript/UnitedStates
-    {    164,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 221,8 , 314,18 , 37,5 , 8,10 , 19508,48 , 19556,153 , 1483,27 , 19620,48 , 19668,153 , 134,27 , 12532,28 , 12560,42 , 798,14 , 12532,28 , 12560,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6794,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/AnyScript/Nigeria
-    {    165,     0,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 19709,48 , 19757,91 , 1483,27 , 19821,48 , 19869,91 , 134,27 , 12602,28 , 12630,67 , 798,14 , 12602,28 , 12630,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6805,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/AnyScript/Malawi
-    {    166,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 1422,18 , 37,5 , 8,10 , 19848,48 , 19896,88 , 19984,24 , 19960,48 , 20008,88 , 20096,24 , 12697,28 , 12725,55 , 12780,14 , 12794,28 , 12725,55 , 12780,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 6827,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/AnyScript/Philippines
-    {    167,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 332,8 , 502,18 , 37,5 , 8,10 , 20008,48 , 20056,86 , 134,24 , 5076,48 , 20120,86 , 320,24 , 12822,28 , 12850,63 , 3311,14 , 12822,28 , 12850,63 , 3311,14 , 91,5 , 343,4 , {67,72,70},  0,0 , 6849,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/AnyScript/Switzerland
-    {    168,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 20142,38 , 1483,27 , 134,27 , 20206,38 , 134,27 , 12913,21 , 12934,28 , 12962,14 , 12913,21 , 12934,28 , 12962,14 , 345,2 , 347,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/AnyScript/China
-    {    169,     0,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  321,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/AnyScript/Guinea
-    {    169,     0,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/AnyScript/Liberia
-    {    170,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/AnyScript/Germany
-    {    171,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 20180,48 , 20228,100 , 1483,27 , 20244,48 , 20292,100 , 134,27 , 12976,27 , 13003,66 , 798,14 , 12976,27 , 13003,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/AnyScript/SouthAfrica
-    {    172,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 72,10 , 314,18 , 37,5 , 8,10 , 20328,48 , 20376,94 , 1483,27 , 20392,48 , 20440,94 , 134,27 , 13069,27 , 13096,63 , 798,14 , 13069,27 , 13096,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/AnyScript/SouthAfrica
-    {    173,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20470,85 , 20555,145 , 20700,24 , 20534,85 , 20619,145 , 20764,24 , 13159,33 , 13192,65 , 13257,14 , 13159,33 , 13192,65 , 13257,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 6888,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Finland
-    {    173,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20724,59 , 20555,145 , 20700,24 , 20788,59 , 20619,145 , 20764,24 , 13159,33 , 13271,75 , 13346,14 , 13159,33 , 13271,75 , 13346,14 , 0,2 , 0,2 , {78,79,75},  323,3 , 6911,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Norway
-    {    174,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 72,10 , 314,18 , 37,5 , 8,10 , 20783,48 , 20831,142 , 20973,24 , 20847,48 , 20895,142 , 21037,24 , 13360,28 , 13388,172 , 13560,14 , 13360,28 , 13388,172 , 13560,14 , 0,2 , 0,2 , {84,87,68},  135,3 , 6932,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/AnyScript/Taiwan
-    {    175,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 20997,48 , 21045,88 , 21133,24 , 21061,48 , 21109,88 , 21197,24 , 13574,28 , 13602,62 , 13664,14 , 13574,28 , 13602,62 , 13664,14 , 347,5 , 349,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/AnyScript/Kenya
-    {    176,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21157,48 , 21205,221 , 21426,24 , 21221,48 , 21269,221 , 21490,24 , 13678,28 , 13706,106 , 13812,14 , 13678,28 , 13706,106 , 13812,14 , 352,10 , 359,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/AnyScript/Kenya
-    {    177,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 364,8 , 99,16 , 37,5 , 8,10 , 21450,48 , 21498,77 , 21575,24 , 21514,48 , 21562,77 , 21639,24 , 13826,28 , 13854,59 , 13913,14 , 13826,28 , 13854,59 , 13913,14 , 362,6 , 369,7 , {88,79,70},  157,3 , 6974,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/AnyScript/Senegal
-    {    178,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21599,48 , 21647,185 , 21832,24 , 21663,48 , 21711,185 , 21896,24 , 13927,28 , 13955,63 , 14018,14 , 13927,28 , 13955,63 , 14018,14 , 368,6 , 376,8 , {75,69,83},  2,3 , 7000,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/AnyScript/Kenya
-    {    179,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 21856,48 , 21904,173 , 22077,24 , 21920,48 , 21968,173 , 22141,24 , 14032,28 , 14060,105 , 14165,14 , 14032,28 , 14060,105 , 14165,14 , 374,7 , 384,5 , {75,69,83},  2,3 , 7023,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/AnyScript/Kenya
-    {    180,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 364,8 , 902,27 , 37,5 , 8,10 , 22101,48 , 22149,88 , 134,24 , 22165,48 , 22213,88 , 320,24 , 14179,28 , 14207,55 , 14262,14 , 14179,28 , 14207,55 , 14262,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/AnyScript/Mozambique
-    {    181,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 22237,48 , 22285,112 , 22397,24 , 22301,48 , 22349,112 , 22461,24 , 14276,28 , 14304,50 , 14354,14 , 14276,28 , 14304,50 , 14354,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 7048,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/AnyScript/Zimbabwe
-    {    182,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 22421,39 , 22460,194 , 22654,24 , 22485,39 , 22524,194 , 22718,24 , 14368,28 , 14396,65 , 14461,14 , 14368,28 , 14396,65 , 14461,14 , 381,8 , 389,7 , {84,90,83},  290,3 , 7072,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/AnyScript/Tanzania
-    {    183,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/AnyScript/Morocco
-    {    183,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Latin/Morocco
-    {    183,     9,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22831,48 , 22879,81 , 22960,24 , 22895,48 , 22943,81 , 23024,24 , 14553,30 , 14583,47 , 798,14 , 14553,30 , 14583,47 , 798,14 , 395,6 , 404,8 , {77,65,68},  0,0 , 7118,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Tifinagh/Morocco
-    {    184,     0,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 22984,48 , 23032,84 , 23116,24 , 23048,48 , 23096,84 , 23180,24 , 14630,30 , 14660,51 , 14711,14 , 14630,30 , 14660,51 , 14711,14 , 401,7 , 412,9 , {68,90,68},  326,2 , 7139,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/AnyScript/Algeria
-    {    185,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/AnyScript/Uganda
-    {    186,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,254 , 23642,24 , 23404,48 , 23452,254 , 23706,24 , 14841,28 , 14869,82 , 14951,14 , 14841,28 , 14869,82 , 14951,14 , 408,7 , 421,7 , {84,90,83},  290,3 , 7186,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/AnyScript/Tanzania
-    {    187,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/AnyScript/Tanzania
-    {    188,     0,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 364,8 , 99,16 , 37,5 , 8,10 , 23753,47 , 23800,92 , 23892,24 , 23817,47 , 23864,92 , 23956,24 , 15069,28 , 15097,44 , 15141,14 , 15069,28 , 15097,44 , 15141,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 7242,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/AnyScript/Mali
-    {    189,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 23916,48 , 23964,207 , 24171,24 , 23980,48 , 24028,207 , 24235,24 , 15155,28 , 15183,64 , 15247,14 , 15155,28 , 15183,64 , 15247,14 , 420,2 , 437,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/AnyScript/Kenya
-    {    190,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 558,6 , 35,18 , 18,7 , 25,12 , 24195,36 , 24231,58 , 24289,24 , 24259,36 , 24295,58 , 24353,24 , 15261,28 , 15289,49 , 15338,14 , 15261,28 , 15289,49 , 15338,14 , 422,3 , 439,6 , {85,83,68},  128,1 , 7266,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/AnyScript/UnitedStates
-    {    191,     0,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 364,8 , 99,16 , 37,5 , 8,10 , 24313,47 , 24360,68 , 24428,24 , 24377,47 , 24424,68 , 24492,24 , 15352,27 , 15379,48 , 15427,14 , 15352,27 , 15379,48 , 15427,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 7285,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/AnyScript/Mauritius
-    {    192,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 24452,264 , 134,24 , 13764,48 , 24516,264 , 320,24 , 15441,28 , 15469,133 , 14461,14 , 15441,28 , 15469,133 , 14461,14 , 425,4 , 445,5 , {84,90,83},  290,3 , 7215,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/AnyScript/Tanzania
-    {    193,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 141,10 , 10,17 , 18,7 , 25,12 , 24716,83 , 24799,111 , 24910,24 , 24780,83 , 24863,111 , 24974,24 , 15602,36 , 15638,63 , 15701,14 , 15602,36 , 15638,63 , 15701,14 , 429,3 , 450,3 , {84,90,83},  290,3 , 7306,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/AnyScript/Tanzania
-    {    194,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 15715,28 , 15743,66 , 15809,14 , 15715,28 , 15743,66 , 15809,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7335,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/AnyScript/Uganda
-    {    195,     0,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25079,48 , 25127,83 , 25210,24 , 25143,48 , 25191,83 , 25274,24 , 15823,80 , 15823,80 , 798,14 , 15823,80 , 15823,80 , 798,14 , 432,8 , 453,7 , {90,77,75},  331,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/AnyScript/Zambia
-    {    196,     0,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 902,27 , 37,5 , 8,10 , 25234,48 , 25282,86 , 134,24 , 25298,48 , 25346,86 , 320,24 , 15903,28 , 15931,73 , 16004,14 , 15903,28 , 15931,73 , 16004,14 , 140,2 , 140,2 , {67,86,69},  333,3 , 7361,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/AnyScript/CapeVerde
-    {    197,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25368,48 , 25416,86 , 25502,24 , 25432,48 , 25480,86 , 25566,24 , 16018,28 , 16046,51 , 16097,14 , 16018,28 , 16046,51 , 16097,14 , 440,2 , 460,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/AnyScript/Kenya
-    {    198,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 25526,48 , 25574,111 , 25685,24 , 25590,48 , 25638,111 , 25749,24 , 16111,28 , 16139,93 , 16232,14 , 16111,28 , 16139,93 , 16232,14 , 442,4 , 462,4 , {75,69,83},  2,3 , 7386,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/AnyScript/Kenya
-    {    199,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25709,136 , 134,24 , 0,48 , 25773,136 , 320,24 , 16246,23 , 16269,92 , 16361,14 , 16246,23 , 16269,92 , 16361,14 , 446,7 , 466,5 , {78,65,68},  12,2 , 7412,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/AnyScript/Namibia
-    {    200,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/AnyScript/Tanzania
-    {    201,     0,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 1440,10 , 1450,23 , 37,5 , 8,10 , 25845,59 , 25904,87 , 134,24 , 25909,59 , 25968,87 , 320,24 , 16375,28 , 16403,72 , 3311,14 , 16375,28 , 16403,72 , 3311,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/AnyScript/Germany
-    {    202,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {75,69,83},  2,3 , 7434,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/AnyScript/Kenya
-    {    202,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {84,90,83},  290,3 , 7459,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/AnyScript/Tanzania
-    {    203,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 16533,35 , 16568,65 , 16633,14 , 16533,35 , 16568,65 , 16633,14 , 462,6 , 477,6 , {85,71,88},  328,3 , 7335,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/AnyScript/Uganda
-    {    204,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 26174,48 , 13661,84 , 134,24 , 26238,48 , 13812,84 , 320,24 , 16647,21 , 16668,75 , 85,14 , 16647,21 , 16668,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7487,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/AnyScript/Kenya
-    {    205,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26222,48 , 13661,84 , 134,24 , 26286,48 , 13812,84 , 320,24 , 16743,28 , 8849,60 , 15055,14 , 16743,28 , 8849,60 , 15055,14 , 468,9 , 483,8 , {84,90,83},  290,3 , 7510,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/AnyScript/Tanzania
-    {    206,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {75,69,83},  2,3 , 7538,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/AnyScript/Kenya
-    {    206,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {85,71,88},  328,3 , 7565,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/AnyScript/Uganda
-    {    207,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16882,28 , 16910,56 , 16966,14 , 16882,28 , 16910,56 , 16966,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/AnyScript/Eritrea
-    {    208,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 16980,28 , 17008,53 , 17061,14 , 16980,28 , 17008,53 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/AnyScript/Mali
-    {    209,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/AnyScript/Tanzania
-    {    210,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26594,48 , 26642,186 , 26828,24 , 26658,48 , 26706,186 , 26892,24 , 17075,28 , 17103,69 , 17172,14 , 17075,28 , 17103,69 , 17172,14 , 492,2 , 503,2 , {75,69,83},  2,3 , 7616,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/AnyScript/Kenya
-    {    211,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/AnyScript/Uganda
-    {    212,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/AnyScript/Morocco
-    {    212,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Latin/Morocco
-    {    213,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 17276,28 , 17304,54 , 17061,14 , 17276,28 , 17304,54 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/AnyScript/Mali
-    {    214,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 27010,84 , 134,24 , 13764,48 , 27074,84 , 320,24 , 17358,28 , 17386,63 , 8909,14 , 17358,28 , 17386,63 , 8909,14 , 503,5 , 515,8 , {84,90,83},  290,3 , 6241,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/AnyScript/Tanzania
-    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
+//      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
+    {      1,     0,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyScript/AnyCountry
+    {      3,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Ethiopia
+    {      3,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Kenya
+    {      4,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/AnyScript/Djibouti
+    {      4,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Eritrea
+    {      4,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Ethiopia
+    {      5,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/SouthAfrica
+    {      5,     0,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/Namibia
+    {      6,     0,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/AnyScript/Albania
+    {      7,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/AnyScript/Ethiopia
+    {      8,     0,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/SaudiArabia
+    {      8,     0,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/Algeria
+    {      8,     0,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Bahrain
+    {      8,     0,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Egypt
+    {      8,     0,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/AnyScript/Iraq
+    {      8,     0,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Jordan
+    {      8,     0,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Kuwait
+    {      8,     0,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/AnyScript/Lebanon
+    {      8,     0,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/LibyanArabJamahiriya
+    {      8,     0,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Morocco
+    {      8,     0,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/AnyScript/Oman
+    {      8,     0,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Qatar
+    {      8,     0,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Sudan
+    {      8,     0,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/AnyScript/SyrianArabRepublic
+    {      8,     0,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Tunisia
+    {      8,     0,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/AnyScript/UnitedArabEmirates
+    {      8,     0,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/AnyScript/Yemen
+    {      9,     0,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/AnyScript/Armenia
+    {     10,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/AnyScript/India
+    {     12,     0,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/AnyScript/Azerbaijan
+    {     12,     0,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/AnyScript/Iran
+    {     12,     1,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Arabic/Iran
+    {     12,     2,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1785,77 , 1483,27 , 1660,48 , 1785,77 , 134,27 , 907,26 , 1000,67 , 99,14 , 907,26 , 1000,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  109,4 , 1457,29 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Cyrillic/Azerbaijan
+    {     12,     7,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Latin/Azerbaijan
+    {     14,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 248,31 , 37,5 , 8,10 , 1862,48 , 1910,93 , 2003,24 , 1862,48 , 1910,93 , 2003,24 , 1067,21 , 1088,68 , 798,14 , 1067,21 , 1088,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/AnyScript/Spain
+    {     15,     0,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {66,68,84},  114,1 , 1486,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/AnyScript/Bangladesh
+    {     15,     0,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {73,78,82},  115,4 , 1507,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/AnyScript/India
+    {     16,     0,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 285,29 , 93,22 , 115,35 , 2150,75 , 2225,205 , 1483,27 , 2150,75 , 2225,205 , 134,27 , 1269,34 , 1303,79 , 798,14 , 1269,34 , 1303,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  119,3 , 1526,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/AnyScript/Bhutan
+    {     19,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/AnyScript/France
+    {     20,     0,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 340,18 , 37,5 , 8,10 , 2430,59 , 2489,82 , 2571,24 , 2430,59 , 2489,82 , 2571,24 , 1382,21 , 1403,55 , 1458,14 , 1382,21 , 1403,55 , 1458,14 , 34,7 , 31,7 , {66,71,78},  122,3 , 1553,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/AnyScript/Bulgaria
+    {     21,     0,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 2595,43 , 2638,88 , 2726,24 , 2595,43 , 2638,88 , 2726,24 , 1472,25 , 1497,54 , 1551,14 , 1472,25 , 1497,54 , 1551,14 , 0,2 , 0,2 , {77,77,75},  125,1 , 1600,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/AnyScript/Myanmar
+    {     22,     0,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 358,6 , 10,17 , 150,5 , 155,10 , 2750,48 , 2798,99 , 2897,24 , 2750,48 , 2798,95 , 2893,24 , 1565,21 , 1586,56 , 1642,14 , 1565,21 , 1586,56 , 1642,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1618,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/AnyScript/Belarus
+    {     23,     0,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 372,30 , 165,4 , 169,26 , 2921,27 , 2948,71 , 1483,27 , 2917,27 , 2944,71 , 134,27 , 1656,19 , 1675,76 , 798,14 , 1656,19 , 1675,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  126,1 , 1641,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/AnyScript/Cambodia
+    {     24,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 27,8 , 402,21 , 165,4 , 195,9 , 3019,60 , 3079,82 , 3161,24 , 3015,93 , 3108,115 , 3223,24 , 1751,21 , 1772,60 , 1832,14 , 1846,28 , 1874,60 , 1934,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/AnyScript/Spain
+    {     25,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/China
+    {     25,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/HongKong
+    {     25,     0,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Macau
+    {     25,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Singapore
+    {     25,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Taiwan
+    {     25,     5,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/China
+    {     25,     5,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/HongKong
+    {     25,     5,   126,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1722,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Macau
+    {     25,     5,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Singapore
+    {     25,     6,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/HongKong
+    {     25,     6,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Macau
+    {     25,     6,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Taiwan
+    {     27,     0,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 470,13 , 483,19 , 37,5 , 8,10 , 3262,49 , 3311,94 , 3405,39 , 3286,49 , 3335,98 , 3433,39 , 2032,28 , 2060,58 , 2118,14 , 2032,28 , 2060,58 , 2118,14 , 0,2 , 0,2 , {72,82,75},  138,2 , 1732,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/AnyScript/Croatia
+    {     28,     0,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 78,7 , 78,7 , 358,6 , 502,18 , 165,4 , 195,9 , 3405,39 , 3444,82 , 3526,24 , 134,27 , 3472,84 , 3556,24 , 2132,21 , 2153,49 , 2202,14 , 2132,21 , 2153,49 , 2202,14 , 62,4 , 62,4 , {67,90,75},  140,2 , 1759,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/AnyScript/CzechRepublic
+    {     29,     0,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 27,8 , 520,23 , 150,5 , 155,10 , 3550,48 , 3598,84 , 134,24 , 3580,59 , 3639,84 , 320,24 , 2216,28 , 2244,51 , 2295,14 , 2216,28 , 2244,51 , 2295,14 , 66,4 , 66,4 , {68,75,75},  142,2 , 1778,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/AnyScript/Denmark
+    {     30,     0,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 543,8 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Netherlands
+    {     30,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 551,7 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Belgium
+    {     31,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStates
+    {     31,     0,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/AmericanSamoa
+    {     31,     0,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  128,1 , 1874,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Australia
+    {     31,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belgium
+    {     31,     0,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  128,1 , 1953,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belize
+    {     31,     0,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  144,1 , 2000,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Botswana
+    {     31,     0,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2050,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Canada
+    {     31,     0,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Guam
+    {     31,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  128,1 , 2103,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/HongKong
+    {     31,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 2159,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/AnyScript/India
+    {     31,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Ireland
+    {     31,     0,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  128,1 , 2203,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Jamaica
+    {     31,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Malta
+    {     31,     0,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/MarshallIslands
+    {     31,     0,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 2256,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/AnyScript/Mauritius
+    {     31,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  128,1 , 2309,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Namibia
+    {     31,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  128,1 , 2362,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NewZealand
+    {     31,     0,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NorthernMarianaIslands
+    {     31,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  151,1 , 2424,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/AnyScript/Pakistan
+    {     31,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 2477,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Philippines
+    {     31,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  128,1 , 2519,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Singapore
+    {     31,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2575,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/SouthAfrica
+    {     31,     0,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  128,1 , 2636,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/TrinidadAndTobago
+    {     31,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 2722,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/UnitedKingdom
+    {     31,     0,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStatesMinorOutlyingIslands
+    {     31,     0,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/USVirginIslands
+    {     31,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Zimbabwe
+    {     31,     3,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 3818,80 , 3898,154 , 4052,36 , 3870,80 , 3950,154 , 4104,36 , 2403,49 , 2452,85 , 2537,21 , 2403,49 , 2452,85 , 2537,21 , 70,4 , 70,4 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Deseret/UnitedStates
+    {     33,     0,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 112,8 , 112,8 , 332,8 , 502,18 , 165,4 , 263,9 , 4088,59 , 4147,91 , 4238,24 , 4140,59 , 4199,91 , 4290,24 , 2558,14 , 2572,63 , 2558,14 , 2558,14 , 2572,63 , 2558,14 , 74,14 , 74,16 , {69,69,75},  142,2 , 2796,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/AnyScript/Estonia
+    {     34,     0,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 543,8 , 82,17 , 37,5 , 8,10 , 4262,48 , 4310,83 , 134,24 , 4314,48 , 4362,83 , 320,24 , 2635,28 , 2663,74 , 2737,14 , 2635,28 , 2663,74 , 2737,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 2837,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/AnyScript/FaroeIslands
+    {     36,     0,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 586,8 , 594,17 , 272,4 , 276,9 , 4393,69 , 4462,105 , 4567,24 , 4445,129 , 4445,129 , 4574,24 , 2751,21 , 2772,67 , 2839,14 , 2751,21 , 2853,81 , 2839,14 , 88,3 , 90,3 , {69,85,82},  113,1 , 2879,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/AnyScript/Finland
+    {     37,     0,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/France
+    {     37,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 551,7 , 99,16 , 37,5 , 285,23 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Belgium
+    {     37,     0,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Cameroon
+    {     37,     0,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 115,8 , 99,16 , 37,5 , 239,24 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2955,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/AnyScript/Canada
+    {     37,     0,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/CentralAfricanRepublic
+    {     37,     0,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/IvoryCoast
+    {     37,     0,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Guadeloupe
+    {     37,     0,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {71,78,70},  160,3 , 3068,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Guinea
+    {     37,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Luxembourg
+    {     37,     0,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3116,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Madagascar
+    {     37,     0,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Mali
+    {     37,     0,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Martinique
+    {     37,     0,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Monaco
+    {     37,     0,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Niger
+    {     37,     0,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Reunion
+    {     37,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Senegal
+    {     37,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 120,8 , 120,8 , 332,8 , 10,17 , 37,5 , 308,14 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,72,70},  163,3 , 3170,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/AnyScript/Switzerland
+    {     37,     0,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Barthelemy
+    {     37,     0,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Martin
+    {     40,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 4739,48 , 4787,87 , 4874,24 , 4746,48 , 4794,87 , 4881,24 , 3035,28 , 3063,49 , 3112,14 , 3035,28 , 3063,49 , 3112,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/AnyScript/Spain
+    {     41,     0,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 4898,48 , 4946,99 , 5045,24 , 4905,48 , 4953,99 , 5052,24 , 3126,28 , 3154,62 , 3216,14 , 3126,28 , 3154,62 , 3216,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3215,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/AnyScript/Georgia
+    {     42,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Germany
+    {     42,     0,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 611,19 , 37,5 , 8,10 , 5069,52 , 5204,83 , 134,24 , 5207,48 , 5255,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Austria
+    {     42,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 551,7 , 99,16 , 37,5 , 239,24 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3353,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Belgium
+    {     42,     0,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Liechtenstein
+    {     42,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Luxembourg
+    {     42,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Switzerland
+    {     43,     0,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Greece
+    {     43,     0,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Cyprus
+    {     44,     0,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 146,11 , 0,6 , 0,6 , 146,11 , 72,10 , 82,17 , 18,7 , 25,12 , 3550,48 , 5476,96 , 134,24 , 5527,48 , 5575,96 , 320,24 , 3478,28 , 3506,98 , 3604,14 , 3478,28 , 3506,98 , 3604,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 3313,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/AnyScript/Greenland
+    {     46,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 157,9 , 157,9 , 630,7 , 203,18 , 322,8 , 330,13 , 5572,67 , 5639,87 , 5726,31 , 5671,67 , 5738,87 , 5825,31 , 3618,32 , 3650,53 , 3703,19 , 3618,32 , 3650,53 , 3703,19 , 100,14 , 103,14 , {73,78,82},  166,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/AnyScript/India
+    {     47,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Ghana
+    {     47,     0,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/AnyScript/Niger
+    {     47,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Nigeria
+    {     47,     0,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/AnyScript/Sudan
+    {     47,     1,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3405,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Arabic/Nigeria
+    {     47,     1,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Arabic/Sudan
+    {     47,     7,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Ghana
+    {     47,     7,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Latin/Niger
+    {     47,     7,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Nigeria
+    {     48,     0,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 637,18 , 37,5 , 8,10 , 6068,58 , 6126,72 , 1483,27 , 6167,48 , 6215,72 , 134,27 , 3897,46 , 3943,65 , 4008,14 , 3897,46 , 3943,65 , 4008,14 , 114,6 , 117,5 , {73,76,83},  172,1 , 3418,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/AnyScript/Israel
+    {     49,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 166,8 , 166,8 , 655,6 , 10,17 , 18,7 , 25,12 , 6198,75 , 6198,75 , 6273,30 , 6287,75 , 6287,75 , 6362,30 , 4022,38 , 4060,57 , 4117,19 , 4022,38 , 4060,57 , 4117,19 , 120,9 , 122,7 , {73,78,82},  173,3 , 3439,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/AnyScript/India
+    {     50,     0,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 0,6 , 0,6 , 174,8 , 174,8 , 661,11 , 672,19 , 165,4 , 195,9 , 6303,64 , 6367,98 , 6465,25 , 6392,64 , 6456,98 , 6554,25 , 4136,19 , 4155,52 , 4207,17 , 4136,19 , 4155,52 , 4207,17 , 129,3 , 129,3 , {72,85,70},  176,2 , 3458,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/AnyScript/Hungary
+    {     51,     0,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 85,8 , 85,8 , 586,8 , 502,18 , 37,5 , 8,10 , 6490,48 , 6538,82 , 6620,24 , 6579,48 , 6627,82 , 6709,24 , 4224,28 , 4252,81 , 4333,14 , 4224,28 , 4252,81 , 4347,14 , 132,4 , 132,4 , {73,83,75},  142,2 , 3478,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/AnyScript/Iceland
+    {     52,     0,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 182,11 , 193,9 , 27,8 , 123,18 , 150,5 , 276,9 , 6644,48 , 6692,87 , 134,24 , 6733,48 , 6781,87 , 320,24 , 4361,28 , 4389,43 , 4432,14 , 4361,28 , 4389,43 , 4432,14 , 0,2 , 0,2 , {73,68,82},  178,2 , 3526,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/AnyScript/Indonesia
+    {     57,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 6779,62 , 6841,107 , 6948,24 , 6868,62 , 6930,107 , 7037,24 , 4446,37 , 4483,75 , 4558,14 , 4446,37 , 4483,75 , 4558,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 3549,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/AnyScript/Ireland
+    {     58,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 99,16 , 37,5 , 8,10 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/AnyScript/Italy
+    {     58,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 202,8 , 210,7 , 332,8 , 10,17 , 37,5 , 308,14 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {67,72,70},  0,0 , 3560,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/AnyScript/Switzerland
+    {     59,     0,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 68,5 , 68,5 , 221,8 , 429,13 , 165,4 , 343,10 , 3223,39 , 3223,39 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 4728,14 , 4742,28 , 4728,14 , 4728,14 , 4742,28 , 4728,14 , 138,2 , 138,2 , {74,80,89},  127,1 , 3582,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/AnyScript/Japan
+    {     61,     0,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 217,11 , 217,11 , 655,6 , 99,16 , 322,8 , 330,13 , 7138,86 , 7138,86 , 7224,31 , 7227,86 , 7227,86 , 7313,31 , 4770,28 , 4798,53 , 4851,19 , 4770,28 , 4798,53 , 4851,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/AnyScript/India
+    {     63,     0,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/AnyScript/Kazakhstan
+    {     63,     2,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Cyrillic/Kazakhstan
+    {     64,     0,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 7399,60 , 7459,101 , 1483,27 , 7488,60 , 7548,101 , 134,27 , 4952,35 , 4987,84 , 798,14 , 4952,35 , 4987,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  186,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/AnyScript/Rwanda
+    {     65,     0,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  188,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/AnyScript/Kyrgyzstan
+    {     66,     0,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 713,9 , 722,16 , 353,7 , 360,13 , 7560,39 , 7560,39 , 7560,39 , 7649,39 , 7649,39 , 7649,39 , 5071,14 , 5085,28 , 5071,14 , 5071,14 , 5085,28 , 5071,14 , 142,2 , 142,2 , {75,82,87},  191,1 , 3592,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/AnyScript/RepublicOfKorea
+    {     67,     0,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/AnyScript/Iran
+    {     67,     0,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/AnyScript/Iraq
+    {     67,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/AnyScript/SyrianArabRepublic
+    {     67,     0,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/AnyScript/Turkey
+    {     67,     1,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Arabic/Iran
+    {     67,     1,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Arabic/Iraq
+    {     67,     7,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/Latin/SyrianArabRepublic
+    {     67,     7,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Latin/Turkey
+    {     69,     0,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 738,18 , 165,4 , 373,21 , 7718,63 , 7781,75 , 1483,27 , 7807,63 , 7870,75 , 134,27 , 5242,24 , 5266,57 , 798,14 , 5242,24 , 5266,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  197,1 , 3605,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/AnyScript/Lao
+    {     71,     0,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 228,8 , 228,8 , 332,8 , 756,26 , 37,5 , 8,10 , 7856,65 , 7921,101 , 134,24 , 7945,65 , 8010,101 , 320,24 , 5323,21 , 5344,72 , 5416,14 , 5323,21 , 5344,72 , 5416,14 , 144,14 , 144,11 , {76,86,76},  198,2 , 3615,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/AnyScript/Latvia
+    {     72,     0,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  200,1 , 3635,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/AnyScript/DemocraticRepublicOfCongo
+    {     72,     0,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  201,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/AnyScript/PeoplesRepublicOfCongo
+    {     73,     0,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 236,8 , 236,8 , 72,10 , 782,26 , 37,5 , 8,10 , 8264,69 , 8333,96 , 8429,24 , 8353,48 , 8401,96 , 8497,24 , 5551,17 , 5568,89 , 5657,14 , 5671,21 , 5568,89 , 5657,14 , 158,9 , 155,6 , {76,84,76},  205,2 , 3657,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/AnyScript/Lithuania
+    {     74,     0,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 808,7 , 123,18 , 37,5 , 8,10 , 8453,63 , 8516,85 , 8601,24 , 8521,63 , 8584,85 , 8669,24 , 5692,34 , 5726,54 , 1458,14 , 5692,34 , 5726,54 , 1458,14 , 167,10 , 161,8 , {77,75,68},  0,0 , 3711,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/AnyScript/Macedonia
+    {     75,     0,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 8625,48 , 8673,92 , 134,24 , 8693,48 , 8741,92 , 320,24 , 5780,34 , 5814,60 , 5874,14 , 5780,34 , 5814,60 , 5874,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3734,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/AnyScript/Madagascar
+    {     76,     0,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 815,16 , 394,4 , 25,12 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  207,2 , 3747,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/Malaysia
+    {     76,     0,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 564,12 , 165,4 , 398,14 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/BruneiDarussalam
+    {     77,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 244,12 , 244,12 , 27,8 , 831,18 , 18,7 , 25,12 , 8896,66 , 8962,101 , 9063,31 , 8964,66 , 9030,101 , 9131,31 , 5959,47 , 6006,70 , 6076,22 , 5959,47 , 6006,70 , 6076,22 , 177,6 , 169,10 , {73,78,82},  209,2 , 3770,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/AnyScript/India
+    {     78,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 849,23 , 37,5 , 8,10 , 9094,48 , 9142,86 , 9228,24 , 9162,48 , 9210,86 , 9296,24 , 6098,28 , 6126,63 , 6189,14 , 6098,28 , 6126,63 , 6189,14 , 183,2 , 179,2 , {69,85,82},  113,1 , 3816,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/AnyScript/Malta
+    {     79,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9252,83 , 9252,83 , 1483,27 , 9320,83 , 9320,83 , 134,27 , 6203,48 , 6203,48 , 798,14 , 6203,48 , 6203,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/AnyScript/NewZealand
+    {     80,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 256,11 , 267,9 , 655,6 , 99,16 , 412,7 , 419,12 , 9335,86 , 9335,86 , 9421,32 , 9403,86 , 9403,86 , 9489,32 , 6251,32 , 6283,53 , 4117,19 , 6251,32 , 6283,53 , 4117,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/AnyScript/India
+    {     82,     0,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/AnyScript/Mongolia
+    {     82,     0,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/AnyScript/China
+    {     82,     2,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Cyrillic/Mongolia
+    {     82,     8,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/Mongolian/China
+    {     84,     0,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9623,85 , 9708,27 , 9635,56 , 9691,85 , 9776,27 , 6400,33 , 6433,54 , 6487,14 , 6400,33 , 6433,54 , 6487,14 , 185,14 , 181,14 , {78,80,82},  218,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/AnyScript/Nepal
+    {     84,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9735,80 , 9708,27 , 9635,56 , 9803,80 , 9776,27 , 6400,33 , 6501,54 , 6487,14 , 6400,33 , 6501,54 , 6487,14 , 120,9 , 122,7 , {73,78,82},  145,2 , 3827,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/AnyScript/India
+    {     85,     0,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 9815,59 , 9874,83 , 134,24 , 9883,59 , 9942,83 , 320,24 , 6555,28 , 2244,51 , 2295,14 , 6583,35 , 2244,51 , 2295,14 , 0,2 , 0,2 , {78,79,75},  142,2 , 3876,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/AnyScript/Norway
+    {     86,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9957,83 , 9957,83 , 1483,27 , 10025,83 , 10025,83 , 134,27 , 6618,57 , 6618,57 , 798,14 , 6618,57 , 6618,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/AnyScript/France
+    {     87,     0,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 10,17 , 18,7 , 25,12 , 10040,89 , 10040,89 , 10129,32 , 10108,89 , 10108,89 , 10197,32 , 6675,33 , 6708,54 , 6762,18 , 6675,33 , 6708,54 , 6762,18 , 140,2 , 140,2 , {73,78,82},  145,2 , 3920,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/AnyScript/India
+    {     88,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 872,20 , 165,4 , 447,11 , 10161,68 , 10161,68 , 1483,27 , 10229,68 , 10229,68 , 134,27 , 6780,49 , 6780,49 , 798,14 , 6780,49 , 6780,49 , 798,14 , 199,4 , 195,4 , {65,70,78},  222,1 , 3931,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/AnyScript/Afghanistan
+    {     89,     0,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10229,71 , 10300,70 , 10370,25 , 10297,71 , 10368,73 , 10441,25 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {73,82,82},  223,1 , 3944,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Iran
+    {     89,     0,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10395,63 , 10300,70 , 10458,24 , 10466,63 , 10529,68 , 10597,24 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {65,70,78},  222,1 , 3961,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Afghanistan
+    {     90,     0,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 892,10 , 10,17 , 37,5 , 8,10 , 10482,48 , 10530,97 , 10627,24 , 10621,48 , 10669,99 , 10768,24 , 6843,34 , 6877,59 , 6936,14 , 6843,34 , 6877,59 , 6936,14 , 0,2 , 0,2 , {80,76,78},  224,2 , 3984,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/AnyScript/Poland
+    {     91,     0,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10651,48 , 10699,89 , 134,24 , 10792,48 , 10840,89 , 320,24 , 6950,28 , 6978,79 , 7057,14 , 6950,28 , 6978,79 , 7057,14 , 213,17 , 209,18 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Portugal
+    {     91,     0,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {66,82,76},  226,2 , 4044,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Brazil
+    {     91,     0,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 4098,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/AnyScript/GuineaBissau
+    {     91,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 4160,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Mozambique
+    {     92,     0,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/AnyScript/India
+    {     92,     0,   163,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/AnyScript/Pakistan
+    {     92,     1,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Arabic/Pakistan
+    {     92,     4,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/Gurmukhi/India
+    {     94,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 502,18 , 37,5 , 8,10 , 11087,67 , 11154,92 , 11246,24 , 11228,67 , 11295,92 , 11387,24 , 7303,23 , 7326,56 , 7382,14 , 7303,23 , 7326,56 , 7382,14 , 140,2 , 231,2 , {67,72,70},  0,0 , 4257,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/AnyScript/Switzerland
+    {     95,     0,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4277,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Moldova
+    {     95,     0,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {82,79,78},  235,3 , 4331,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Romania
+    {     96,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {82,85,66},  238,4 , 4347,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/RussianFederation
+    {     96,     0,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4436,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Moldova
+    {     96,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 37,5 , 8,10 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {85,65,72},  242,1 , 4457,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Ukraine
+    {     98,     0,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 11618,48 , 11666,91 , 11757,24 , 11762,48 , 11810,91 , 11901,24 , 7624,28 , 7652,66 , 7718,14 , 7624,28 , 7652,66 , 7718,14 , 235,2 , 233,2 , {88,65,70},  201,4 , 4481,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/AnyScript/CentralAfricanRepublic
+    {     99,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  180,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/AnyScript/India
+    {    100,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/SerbiaAndMontenegro
+    {    100,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/BosniaAndHerzegowina
+    {    100,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Yugoslavia
+    {    100,     0,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Montenegro
+    {    100,     0,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/AnyScript/Serbia
+    {    100,     2,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/BosniaAndHerzegowina
+    {    100,     2,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Yugoslavia
+    {    100,     2,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/SerbiaAndMontenegro
+    {    100,     2,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {69,85,82},  113,1 , 4799,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Montenegro
+    {    100,     2,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Cyrillic/Serbia
+    {    100,     7,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/BosniaAndHerzegowina
+    {    100,     7,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Yugoslavia
+    {    100,     7,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/SerbiaAndMontenegro
+    {    100,     7,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Montenegro
+    {    100,     7,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {82,83,68},  252,4 , 5044,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Latin/Serbia
+    {    101,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/SerbiaAndMontenegro
+    {    101,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/BosniaAndHerzegowina
+    {    101,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/Yugoslavia
+    {    102,     0,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/Lesotho
+    {    102,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/SouthAfrica
+    {    103,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12299,48 , 12347,117 , 1483,27 , 12443,48 , 12491,117 , 134,27 , 8078,27 , 8105,64 , 798,14 , 8078,27 , 8105,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/AnyScript/SouthAfrica
+    {    104,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 12464,47 , 12511,100 , 12611,24 , 12608,47 , 12655,100 , 12755,24 , 8169,32 , 8201,55 , 8256,14 , 8169,32 , 8201,55 , 8256,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 5115,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/AnyScript/Zimbabwe
+    {    106,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 576,10 , 988,17 , 18,7 , 25,12 , 12635,54 , 12689,92 , 12781,32 , 12779,54 , 12833,92 , 12925,32 , 8270,30 , 8300,62 , 8362,19 , 8270,30 , 8300,62 , 8362,19 , 255,5 , 249,4 , {76,75,82},  259,5 , 5137,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/AnyScript/SriLanka
+    {    107,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/SouthAfrica
+    {    107,     0,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  264,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/Swaziland
+    {    108,     0,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 0,6 , 0,6 , 78,7 , 78,7 , 586,8 , 502,18 , 165,4 , 195,9 , 12975,48 , 13023,82 , 12122,24 , 13119,48 , 13167,89 , 12266,24 , 8476,21 , 8497,52 , 8549,14 , 8476,21 , 8497,52 , 8549,14 , 260,10 , 253,9 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/AnyScript/Slovakia
+    {    109,     0,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 0,6 , 0,6 , 276,8 , 276,8 , 1005,9 , 611,19 , 37,5 , 8,10 , 11993,48 , 13105,86 , 12122,24 , 12137,48 , 13256,86 , 12266,24 , 8563,28 , 8591,52 , 8643,14 , 8563,28 , 8591,52 , 8643,14 , 62,4 , 262,4 , {69,85,82},  113,1 , 5156,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/AnyScript/Slovenia
+    {    110,     0,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {83,79,83},  265,3 , 5184,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Somalia
+    {    110,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {68,74,70},  5,3 , 5206,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Djibouti
+    {    110,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {69,84,66},  0,2 , 5227,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Ethiopia
+    {    110,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Kenya
+    {    111,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Spain
+    {    111,     0,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 517,14 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {65,82,83},  128,1 , 5249,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/Argentina
+    {    111,     0,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {66,79,66},  268,2 , 5300,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Bolivia
+    {    111,     0,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 543,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,76,80},  128,1 , 5335,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Chile
+    {    111,     0,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,79,80},  128,1 , 5380,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Colombia
+    {    111,     0,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,82,67},  270,1 , 5434,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/CostaRica
+    {    111,     0,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {68,79,80},  271,3 , 5501,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/DominicanRepublic
+    {    111,     0,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Ecuador
+    {    111,     0,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  256,3 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/ElSalvador
+    {    111,     0,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {88,65,70},  201,4 , 5625,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/EquatorialGuinea
+    {    111,     0,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {71,84,81},  274,1 , 5647,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Guatemala
+    {    111,     0,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1040,27 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {72,78,76},  275,1 , 5717,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Honduras
+    {    111,     0,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {77,88,78},  128,1 , 5777,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Mexico
+    {    111,     0,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {78,73,79},  276,2 , 5825,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Nicaragua
+    {    111,     0,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,65,66},  278,3 , 5906,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Panama
+    {    111,     0,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,89,71},  281,1 , 5960,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Paraguay
+    {    111,     0,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 531,15 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,69,78},  282,3 , 6021,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Peru
+    {    111,     0,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/PuertoRico
+    {    111,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 558,6 , 1014,26 , 18,7 , 25,12 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/UnitedStates
+    {    111,     0,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,89,85},  128,1 , 6083,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Uruguay
+    {    111,     0,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {86,69,70},  285,5 , 6131,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Venezuela
+    {    111,     0,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4506,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/LatinAmericaAndTheCaribbean
+    {    113,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {75,69,83},  2,3 , 6217,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/AnyScript/Kenya
+    {    113,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {84,90,83},  290,3 , 6241,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/AnyScript/Tanzania
+    {    114,     0,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {83,69,75},  142,2 , 6268,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Sweden
+    {    114,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {69,85,82},  113,1 , 6313,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Finland
+    {    116,     0,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/AnyScript/Tajikistan
+    {    116,     2,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Cyrillic/Tajikistan
+    {    117,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {73,78,82},  293,2 , 6345,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/AnyScript/India
+    {    117,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {76,75,82},  295,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/AnyScript/SriLanka
+    {    118,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/AnyScript/RussianFederation
+    {    119,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 313,12 , 325,11 , 543,8 , 99,16 , 18,7 , 25,12 , 14127,86 , 14127,86 , 14213,30 , 14278,86 , 14278,86 , 14364,30 , 9154,32 , 9186,60 , 9246,18 , 9154,32 , 9186,60 , 9246,18 , 282,1 , 278,2 , {73,78,82},  299,3 , 6358,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/AnyScript/India
+    {    120,     0,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 336,5 , 336,5 , 341,8 , 349,7 , 364,8 , 1108,19 , 165,4 , 546,27 , 14243,63 , 14306,98 , 14243,63 , 14394,63 , 14457,98 , 14555,24 , 9264,23 , 9287,68 , 9355,14 , 9264,23 , 9287,68 , 9355,14 , 283,10 , 280,10 , {84,72,66},  302,1 , 6371,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/AnyScript/Thailand
+    {    121,     0,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {67,78,89},  215,3 , 6384,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/AnyScript/China
+    {    121,     0,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {73,78,82},  145,2 , 6397,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/AnyScript/India
+    {    122,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1127,23 , 18,7 , 25,12 , 14625,46 , 14671,54 , 1034,24 , 14800,46 , 14846,54 , 1061,24 , 9516,29 , 9516,29 , 9545,14 , 9516,29 , 9516,29 , 9545,14 , 300,7 , 298,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Eritrea
+    {    122,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9559,29 , 9559,29 , 9545,14 , 9559,29 , 9559,29 , 9545,14 , 300,7 , 298,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Ethiopia
+    {    123,     0,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 99,16 , 37,5 , 8,10 , 14725,51 , 14776,87 , 14863,24 , 14900,51 , 14951,87 , 15038,24 , 9588,29 , 9617,60 , 9677,14 , 9588,29 , 9617,60 , 9677,14 , 0,2 , 0,2 , {84,79,80},  303,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/AnyScript/Tonga
+    {    124,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14887,48 , 14935,122 , 1483,27 , 15062,48 , 15110,122 , 134,27 , 9691,27 , 9718,72 , 798,14 , 9691,27 , 9718,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/AnyScript/SouthAfrica
+    {    125,     0,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 356,8 , 356,8 , 929,10 , 1173,17 , 37,5 , 8,10 , 15057,48 , 15105,75 , 15180,24 , 15232,48 , 15280,75 , 15355,24 , 9790,28 , 9818,54 , 9872,14 , 9790,28 , 9818,54 , 9872,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 6419,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/AnyScript/Turkey
+    {    128,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/AnyScript/China
+    {    128,     1,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/Arabic/China
+    {    129,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 364,8 , 364,8 , 332,8 , 1190,22 , 37,5 , 8,10 , 15204,48 , 15252,95 , 15347,24 , 15379,67 , 15446,87 , 15533,24 , 9886,21 , 9907,56 , 9963,14 , 9886,21 , 9907,56 , 9963,14 , 307,2 , 305,2 , {85,65,72},  242,1 , 6437,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/AnyScript/Ukraine
+    {    130,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 6486,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/AnyScript/India
+    {    130,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {80,75,82},  305,4 , 6504,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/AnyScript/Pakistan
+    {    131,     0,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/AnyScript/Uzbekistan
+    {    131,     0,     1,    44,    46,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/AnyScript/Afghanistan
+    {    131,     1,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Arabic/Afghanistan
+    {    131,     2,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Cyrillic/Uzbekistan
+    {    131,     7,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 15669,52 , 15438,115 , 15721,24 , 15787,52 , 15624,115 , 15839,24 , 10143,34 , 10177,61 , 10238,14 , 10143,34 , 10177,61 , 10238,14 , 0,2 , 0,2 , {85,90,83},  314,4 , 6559,23 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Latin/Uzbekistan
+    {    132,     0,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 372,8 , 372,8 , 141,10 , 1263,31 , 37,5 , 8,10 , 15745,75 , 15820,130 , 1483,27 , 15863,75 , 15938,130 , 134,27 , 10252,33 , 10285,55 , 10340,21 , 10252,33 , 10285,55 , 10340,21 , 309,2 , 307,2 , {86,78,68},  318,1 , 6582,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/AnyScript/VietNam
+    {    134,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 15950,53 , 16003,87 , 16090,24 , 16068,62 , 16130,86 , 16216,24 , 10361,29 , 10390,77 , 10467,14 , 10481,30 , 10390,77 , 10467,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 6593,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/AnyScript/UnitedKingdom
+    {    135,     0,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/AnyScript/Senegal
+    {    135,     7,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Latin/Senegal
+    {    136,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 16114,48 , 16162,91 , 1483,27 , 16240,48 , 16288,91 , 134,27 , 10511,28 , 10539,61 , 798,14 , 10511,28 , 10539,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/AnyScript/SouthAfrica
+    {    138,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 16253,73 , 16326,121 , 1483,27 , 16379,73 , 16452,121 , 134,27 , 10600,44 , 10644,69 , 798,14 , 10600,44 , 10644,69 , 798,14 , 311,5 , 309,5 , {78,71,78},  171,1 , 6621,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/AnyScript/Nigeria
+    {    140,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 82,17 , 18,7 , 25,12 , 16447,48 , 16495,104 , 134,24 , 16573,48 , 16621,90 , 320,24 , 10713,28 , 10741,68 , 10809,14 , 10713,28 , 10741,68 , 10809,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/AnyScript/SouthAfrica
+    {    141,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 4262,48 , 9874,83 , 134,24 , 4314,48 , 9942,83 , 320,24 , 10823,28 , 10851,51 , 2295,14 , 10823,28 , 10851,51 , 2295,14 , 316,9 , 314,11 , {78,79,75},  142,2 , 6655,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/AnyScript/Norway
+    {    142,     0,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 16599,48 , 16647,83 , 1483,27 , 16711,48 , 16759,83 , 134,27 , 10902,28 , 10930,58 , 798,14 , 10902,28 , 10930,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  250,2 , 6697,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/AnyScript/BosniaAndHerzegowina
+    {    143,     0,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  319,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/AnyScript/Maldives
+    {    144,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 16730,102 , 16832,140 , 1483,27 , 16842,102 , 16944,140 , 134,27 , 10988,30 , 11018,57 , 798,14 , 10988,30 , 11018,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/AnyScript/UnitedKingdom
+    {    145,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 16972,46 , 17018,124 , 1483,27 , 17084,46 , 17130,124 , 134,27 , 11075,28 , 11103,60 , 798,14 , 11075,28 , 11103,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/AnyScript/UnitedKingdom
+    {    146,     0,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17142,48 , 17190,192 , 1483,27 , 17254,48 , 17302,192 , 134,27 , 11163,28 , 11191,49 , 11240,14 , 11163,28 , 11191,49 , 11240,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/AnyScript/Ghana
+    {    147,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 18,7 , 25,12 , 17382,87 , 17382,87 , 1483,27 , 17494,87 , 17494,87 , 134,27 , 6251,32 , 11254,55 , 798,14 , 6251,32 , 11254,55 , 798,14 , 327,5 , 327,5 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/AnyScript/India
+    {    148,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17469,48 , 17517,94 , 1483,27 , 17581,48 , 17629,94 , 134,27 , 11309,26 , 11335,34 , 798,14 , 11309,26 , 11335,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/AnyScript/Ghana
+    {    149,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17611,48 , 17659,86 , 1483,27 , 17723,48 , 17771,86 , 134,27 , 11369,29 , 11398,57 , 798,14 , 11369,29 , 11398,57 , 798,14 , 332,4 , 332,4 , {78,71,78},  171,1 , 6723,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/AnyScript/Nigeria
+    {    150,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17745,48 , 17793,189 , 17982,24 , 17857,48 , 17905,189 , 18094,24 , 11455,28 , 11483,74 , 11557,14 , 11455,28 , 11483,74 , 11557,14 , 336,9 , 336,7 , {75,69,83},  2,3 , 6735,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/AnyScript/Kenya
+    {    151,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 1294,13 , 394,4 , 25,12 , 18006,65 , 18006,65 , 1483,27 , 18118,65 , 18118,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/AnyScript/SyrianArabRepublic
+    {    152,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1307,22 , 18,7 , 25,12 , 18071,47 , 18118,77 , 18195,24 , 18183,47 , 18230,77 , 18307,24 , 11571,26 , 11597,43 , 11640,14 , 11571,26 , 11597,43 , 11640,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/AnyScript/Eritrea
+    {    153,     0,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Eritrea
+    {    153,     0,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Ethiopia
+    {    154,     0,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18292,48 , 18340,124 , 1483,27 , 18404,48 , 18452,124 , 134,27 , 11697,28 , 11725,54 , 798,14 , 11697,28 , 11725,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/AnyScript/IvoryCoast
+    {    155,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11779,28 , 11807,51 , 11858,14 , 11779,28 , 11807,51 , 11858,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/AnyScript/Ethiopia
+    {    156,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18464,59 , 18523,129 , 1483,27 , 18576,59 , 18635,129 , 134,27 , 11872,35 , 11907,87 , 798,14 , 11872,35 , 11907,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6758,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/AnyScript/Nigeria
+    {    157,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11994,27 , 12021,41 , 12062,14 , 11994,27 , 12021,41 , 12062,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/AnyScript/Eritrea
+    {    158,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18652,57 , 18709,178 , 1483,27 , 18764,57 , 18821,178 , 134,27 , 12076,28 , 12104,44 , 798,14 , 12076,28 , 12104,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6769,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/AnyScript/Nigeria
+    {    159,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1373,27 , 37,5 , 8,10 , 18887,48 , 18935,77 , 19012,24 , 18999,48 , 19047,77 , 19124,24 , 12148,28 , 12176,50 , 3021,14 , 12148,28 , 12176,50 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/AnyScript/Italy
+    {    160,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19036,48 , 19084,111 , 1483,27 , 19148,48 , 19196,111 , 134,27 , 12226,27 , 12253,70 , 798,14 , 12226,27 , 12253,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/AnyScript/SouthAfrica
+    {    161,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/AnyScript/Ghana
+    {    161,     0,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {88,79,70},  157,3 , 6783,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/AnyScript/Togo
+    {    162,     0,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12413,27 , 12413,27 , 12440,14 , 12413,27 , 12413,27 , 12440,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/AnyScript/Ethiopia
+    {    163,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 10,17 , 18,7 , 25,12 , 19354,59 , 19413,95 , 1483,27 , 19466,59 , 19525,95 , 134,27 , 12454,21 , 12475,57 , 798,14 , 12454,21 , 12475,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/AnyScript/UnitedStates
+    {    164,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 19508,48 , 19556,153 , 1483,27 , 19620,48 , 19668,153 , 134,27 , 12532,28 , 12560,42 , 798,14 , 12532,28 , 12560,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6794,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/AnyScript/Nigeria
+    {    165,     0,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19709,48 , 19757,91 , 1483,27 , 19821,48 , 19869,91 , 134,27 , 12602,28 , 12630,67 , 798,14 , 12602,28 , 12630,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6805,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/AnyScript/Malawi
+    {    166,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 380,8 , 380,8 , 558,6 , 1422,18 , 37,5 , 8,10 , 19848,48 , 19896,88 , 19984,24 , 19960,48 , 20008,88 , 20096,24 , 12697,28 , 12725,55 , 12780,14 , 12794,28 , 12725,55 , 12780,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 6827,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/AnyScript/Philippines
+    {    167,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 20008,48 , 20056,86 , 134,24 , 5076,48 , 20120,86 , 320,24 , 12822,28 , 12850,63 , 3311,14 , 12822,28 , 12850,63 , 3311,14 , 91,5 , 343,4 , {67,72,70},  0,0 , 6849,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/AnyScript/Switzerland
+    {    168,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 20142,38 , 1483,27 , 134,27 , 20206,38 , 134,27 , 12913,21 , 12934,28 , 12962,14 , 12913,21 , 12934,28 , 12962,14 , 345,2 , 347,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/AnyScript/China
+    {    169,     0,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  321,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/AnyScript/Guinea
+    {    169,     0,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/AnyScript/Liberia
+    {    170,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/AnyScript/Germany
+    {    171,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20180,48 , 20228,100 , 1483,27 , 20244,48 , 20292,100 , 134,27 , 12976,27 , 13003,66 , 798,14 , 12976,27 , 13003,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/AnyScript/SouthAfrica
+    {    172,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20328,48 , 20376,94 , 1483,27 , 20392,48 , 20440,94 , 134,27 , 13069,27 , 13096,63 , 798,14 , 13069,27 , 13096,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/AnyScript/SouthAfrica
+    {    173,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20470,85 , 20555,145 , 20700,24 , 20534,85 , 20619,145 , 20764,24 , 13159,33 , 13192,65 , 13257,14 , 13159,33 , 13192,65 , 13257,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 6888,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Finland
+    {    173,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20724,59 , 20555,145 , 20700,24 , 20788,59 , 20619,145 , 20764,24 , 13159,33 , 13271,75 , 13346,14 , 13159,33 , 13271,75 , 13346,14 , 0,2 , 0,2 , {78,79,75},  323,3 , 6911,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Norway
+    {    174,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20783,48 , 20831,142 , 20973,24 , 20847,48 , 20895,142 , 21037,24 , 13360,28 , 13388,172 , 13560,14 , 13360,28 , 13388,172 , 13560,14 , 0,2 , 0,2 , {84,87,68},  135,3 , 6932,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/AnyScript/Taiwan
+    {    175,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 20997,48 , 21045,88 , 21133,24 , 21061,48 , 21109,88 , 21197,24 , 13574,28 , 13602,62 , 13664,14 , 13574,28 , 13602,62 , 13664,14 , 347,5 , 349,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/AnyScript/Kenya
+    {    176,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21157,48 , 21205,221 , 21426,24 , 21221,48 , 21269,221 , 21490,24 , 13678,28 , 13706,106 , 13812,14 , 13678,28 , 13706,106 , 13812,14 , 352,10 , 359,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/AnyScript/Kenya
+    {    177,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 21450,48 , 21498,77 , 21575,24 , 21514,48 , 21562,77 , 21639,24 , 13826,28 , 13854,59 , 13913,14 , 13826,28 , 13854,59 , 13913,14 , 362,6 , 369,7 , {88,79,70},  157,3 , 6974,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/AnyScript/Senegal
+    {    178,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21599,48 , 21647,185 , 21832,24 , 21663,48 , 21711,185 , 21896,24 , 13927,28 , 13955,63 , 14018,14 , 13927,28 , 13955,63 , 14018,14 , 368,6 , 376,8 , {75,69,83},  2,3 , 7000,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/AnyScript/Kenya
+    {    179,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21856,48 , 21904,173 , 22077,24 , 21920,48 , 21968,173 , 22141,24 , 14032,28 , 14060,105 , 14165,14 , 14032,28 , 14060,105 , 14165,14 , 374,7 , 384,5 , {75,69,83},  2,3 , 7023,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/AnyScript/Kenya
+    {    180,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 22101,48 , 22149,88 , 134,24 , 22165,48 , 22213,88 , 320,24 , 14179,28 , 14207,55 , 14262,14 , 14179,28 , 14207,55 , 14262,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/AnyScript/Mozambique
+    {    181,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22237,48 , 22285,112 , 22397,24 , 22301,48 , 22349,112 , 22461,24 , 14276,28 , 14304,50 , 14354,14 , 14276,28 , 14304,50 , 14354,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 7048,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/AnyScript/Zimbabwe
+    {    182,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22421,39 , 22460,194 , 22654,24 , 22485,39 , 22524,194 , 22718,24 , 14368,28 , 14396,65 , 14461,14 , 14368,28 , 14396,65 , 14461,14 , 381,8 , 389,7 , {84,90,83},  290,3 , 7072,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/AnyScript/Tanzania
+    {    183,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/AnyScript/Morocco
+    {    183,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Latin/Morocco
+    {    183,     9,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22831,48 , 22879,81 , 22960,24 , 22895,48 , 22943,81 , 23024,24 , 14553,30 , 14583,47 , 798,14 , 14553,30 , 14583,47 , 798,14 , 395,6 , 404,8 , {77,65,68},  0,0 , 7118,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Tifinagh/Morocco
+    {    184,     0,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22984,48 , 23032,84 , 23116,24 , 23048,48 , 23096,84 , 23180,24 , 14630,30 , 14660,51 , 14711,14 , 14630,30 , 14660,51 , 14711,14 , 401,7 , 412,9 , {68,90,68},  326,2 , 7139,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/AnyScript/Algeria
+    {    185,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/AnyScript/Uganda
+    {    186,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,254 , 23642,24 , 23404,48 , 23452,254 , 23706,24 , 14841,28 , 14869,82 , 14951,14 , 14841,28 , 14869,82 , 14951,14 , 408,7 , 421,7 , {84,90,83},  290,3 , 7186,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/AnyScript/Tanzania
+    {    187,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/AnyScript/Tanzania
+    {    188,     0,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 23753,47 , 23800,92 , 23892,24 , 23817,47 , 23864,92 , 23956,24 , 15069,28 , 15097,44 , 15141,14 , 15069,28 , 15097,44 , 15141,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 7242,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/AnyScript/Mali
+    {    189,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23916,48 , 23964,207 , 24171,24 , 23980,48 , 24028,207 , 24235,24 , 15155,28 , 15183,64 , 15247,14 , 15155,28 , 15183,64 , 15247,14 , 420,2 , 437,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/AnyScript/Kenya
+    {    190,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 18,7 , 25,12 , 24195,36 , 24231,58 , 24289,24 , 24259,36 , 24295,58 , 24353,24 , 15261,28 , 15289,49 , 15338,14 , 15261,28 , 15289,49 , 15338,14 , 422,3 , 439,6 , {85,83,68},  128,1 , 7266,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/AnyScript/UnitedStates
+    {    191,     0,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 24313,47 , 24360,68 , 24428,24 , 24377,47 , 24424,68 , 24492,24 , 15352,27 , 15379,48 , 15427,14 , 15352,27 , 15379,48 , 15427,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 7285,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/AnyScript/Mauritius
+    {    192,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 24452,264 , 134,24 , 13764,48 , 24516,264 , 320,24 , 15441,28 , 15469,133 , 14461,14 , 15441,28 , 15469,133 , 14461,14 , 425,4 , 445,5 , {84,90,83},  290,3 , 7215,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/AnyScript/Tanzania
+    {    193,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24716,83 , 24799,111 , 24910,24 , 24780,83 , 24863,111 , 24974,24 , 15602,36 , 15638,63 , 15701,14 , 15602,36 , 15638,63 , 15701,14 , 429,3 , 450,3 , {84,90,83},  290,3 , 7306,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/AnyScript/Tanzania
+    {    194,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 15715,28 , 15743,66 , 15809,14 , 15715,28 , 15743,66 , 15809,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7335,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/AnyScript/Uganda
+    {    195,     0,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25079,48 , 25127,83 , 25210,24 , 25143,48 , 25191,83 , 25274,24 , 15823,80 , 15823,80 , 798,14 , 15823,80 , 15823,80 , 798,14 , 432,8 , 453,7 , {90,77,75},  331,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/AnyScript/Zambia
+    {    196,     0,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 25234,48 , 25282,86 , 134,24 , 25298,48 , 25346,86 , 320,24 , 15903,28 , 15931,73 , 16004,14 , 15903,28 , 15931,73 , 16004,14 , 140,2 , 140,2 , {67,86,69},  333,3 , 7361,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/AnyScript/CapeVerde
+    {    197,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25368,48 , 25416,86 , 25502,24 , 25432,48 , 25480,86 , 25566,24 , 16018,28 , 16046,51 , 16097,14 , 16018,28 , 16046,51 , 16097,14 , 440,2 , 460,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/AnyScript/Kenya
+    {    198,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25526,48 , 25574,111 , 25685,24 , 25590,48 , 25638,111 , 25749,24 , 16111,28 , 16139,93 , 16232,14 , 16111,28 , 16139,93 , 16232,14 , 442,4 , 462,4 , {75,69,83},  2,3 , 7386,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/AnyScript/Kenya
+    {    199,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25709,136 , 134,24 , 0,48 , 25773,136 , 320,24 , 16246,23 , 16269,92 , 16361,14 , 16246,23 , 16269,92 , 16361,14 , 446,7 , 466,5 , {78,65,68},  12,2 , 7412,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/AnyScript/Namibia
+    {    200,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/AnyScript/Tanzania
+    {    201,     0,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 228,8 , 228,8 , 1440,10 , 1450,23 , 37,5 , 8,10 , 25845,59 , 25904,87 , 134,24 , 25909,59 , 25968,87 , 320,24 , 16375,28 , 16403,72 , 3311,14 , 16375,28 , 16403,72 , 3311,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/AnyScript/Germany
+    {    202,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {75,69,83},  2,3 , 7434,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/AnyScript/Kenya
+    {    202,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {84,90,83},  290,3 , 7459,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/AnyScript/Tanzania
+    {    203,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 16533,35 , 16568,65 , 16633,14 , 16533,35 , 16568,65 , 16633,14 , 462,6 , 477,6 , {85,71,88},  328,3 , 7335,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/AnyScript/Uganda
+    {    204,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26174,48 , 13661,84 , 134,24 , 26238,48 , 13812,84 , 320,24 , 16647,21 , 16668,75 , 85,14 , 16647,21 , 16668,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7487,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/AnyScript/Kenya
+    {    205,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26222,48 , 13661,84 , 134,24 , 26286,48 , 13812,84 , 320,24 , 16743,28 , 8849,60 , 15055,14 , 16743,28 , 8849,60 , 15055,14 , 468,9 , 483,8 , {84,90,83},  290,3 , 7510,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/AnyScript/Tanzania
+    {    206,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {75,69,83},  2,3 , 7538,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/AnyScript/Kenya
+    {    206,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {85,71,88},  328,3 , 7565,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/AnyScript/Uganda
+    {    207,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16882,28 , 16910,56 , 16966,14 , 16882,28 , 16910,56 , 16966,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/AnyScript/Eritrea
+    {    208,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 16980,28 , 17008,53 , 17061,14 , 16980,28 , 17008,53 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/AnyScript/Mali
+    {    209,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/AnyScript/Tanzania
+    {    210,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26594,48 , 26642,186 , 26828,24 , 26658,48 , 26706,186 , 26892,24 , 17075,28 , 17103,69 , 17172,14 , 17075,28 , 17103,69 , 17172,14 , 492,2 , 503,2 , {75,69,83},  2,3 , 7616,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/AnyScript/Kenya
+    {    211,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/AnyScript/Uganda
+    {    212,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/AnyScript/Morocco
+    {    212,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Latin/Morocco
+    {    213,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 17276,28 , 17304,54 , 17061,14 , 17276,28 , 17304,54 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/AnyScript/Mali
+    {    214,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 27010,84 , 134,24 , 13764,48 , 27074,84 , 320,24 , 17358,28 , 17386,63 , 8909,14 , 17358,28 , 17386,63 , 8909,14 , 503,5 , 515,8 , {84,90,83},  290,3 , 6241,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/AnyScript/Tanzania
+    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
+};
+
+static const ushort list_pattern_part_data[] = {
+0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x98f,
+0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x65, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x3ba, 0x3b1, 0x3b9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xa85, 0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe9, 0x73, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x6e, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69,
+0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xd15, 0xd42, 0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x20,
+0x906, 0x923, 0x93f, 0x20, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69,
+0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xc2e, 0xc30, 0xc3f,
+0xc2f, 0xc41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76,
+0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x442, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32
 };
 
 static const ushort date_format_data[] = {
-- 
cgit v0.12


From 849ad907d49e6f6866dc81c0e3a94514bdc69b40 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Mar 2011 18:46:00 +0000
Subject: Fix compile error introduced by merge

Basically the same as f86e014bb6f2754bfed33106021a809ca8c2ce73.
The declarations were appearing twice in the header file after merging

Reviewed-by: Trust Me
---
 src/network/bearer/qnetworksession.h | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
index c08a9bf..688f37e 100644
--- a/src/network/bearer/qnetworksession.h
+++ b/src/network/bearer/qnetworksession.h
@@ -140,9 +140,6 @@ private:
     QNetworkSessionPrivate *d;
 };
 
-Q_DECLARE_METATYPE(QNetworkSession::State);
-Q_DECLARE_METATYPE(QNetworkSession::SessionError);
-
 #ifndef QT_MOBILITY_BEARER
 QT_END_NAMESPACE
 Q_DECLARE_METATYPE(QNetworkSession::State)
-- 
cgit v0.12


From 5a488f8022626e71681ae42662aa9d4785ce6027 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Feb 2011 19:32:55 +0000
Subject: Fix http proxy connections hanging on network error

The http socket engine was hiding errors other than RemoteHostClosedError.
This caused problems, because for other errors, the low level socket is
still closed in the native socket engine. By not emitting the read
notification, the error was never informed to QAbstractSocket and as a
result, the application never gets the disconnected signal.

Reviewed-by: Martin Petersson
---
 src/network/socket/qhttpsocketengine.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 6a025f2..598efb6 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -704,11 +704,10 @@ void QHttpSocketEngine::slotSocketError(QAbstractSocket::SocketError error)
 
     d->state = None;
     setError(error, d->socket->errorString());
-    if (error == QAbstractSocket::RemoteHostClosedError) {
-        emitReadNotification();
-    } else {
+    if (error != QAbstractSocket::RemoteHostClosedError)
         qDebug() << "QHttpSocketEngine::slotSocketError: got weird error =" << error;
-    }
+    //read notification needs to always be emitted, otherwise the higher layer doesn't get the disconnected signal
+    emitReadNotification();
 }
 
 void QHttpSocketEngine::slotSocketStateChanged(QAbstractSocket::SocketState state)
-- 
cgit v0.12


From 9530b97c6024ac69011ceb70dde06f5c71bd31d9 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 1 Mar 2011 16:22:33 +0000
Subject: QTcpSocket autotest fixes

1. Don't crash if qt-test-server isn't found, fail instead
2. symbian: 200ms is too short for the timeout test when using proxies,
   extended to 1000ms
3. Don't crash when the disconnectWhileConnectingNoEventLoop fails
   used a QScopedPointer with custom cleanup to shutdown the thread
   tidily.
4. Fast fail for downloadBigFile test if the connection is lost before
   the download is complete. This uses the disconnected signal to exit
   the event loop early. Previously on this type of failure it took 10
   minutes for the event loop to time out.

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp | 33 ++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index 21092c4..b0ecbda 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -336,7 +336,9 @@ void tst_QTcpSocket::init()
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy) {
         QFETCH_GLOBAL(int, proxyType);
-        QString fluke = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first().toString();
+        QList<QHostAddress> addresses = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses();
+        QVERIFY2(addresses.count() > 0, "failed to get ip address for test server");
+        QString fluke = addresses.first().toString();
         QNetworkProxy proxy;
 
         switch (proxyType) {
@@ -606,7 +608,7 @@ void tst_QTcpSocket::timeoutConnect()
     // Port 1357 is configured to drop packets on the test server
     socket->connectToHost(address, 1357);
     QVERIFY(timer.elapsed() < 50);
-    QVERIFY(!socket->waitForConnected(200));
+    QVERIFY(!socket->waitForConnected(1000)); //200ms is too short when using SOCKS proxy authentication
     QCOMPARE(socket->state(), QTcpSocket::UnconnectedState);
     QCOMPARE(int(socket->error()), int(QTcpSocket::SocketTimeoutError));
 
@@ -1035,7 +1037,7 @@ public:
         : server(0), ok(false), quit(false)
     { }
 
-    ~ReceiverThread() { /*delete server;*/ terminate(); wait();  }
+    ~ReceiverThread() { }
 
     bool listen()
     {
@@ -1047,6 +1049,14 @@ public:
         return true;
     }
 
+    static void cleanup(void *ptr)
+    {
+        ReceiverThread* self = reinterpret_cast<ReceiverThread*>(ptr);
+        self->quit = true;
+        self->wait(30000);
+        delete self;
+    }
+
 protected:
     void run()
     {
@@ -1093,18 +1103,16 @@ void tst_QTcpSocket::disconnectWhileConnectingNoEventLoop()
 {
     QFETCH(QByteArray, data);
 
-    ReceiverThread thread;
-    QVERIFY(thread.listen());
-    thread.start();
+    QScopedPointer<ReceiverThread, ReceiverThread> thread (new ReceiverThread);
+    QVERIFY(thread->listen());
+    thread->start();
 
     // proceed to the connect-write-disconnect
     QTcpSocket *socket = newSocket();
-    socket->connectToHost("127.0.0.1", thread.serverPort);
+    socket->connectToHost("127.0.0.1", thread->serverPort);
     if (!data.isEmpty())
         socket->write(data);
     if (socket->state() == QAbstractSocket::ConnectedState) {
-        thread.quit = true;
-        thread.wait();
         QSKIP("localhost connections are immediate, test case is invalid", SkipSingle);
     }
 
@@ -1130,9 +1138,9 @@ void tst_QTcpSocket::disconnectWhileConnectingNoEventLoop()
     delete socket;
 
     // check if the other side received everything ok
-    QVERIFY(thread.wait(30000));
-    QVERIFY(thread.ok);
-    QCOMPARE(thread.receivedData, data);
+    QVERIFY(thread->wait(30000));
+    QVERIFY(thread->ok);
+    QCOMPARE(thread->receivedData, data);
 }
 
 //----------------------------------------------------------------------------------
@@ -1194,6 +1202,7 @@ void tst_QTcpSocket::downloadBigFile()
 
     connect(tmpSocket, SIGNAL(connected()), SLOT(exitLoopSlot()));
     connect(tmpSocket, SIGNAL(readyRead()), SLOT(downloadBigFileSlot()));
+    connect(tmpSocket, SIGNAL(disconnected()), SLOT(exitLoopSlot()));
 
     tmpSocket->connectToHost(QtNetworkSettings::serverName(), 80);
 
-- 
cgit v0.12


From 270b878729068f42f862c7d04bb8a13915801ba3 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 2 Mar 2011 17:56:00 +0000
Subject: Thread safety - close RTimer handle when moving threads

RTimer is only usable in the thread it was created.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index dac50d4..fa6aedd 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1665,16 +1665,26 @@ qint64 QSymbianSocketEngine::bytesToWrite() const
 bool QSymbianSocketEngine::event(QEvent* ev)
 {
     Q_D(QSymbianSocketEngine);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::event";
+#endif
     switch (ev->type()) {
     case QEvent::ThreadChange:
+#ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "ThreadChange";
+#endif
         if (d->asyncSelect) {
             delete d->asyncSelect;
             d->asyncSelect = 0;
             QEvent *postThreadChangeEvent = new QEvent(PostThreadChangeEvent);
             QCoreApplication::postEvent(this, postThreadChangeEvent);
         }
+        d->selectTimer.Close();
         return true;
     case PostThreadChangeEvent:
+#ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "PostThreadChangeEvent";
+#endif
         // recreate select in new thread
         d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
         if (d->readNotifier) {
-- 
cgit v0.12


From dc9ddf8e30800aab375587563b377068bbe99532 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 2 Mar 2011 17:59:49 +0000
Subject: Fix crash

Reviewed-by: Markus Goetz
---
 src/network/socket/qtcpserver.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index 6b012db..5a60764 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -287,15 +287,15 @@ bool QTcpServer::listen(const QHostAddress &address, quint16 port)
 
     delete d->socketEngine;
     d->socketEngine = QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, proxy, this);
-#ifndef QT_NO_BEARERMANAGEMENT
-    //copy network session down to the socket engine (if it has been set)
-    d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
-#endif
     if (!d->socketEngine) {
         d->serverSocketError = QAbstractSocket::UnsupportedSocketOperationError;
         d->serverSocketErrorString = tr("Operation on socket is not supported");
         return false;
     }
+#ifndef QT_NO_BEARERMANAGEMENT
+    //copy network session down to the socket engine (if it has been set)
+    d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
+#endif
     if (!d->socketEngine->initialize(QAbstractSocket::TcpSocket, proto)) {
         d->serverSocketError = d->socketEngine->error();
         d->serverSocketErrorString = d->socketEngine->errorString();
-- 
cgit v0.12


From 76342796aa83761a854fd8c0b477af0a1afc62c4 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 4 Mar 2011 18:56:55 +0000
Subject: Move some network tests from gui.pro to network.pro

These network tests have no dependency on the QtGui dll, so I have moved
them to the network autotest group.
In some cases this was not stated in the tests' .pro files.

The gui autotest group still has a network test (qtcpsocket), but this
has a dependency on QtGui for one test case (which uses QMessageBox)

Reviewed-by: Markus Goetz
---
 tests/auto/gui.pro                                         | 5 -----
 tests/auto/network.pro                                     | 5 +++++
 tests/auto/qnetworkcachemetadata/qnetworkcachemetadata.pro | 1 +
 tests/auto/qnetworkdiskcache/qnetworkdiskcache.pro         | 1 +
 tests/auto/qnetworkreply/test/test.pro                     | 1 +
 5 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/tests/auto/gui.pro b/tests/auto/gui.pro
index 07dc5ef..356a98d 100644
--- a/tests/auto/gui.pro
+++ b/tests/auto/gui.pro
@@ -113,9 +113,6 @@ SUBDIRS=\
     qmouseevent_modal \
     qmovie \
     qnetworkaccessmanager_and_qprogressdialog \
-    qnetworkcachemetadata \
-    qnetworkdiskcache \
-    qnetworkreply \
     qpaintengine \
     qpainterpath \
     qpainterpathstroker \
@@ -168,7 +165,6 @@ SUBDIRS=\
     qtabbar \
     qtableview \
     qtablewidget \
-    qtcpserver \
     qtcpsocket \
     qtessellator \
     qtextblock \
@@ -195,7 +191,6 @@ SUBDIRS=\
     qtreeview \
     qtreewidget \
     qtreewidgetitemiterator \
-    qudpsocket \
     qundogroup \
     qundostack \
     qvectornd \
diff --git a/tests/auto/network.pro b/tests/auto/network.pro
index 50c4487..e4cecce 100644
--- a/tests/auto/network.pro
+++ b/tests/auto/network.pro
@@ -19,12 +19,15 @@ SUBDIRS=\
     platformsocketengine \
     qnetworkaccessmanager \
     qnetworkaddressentry \
+    qnetworkcachemetadata \
     qnetworkconfiguration \
     qnetworkconfigurationmanager \
     qnetworkcookie \
     qnetworkcookiejar \
+    qnetworkdiskcache \
     qnetworkinterface \
     qnetworkproxy \
+    qnetworkreply \
     qnetworkrequest \
     qnetworksession \
     qobjectperformance \
@@ -37,6 +40,8 @@ SUBDIRS=\
     qsslsocket \
     qsslsocket_onDemandCertificates_member \
     qsslsocket_onDemandCertificates_static \
+    qtcpserver \
+    qudpsocket \
 #    qnetworkproxyfactory \ # Uses a hardcoded proxy configuration
 
 !contains(QT_CONFIG, private_tests): SUBDIRS -= \
diff --git a/tests/auto/qnetworkcachemetadata/qnetworkcachemetadata.pro b/tests/auto/qnetworkcachemetadata/qnetworkcachemetadata.pro
index 77ad347..ae0941e 100644
--- a/tests/auto/qnetworkcachemetadata/qnetworkcachemetadata.pro
+++ b/tests/auto/qnetworkcachemetadata/qnetworkcachemetadata.pro
@@ -1,4 +1,5 @@
 load(qttest_p4)
+QT -= gui
 QT += network
 SOURCES  += tst_qnetworkcachemetadata.cpp
 
diff --git a/tests/auto/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/auto/qnetworkdiskcache/qnetworkdiskcache.pro
index 3b13087..c05171d 100644
--- a/tests/auto/qnetworkdiskcache/qnetworkdiskcache.pro
+++ b/tests/auto/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -1,4 +1,5 @@
 load(qttest_p4)
+QT -= gui
 QT += network
 SOURCES  += tst_qnetworkdiskcache.cpp
 
diff --git a/tests/auto/qnetworkreply/test/test.pro b/tests/auto/qnetworkreply/test/test.pro
index 12fdf04..80b879a 100644
--- a/tests/auto/qnetworkreply/test/test.pro
+++ b/tests/auto/qnetworkreply/test/test.pro
@@ -1,4 +1,5 @@
 load(qttest_p4)
+QT -= gui
 SOURCES  += ../tst_qnetworkreply.cpp
 TARGET = ../tst_qnetworkreply
 
-- 
cgit v0.12


From 3d34e2e49399446b45a343dcff917afef748520b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 4 Mar 2011 19:06:05 +0000
Subject: Fix link error in qsocketnotifier test

Reviewed-by: Markus Goetz
---
 tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp
index 0b7e7ef..5594dc3 100644
--- a/tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp
+++ b/tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp
@@ -46,7 +46,13 @@
 #include <QtCore/QSocketNotifier>
 #include <QtNetwork/QTcpServer>
 #include <QtNetwork/QTcpSocket>
+#ifdef Q_OS_SYMBIAN
+#include <private/qsymbiansocketengine_p.h>
+#define NATIVESOCKETENGINE QSymbianSocketEngine
+#else
 #include <private/qnativesocketengine_p.h>
+#define NATIVESOCKETENGINE QNativeSocketEngine
+#endif
 
 class tst_QSocketNotifier : public QObject
 {
@@ -71,10 +77,10 @@ class UnexpectedDisconnectTester : public QObject
 {
     Q_OBJECT
 public:
-    QNativeSocketEngine *readEnd1, *readEnd2;
+    NATIVESOCKETENGINE *readEnd1, *readEnd2;
     int sequence;
 
-    UnexpectedDisconnectTester(QNativeSocketEngine *s1, QNativeSocketEngine *s2)
+    UnexpectedDisconnectTester(NATIVESOCKETENGINE *s1, NATIVESOCKETENGINE *s2)
         : readEnd1(s1), readEnd2(s2), sequence(0)
     {
         QSocketNotifier *notifier1 =
@@ -124,7 +130,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
     QTcpServer server;
     QVERIFY(server.listen(QHostAddress::LocalHost, 0));
 
-    QNativeSocketEngine readEnd1;
+    NATIVESOCKETENGINE readEnd1;
     readEnd1.initialize(QAbstractSocket::TcpSocket);
     bool b = readEnd1.connectToHost(server.serverAddress(), server.serverPort());
     QVERIFY(readEnd1.waitForWrite());
@@ -135,7 +141,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
     QTcpSocket *writeEnd1 = server.nextPendingConnection();
     QVERIFY(writeEnd1 != 0);
 
-    QNativeSocketEngine readEnd2;
+    NATIVESOCKETENGINE readEnd2;
     readEnd2.initialize(QAbstractSocket::TcpSocket);
     b = readEnd2.connectToHost(server.serverAddress(), server.serverPort());
     QVERIFY(readEnd2.waitForWrite());
-- 
cgit v0.12


From 81ab8365e53389936bcaff07c82a2891ec63c4e5 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 7 Mar 2011 17:14:02 +0000
Subject: Reduce excessive timeout in tst_qtcpsocket

Timeout of 5000 seconds (which was probably intended to be 5000ms)
reduced to a more reasonable 60 seconds, to prevent the test from hanging
in case of errors in the proxy server.

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index b0ecbda..40ca531 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -1389,7 +1389,7 @@ void tst_QTcpSocket::flush()
 
     connect(socket, SIGNAL(connected()), SLOT(exitLoopSlot()));
     socket->connectToHost(QtNetworkSettings::serverName(), 143);
-    enterLoop(5000);
+    enterLoop(60);
     QVERIFY(socket->isOpen());
 
     socket->write("1 LOGOUT\r\n");
-- 
cgit v0.12


From a99cc33345c32a7e210dbffa2c5c56ee13dd83c1 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Mar 2011 13:20:40 +0000
Subject: tst_qtcpsocket stabilisation

Increased heap size to avoid OOM
Increased timeouts in the timeoutConnect test, as these randomly fail
at least in debug builds with 50ms (symbian threads have a 20ms timeslice
for round robin scheduling of equal priority threads, so that could be
related)
Skip the setSocketDescriptor test on symbian, since native sockets are
not ints, open c sockets are not supported, and we decided not to support
RSocket adoption unless it's specifically requested.

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/test/test.pro      | 2 +-
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/tests/auto/qtcpsocket/test/test.pro b/tests/auto/qtcpsocket/test/test.pro
index c4369df..5dde565 100644
--- a/tests/auto/qtcpsocket/test/test.pro
+++ b/tests/auto/qtcpsocket/test/test.pro
@@ -11,7 +11,7 @@ wince*: {
 QT += network
 vxworks:QT -= gui
 
-symbian: TARGET.EPOCHEAPSIZE="0x100 0x1000000"
+symbian: TARGET.EPOCHEAPSIZE="0x100 0x3000000"
 
 TARGET = tst_qtcpsocket
 
diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index 40ca531..b21de49 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -445,6 +445,9 @@ void tst_QTcpSocket::setInvalidSocketDescriptor()
 
 void tst_QTcpSocket::setSocketDescriptor()
 {
+#ifdef Q_OS_SYMBIAN
+    QSKIP("adopting open c socket handles is not supported", SkipAll);
+#else
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy)
         return;                 // this test doesn't make sense with proxies
@@ -485,6 +488,7 @@ void tst_QTcpSocket::setSocketDescriptor()
 #ifdef Q_OS_WIN
     delete dummy;
 #endif
+#endif
 }
 
 //----------------------------------------------------------------------------------
@@ -607,14 +611,14 @@ void tst_QTcpSocket::timeoutConnect()
 
     // Port 1357 is configured to drop packets on the test server
     socket->connectToHost(address, 1357);
-    QVERIFY(timer.elapsed() < 50);
+    QVERIFY(timer.elapsed() < 150);
     QVERIFY(!socket->waitForConnected(1000)); //200ms is too short when using SOCKS proxy authentication
     QCOMPARE(socket->state(), QTcpSocket::UnconnectedState);
     QCOMPARE(int(socket->error()), int(QTcpSocket::SocketTimeoutError));
 
     timer.start();
     socket->connectToHost(address, 1357);
-    QVERIFY(timer.elapsed() < 50);
+    QVERIFY(timer.elapsed() < 150);
     QTimer::singleShot(50, &QTestEventLoop::instance(), SLOT(exitLoop()));
     QTestEventLoop::instance().enterLoop(5);
     QVERIFY(!QTestEventLoop::instance().timeout());
-- 
cgit v0.12


From f89c25376651a87501e0c5980d289992b0fbe1c8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Mar 2011 15:41:59 +0000
Subject: Handle errors returned through select in the waitForXXX socket
 functions

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index fa6aedd..ed7962c 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1141,6 +1141,9 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
             //restart asynchronous notifier (only one IOCTL allowed at a time)
             if (asyncSelect)
                 asyncSelect->IssueRequest();
+#ifdef QNATIVESOCKETENGINE_DEBUG
+            qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select timeout";
+#endif
             return 0; //timeout
         } else {
             selectTimer.Cancel();
@@ -1148,11 +1151,20 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
         }
     }
 
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select status" << selectStat.Int() << (int)selectFlags();
+#endif
     if (selectStat != KErrNone)
         return selectStat.Int();
     if (selectFlags() & KSockSelectExcept) {
         TInt err;
         nativeSocket.GetOpt(KSOSelectLastError, KSOLSocket, err);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select last error" <<  err;
+#endif
+        //TODO: avoidable cast?
+        //set the error here, because read won't always return the same error again as select.
+        const_cast<QSymbianSocketEnginePrivate*>(this)->setError(err);
         //restart asynchronous notifier (only one IOCTL allowed at a time)
         if (asyncSelect)
             asyncSelect->IssueRequest(); //TODO: in error case should we restart or not?
@@ -1381,6 +1393,7 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
     switch (symbianError) {
     case KErrDisconnected:
     case KErrEof:
+    case KErrConnectionTerminated: //interface stopped externally - RConnection::Stop(EStopAuthoritative)
         setError(QAbstractSocket::RemoteHostClosedError,
                  QSymbianSocketEnginePrivate::RemoteHostClosedErrorString);
         break;
-- 
cgit v0.12


From 0b0247e675e3e8054e41de41c716d8f915e18629 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Mar 2011 14:17:47 +0000
Subject: tst_qtcpsocket - skip proxies for localhost testing

There is no point to test the proxy setting for connections to localhost,
because the proxy is bypassed anyway.
Skipping running the same test case multiple times makes this test complete
a bit faster.

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index b21de49..b972130 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -981,6 +981,9 @@ void tst_QTcpSocket::disconnectWhileConnecting_data()
 void tst_QTcpSocket::disconnectWhileConnecting()
 {
     QFETCH(QByteArray, data);
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
 
     QTcpServer server;
     QVERIFY(server.listen(QHostAddress::LocalHost));
@@ -1106,6 +1109,9 @@ void tst_QTcpSocket::disconnectWhileConnectingNoEventLoop_data()
 void tst_QTcpSocket::disconnectWhileConnectingNoEventLoop()
 {
     QFETCH(QByteArray, data);
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
 
     QScopedPointer<ReceiverThread, ReceiverThread> thread (new ReceiverThread);
     QVERIFY(thread->listen());
@@ -1646,6 +1652,9 @@ private slots:
 //----------------------------------------------------------------------------------
 void tst_QTcpSocket::remoteCloseError()
 {
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
     RemoteCloseErrorServer server;
     QVERIFY(server.listen(QHostAddress::LocalHost));
 
@@ -1956,6 +1965,9 @@ void tst_QTcpSocket::linuxKernelBugLocalSocket()
 //----------------------------------------------------------------------------------
 void tst_QTcpSocket::abortiveClose()
 {
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
     QTcpServer server;
     QVERIFY(server.listen(QHostAddress::LocalHost));
     connect(&server, SIGNAL(newConnection()), this, SLOT(exitLoopSlot()));
@@ -1994,6 +2006,9 @@ void tst_QTcpSocket::abortiveClose_abortSlot()
 //----------------------------------------------------------------------------------
 void tst_QTcpSocket::localAddressEmptyOnBSD()
 {
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
     QTcpServer server;
     QVERIFY(server.listen(QHostAddress::LocalHost));
 
@@ -2264,6 +2279,9 @@ void tst_QTcpSocket::moveToThread0()
 
 void tst_QTcpSocket::increaseReadBufferSize()
 {
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return; //proxy not useful for localhost test case
     QTcpServer server;
     QTcpSocket *active = newSocket();
     connect(active, SIGNAL(readyRead()), SLOT(exitLoopSlot()));
-- 
cgit v0.12


From 28100e436bb662756c2cb0be471785bcd2dbef83 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 8 Mar 2011 18:01:54 +0000
Subject: tst_qudpsocket - add a non localhost test case

The echo test case uses the UDP echo service on the qt-test-server

Reviewed-by: Markus Goetz
---
 tests/auto/qudpsocket/tst_qudpsocket.cpp | 52 ++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/tests/auto/qudpsocket/tst_qudpsocket.cpp b/tests/auto/qudpsocket/tst_qudpsocket.cpp
index 6ba55b2..e6fe068 100644
--- a/tests/auto/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/qudpsocket/tst_qudpsocket.cpp
@@ -108,6 +108,8 @@ private slots:
     void setMulticastInterface();
     void multicast_data();
     void multicast();
+    void echo_data();
+    void echo();
 
 protected slots:
     void empty_readyReadSlot();
@@ -1095,5 +1097,55 @@ void tst_QUdpSocket::multicast()
     QVERIFY2(receiver.leaveMulticastGroup(groupAddress), qPrintable(receiver.errorString()));
 }
 
+void tst_QUdpSocket::echo_data()
+{
+    QTest::addColumn<bool>("connect");
+    QTest::newRow("writeDatagram") << false;
+    QTest::newRow("write") << true;
+}
+
+void tst_QUdpSocket::echo()
+{
+    QFETCH(bool, connect);
+    QHostInfo info = QHostInfo::fromName(QtNetworkSettings::serverName());
+    QVERIFY(info.addresses().count());
+    QHostAddress remote = info.addresses().first();
+
+    QUdpSocket sock;
+    if (connect) {
+        sock.connectToHost(remote, 7);
+    } else {
+        sock.bind();
+    }
+    QByteArray out(30, 'x');
+    QByteArray in;
+    int successes = 0;
+    for (int i=0;i<20;i++) {
+        if (connect) {
+            sock.write(out);
+        } else {
+            sock.writeDatagram(out, remote, 7);
+        }
+        if (sock.waitForReadyRead(1000)) {
+            while (sock.hasPendingDatagrams()) {
+                QHostAddress from;
+                quint16 port;
+                if (connect) {
+                    in = sock.read(sock.pendingDatagramSize());
+                } else {
+                    in.resize(sock.pendingDatagramSize());
+                    sock.readDatagram(in.data(), in.length(), &from, &port);
+                }
+                if (in==out)
+                    successes++;
+            }
+        }
+        if (!sock.isValid())
+            QFAIL(sock.errorString().toLatin1().constData());
+        qDebug() << "packets in" << successes << "out" << i;
+    }
+    QVERIFY(successes >= 18);
+}
+
 QTEST_MAIN(tst_QUdpSocket)
 #include "tst_qudpsocket.moc"
-- 
cgit v0.12


From 0b646f2336a17aa6ae1cb4da89cba71c1adfd5ed Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 9 Mar 2011 13:46:57 +0000
Subject: Network session support for proxy socket engines

The proxy socket engines forward the network session to the "real" socket
they use natively.

Reviewed-by: Markus Goetz
---
 src/network/socket/qhttpsocketengine.cpp   | 3 +++
 src/network/socket/qsocks5socketengine.cpp | 6 ++++++
 2 files changed, 9 insertions(+)

diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 598efb6..c580b03 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -72,6 +72,9 @@ bool QHttpSocketEngine::initialize(QAbstractSocket::SocketType type, QAbstractSo
     setProtocol(protocol);
     setSocketType(type);
     d->socket = new QTcpSocket(this);
+#ifndef QT_NO_BEARERMANAGEMENT
+    d->socket->setProperty("_q_networkSession", property("_q_networkSession"));
+#endif
 
     // Explicitly disable proxying on the proxy socket itself to avoid
     // unwanted recursion.
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index 91dfdf3..16c0faa 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -556,7 +556,9 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
         udpData = new QSocks5UdpAssociateData;
         data = udpData;
         udpData->udpSocket = new QUdpSocket(q);
+#ifndef QT_NO_BEARERMANAGEMENT
         udpData->udpSocket->setProperty("_q_networksession", q->property("_q_networksession"));
+#endif
         udpData->udpSocket->setProxy(QNetworkProxy::NoProxy);
         QObject::connect(udpData->udpSocket, SIGNAL(readyRead()),
                          q, SLOT(_q_udpSocketReadNotification()),
@@ -568,7 +570,9 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
     }
 
     data->controlSocket = new QTcpSocket(q);
+#ifndef QT_NO_BEARERMANAGEMENT
     data->controlSocket->setProperty("_q_networksession", q->property("_q_networksession"));
+#endif
     data->controlSocket->setProxy(QNetworkProxy::NoProxy);
     QObject::connect(data->controlSocket, SIGNAL(connected()), q, SLOT(_q_controlSocketConnected()),
                      Qt::DirectConnection);
@@ -1378,7 +1382,9 @@ bool QSocks5SocketEngine::bind(const QHostAddress &address, quint16 port)
         d->udpData->associatePort = d->localPort;
         d->localPort = 0;
         QUdpSocket dummy;
+#ifndef QT_NO_BEARERMANAGEMENT
         dummy.setProperty("_q_networksession", property("_q_networksession"));
+#endif
         dummy.setProxy(QNetworkProxy::NoProxy);
         if (!dummy.bind()
             || writeDatagram(0,0, d->data->controlSocket->localAddress(), dummy.localPort()) != 0
-- 
cgit v0.12


From f2d8211aa530c6aca65bd52fd4cc57ef74f927c0 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 9 Mar 2011 17:22:35 +0000
Subject: Add debug logging to QHttpThreadDelegate

Activated by defining QHTTPTHREADDELEGATE_DEBUG

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpthreaddelegate.cpp | 38 ++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index b5cf00a..2cd5979 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -39,6 +39,7 @@
 **
 ****************************************************************************/
 
+//#define QHTTPTHREADDELEGATE_DEBUG
 #include "qhttpthreaddelegate_p.h"
 
 #include <QThread>
@@ -196,6 +197,9 @@ QHttpThreadDelegate::QHttpThreadDelegate(QObject *parent) :
 // This is invoked as BlockingQueuedConnection from QNetworkAccessHttpBackend in the user thread
 void QHttpThreadDelegate::startRequestSynchronously()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::startRequestSynchronously() thread=" << QThread::currentThreadId();
+#endif
     synchronous = true;
 
     QEventLoop synchronousRequestLoop;
@@ -210,12 +214,18 @@ void QHttpThreadDelegate::startRequestSynchronously()
     connections.localData()->releaseEntry(cacheKey);
     connections.setLocalData(0);
 
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::startRequestSynchronously() thread=" << QThread::currentThreadId() << "finished";
+#endif
 }
 
 
 // This is invoked as QueuedConnection from QNetworkAccessHttpBackend in the user thread
 void QHttpThreadDelegate::startRequest()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::startRequest() thread=" << QThread::currentThreadId();
+#endif
     // Check QThreadStorage for the QNetworkAccessCache
     // If not there, create this connection cache
     if (!connections.hasLocalData()) {
@@ -300,6 +310,9 @@ void QHttpThreadDelegate::startRequest()
 // This gets called from the user thread or by the synchronous HTTP timeout timer
 void QHttpThreadDelegate::abortRequest()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::abortRequest() thread=" << QThread::currentThreadId() << "sync=" << synchronous;
+#endif
     if (httpReply) {
         delete httpReply;
         httpReply = 0;
@@ -329,6 +342,9 @@ void QHttpThreadDelegate::finishedSlot()
         qWarning() << "QHttpThreadDelegate::finishedSlot: HTTP reply had already been deleted, internal problem. Please report.";
         return;
     }
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::finishedSlot() thread=" << QThread::currentThreadId() << "result=" << httpReply->statusCode();
+#endif
 
     // If there is still some data left emit that now
     while (httpReply->readAnyAvailable()) {
@@ -358,6 +374,9 @@ void QHttpThreadDelegate::finishedSlot()
 
 void QHttpThreadDelegate::synchronousFinishedSlot()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::synchronousFinishedSlot() thread=" << QThread::currentThreadId() << "result=" << httpReply->statusCode();
+#endif
     if (httpReply->statusCode() >= 400) {
             // it's an error reply
             QString msg = QLatin1String(QT_TRANSLATE_NOOP("QNetworkReply",
@@ -379,6 +398,9 @@ void QHttpThreadDelegate::finishedWithErrorSlot(QNetworkReply::NetworkError erro
         qWarning() << "QHttpThreadDelegate::finishedWithErrorSlot: HTTP reply had already been deleted, internal problem. Please report.";
         return;
     }
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::finishedWithErrorSlot() thread=" << QThread::currentThreadId() << "error=" << errorCode << detail;
+#endif
 
 #ifndef QT_NO_OPENSSL
     if (ssl)
@@ -396,6 +418,9 @@ void QHttpThreadDelegate::finishedWithErrorSlot(QNetworkReply::NetworkError erro
 
 void QHttpThreadDelegate::synchronousFinishedWithErrorSlot(QNetworkReply::NetworkError errorCode, const QString &detail)
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::synchronousFinishedWithErrorSlot() thread=" << QThread::currentThreadId() << "error=" << errorCode << detail;
+#endif
     incomingErrorCode = errorCode;
     incomingErrorDetail = detail;
 
@@ -411,6 +436,10 @@ static void downloadBufferDeleter(char *ptr)
 
 void QHttpThreadDelegate::headerChangedSlot()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::headerChangedSlot() thread=" << QThread::currentThreadId();
+#endif
+
 #ifndef QT_NO_OPENSSL
     if (ssl)
         emit sslConfigurationChanged(httpReply->sslConfiguration());
@@ -443,6 +472,9 @@ void QHttpThreadDelegate::headerChangedSlot()
 
 void QHttpThreadDelegate::synchronousHeaderChangedSlot()
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::synchronousHeaderChangedSlot() thread=" << QThread::currentThreadId();
+#endif
     // Store the information we need in this object, the QNetworkAccessHttpBackend will later read it
     incomingHeaders = httpReply->header();
     incomingStatusCode = httpReply->statusCode();
@@ -487,6 +519,9 @@ void QHttpThreadDelegate::sslErrorsSlot(const QList<QSslError> &errors)
 void QHttpThreadDelegate::synchronousAuthenticationRequiredSlot(const QHttpNetworkRequest &request, QAuthenticator *a)
 {
     Q_UNUSED(request);
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::synchronousAuthenticationRequiredSlot() thread=" << QThread::currentThreadId();
+#endif
 
     // Ask the credential cache
     QNetworkAuthenticationCredential credential = authenticationManager->fetchCachedCredentials(httpRequest.url(), a);
@@ -502,6 +537,9 @@ void QHttpThreadDelegate::synchronousAuthenticationRequiredSlot(const QHttpNetwo
 #ifndef QT_NO_NETWORKPROXY
 void  QHttpThreadDelegate::synchronousProxyAuthenticationRequiredSlot(const QNetworkProxy &p, QAuthenticator *a)
 {
+#ifdef QHTTPTHREADDELEGATE_DEBUG
+    qDebug() << "QHttpThreadDelegate::synchronousProxyAuthenticationRequiredSlot() thread=" << QThread::currentThreadId();
+#endif
     // Ask the credential cache
     QNetworkAuthenticationCredential credential = authenticationManager->fetchCachedProxyCredentials(p, a);
     if (!credential.isNull()) {
-- 
cgit v0.12


From 7b34e64198cbcdb8d738c9da11abe08c0ac880ac Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 9 Mar 2011 17:33:17 +0000
Subject: Fix synchronous http deadlock when aborted by internal timeout

QHttpThreadDelegate::abortRequest was deleting itself, but not exiting
the event loop. For the synchronous usage, both these are incorrect.
Without exiting the event loop, the main thread waits forever.
If it deletes itself, then the main thread will access the deleted memory
on return (the delegate->incomingErrorCode class member) which can crash
with frequency depending on heap implementation.

With this change, abort acts more like the synchronousFinishedWithErrorSlot.

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpthreaddelegate.cpp | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index 2cd5979..d75f12c 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -191,6 +191,7 @@ QHttpThreadDelegate::QHttpThreadDelegate(QObject *parent) :
     , downloadBuffer(0)
     , httpConnection(0)
     , httpReply(0)
+    , synchronousRequestLoop(0)
 {
 }
 
@@ -316,12 +317,16 @@ void QHttpThreadDelegate::abortRequest()
     if (httpReply) {
         delete httpReply;
         httpReply = 0;
-        this->deleteLater();
     }
 
     // Got aborted by the timeout timer
-    if (synchronous)
+    if (synchronous) {
         incomingErrorCode = QNetworkReply::TimeoutError;
+        QMetaObject::invokeMethod(synchronousRequestLoop, "quit", Qt::QueuedConnection);
+    } else {
+        //only delete this for asynchronous mode or QNetworkAccessHttpBackend will crash - see QNetworkAccessHttpBackend::postRequest()
+        this->deleteLater();
+    }
 }
 
 void QHttpThreadDelegate::readyReadSlot()
-- 
cgit v0.12


From ef53143777ccbd73799e597792a46b2676932cc2 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 9 Mar 2011 17:41:38 +0000
Subject: Bearer support for threaded http backend

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpthreaddelegate.cpp       | 9 +++++++++
 src/network/access/qhttpthreaddelegate_p.h       | 3 +++
 src/network/access/qnetworkaccesshttpbackend.cpp | 6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index d75f12c..6d6fadd 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -142,8 +142,13 @@ class QNetworkAccessCachedHttpConnection: public QHttpNetworkConnection,
 {
     // Q_OBJECT
 public:
+#ifdef QT_NO_BEARERMANAGEMENT
     QNetworkAccessCachedHttpConnection(const QString &hostName, quint16 port, bool encrypt)
         : QHttpNetworkConnection(hostName, port, encrypt)
+#else
+    QNetworkAccessCachedHttpConnection(const QString &hostName, quint16 port, bool encrypt, QSharedPointer<QNetworkSession> networkSession)
+        : QHttpNetworkConnection(hostName, port, encrypt, /*parent=*/0, networkSession)
+#endif
     {
         setExpires(true);
         setShareable(true);
@@ -250,7 +255,11 @@ void QHttpThreadDelegate::startRequest()
     if (httpConnection == 0) {
         // no entry in cache; create an object
         // the http object is actually a QHttpNetworkConnection
+#ifdef QT_NO_BEARERMANAGEMENT
         httpConnection = new QNetworkAccessCachedHttpConnection(urlCopy.host(), urlCopy.port(), ssl);
+#else
+        httpConnection = new QNetworkAccessCachedHttpConnection(urlCopy.host(), urlCopy.port(), ssl, networkSession);
+#endif
 #ifndef QT_NO_OPENSSL
         // Set the QSslConfiguration from this QNetworkRequest.
         if (ssl) {
diff --git a/src/network/access/qhttpthreaddelegate_p.h b/src/network/access/qhttpthreaddelegate_p.h
index 086a35d..2e86df3 100644
--- a/src/network/access/qhttpthreaddelegate_p.h
+++ b/src/network/access/qhttpthreaddelegate_p.h
@@ -110,6 +110,9 @@ public:
     qint64 incomingContentLength;
     QNetworkReply::NetworkError incomingErrorCode;
     QString incomingErrorDetail;
+#ifndef QT_NO_BEARERMANAGEMENT
+    QSharedPointer<QNetworkSession> networkSession;
+#endif
 
 protected:
     // The zerocopy download buffer, if used:
diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 4908e0a..8a29a31 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -47,6 +47,7 @@
 #include "qabstractnetworkcache.h"
 #include "qnetworkrequest.h"
 #include "qnetworkreply.h"
+#include "QtNetwork/private/qnetworksession_p.h"
 #include "qnetworkrequest_p.h"
 #include "qnetworkcookie_p.h"
 #include "QtCore/qdatetime.h"
@@ -519,6 +520,11 @@ void QNetworkAccessHttpBackend::postRequest()
 
     // Create the HTTP thread delegate
     QHttpThreadDelegate *delegate = new QHttpThreadDelegate;
+#ifndef Q_NO_BEARERMANAGEMENT
+    QVariant v(property("_q_networksession"));
+    if (v.isValid())
+        delegate->networkSession = qvariant_cast<QSharedPointer<QNetworkSession> >(v);
+#endif
 
     // For the synchronous HTTP, this is the normal way the delegate gets deleted
     // For the asynchronous HTTP this is a safety measure, the delegate deletes itself when HTTP is finished
-- 
cgit v0.12


From 132566afcf2357cc3c77d940f22567d83951f21d Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 10 Mar 2011 14:40:01 +0000
Subject: Fix network session use with the localhost optimisation in QNAB

QNetworkAccessBackend has an optimisation to not start the bearer when
the destination is localhost. On symbian, if the bearer is specified but
not started, then socket creation will fail.
To fix this, delay pushing the network session until start() is called,
at which point we know if the localhost optmisation will be applied or
not.
When using localhost, don't specify any network session - symbian socket
engine will create the socket successfully in thie case.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccessbackend.cpp | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index 8f5a3da..6220abe 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -96,11 +96,6 @@ QNetworkAccessBackend *QNetworkAccessManagerPrivate::findBackend(QNetworkAccessM
             QNetworkAccessBackend *backend = (*it)->create(op, request);
             if (backend) {
                 backend->manager = this;
-#ifndef QT_NO_BEARERMANAGEMENT
-                //copy network session down to the backend
-                if (networkSession)
-                    backend->setProperty("_q_networksession", QVariant::fromValue(networkSession));
-#endif
                 return backend; // found a factory that handled our request
             }
             ++it;
@@ -374,6 +369,8 @@ bool QNetworkAccessBackend::start()
 
     if (manager->networkSession->isOpen() &&
         manager->networkSession->state() == QNetworkSession::Connected) {
+        //copy network session down to the backend
+        setProperty("_q_networksession", QVariant::fromValue(manager->networkSession));
         open();
         return true;
     }
-- 
cgit v0.12


From 99baeb5b6b2c6d0b2724709ae8caa789e5ad5895 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 10 Mar 2011 18:16:05 +0000
Subject: Fixes for QTcpServer autotest

Set symbian capabilities in the two sub .pro files
Enable IPv6 test on symbian
Disable tests that use open C functions on socket descriptors
When bearer management is enabled, start the network interface at start
of the test.

Reviewed-by: Markus Goetz
---
 .../qtcpserver/crashingServer/crashingServer.pro   |  1 +
 tests/auto/qtcpserver/qtcpserver.pro               |  2 --
 tests/auto/qtcpserver/test/test.pro                |  7 +++--
 tests/auto/qtcpserver/tst_qtcpserver.cpp           | 34 ++++++++++++++++++----
 4 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/tests/auto/qtcpserver/crashingServer/crashingServer.pro b/tests/auto/qtcpserver/crashingServer/crashingServer.pro
index 0bea655..700e952 100644
--- a/tests/auto/qtcpserver/crashingServer/crashingServer.pro
+++ b/tests/auto/qtcpserver/crashingServer/crashingServer.pro
@@ -6,3 +6,4 @@ DESTDIR = ./
 # This means the auto test works on some machines for MinGW. No dialog stalls
 # the application.
 win32-g++*:CONFIG += console
+symbian: TARGET.CAPABILITY += NetworkServices ReadUserData
diff --git a/tests/auto/qtcpserver/qtcpserver.pro b/tests/auto/qtcpserver/qtcpserver.pro
index a3744a2..e123cfe 100644
--- a/tests/auto/qtcpserver/qtcpserver.pro
+++ b/tests/auto/qtcpserver/qtcpserver.pro
@@ -1,6 +1,4 @@
 TEMPLATE = subdirs
 SUBDIRS = test crashingServer
 
-symbian: TARGET.CAPABILITY = NetworkServices
-
 
diff --git a/tests/auto/qtcpserver/test/test.pro b/tests/auto/qtcpserver/test/test.pro
index e91ba20..65e1d82 100644
--- a/tests/auto/qtcpserver/test/test.pro
+++ b/tests/auto/qtcpserver/test/test.pro
@@ -13,9 +13,10 @@ wince*: {
 }
 
 symbian {
-	crashApp.files = $$QT_BUILD_TREE/examples/widgets/wiggly/$${BUILD_DIR}/crashingServer.exe
-	crashApp.path = .
-	DEPLOYMENT += crashApp
+    crashApp.files = $$QT_BUILD_TREE/examples/widgets/wiggly/$${BUILD_DIR}/crashingServer.exe
+    crashApp.path = .
+    DEPLOYMENT += crashApp
+    TARGET.CAPABILITY += NetworkServices ReadUserData
 }
 
 TARGET = ../tst_qtcpserver
diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp
index 3d377a4..cff2fe5 100644
--- a/tests/auto/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp
@@ -70,6 +70,9 @@
 Q_DECLARE_METATYPE(QNetworkProxy)
 Q_DECLARE_METATYPE(QList<QNetworkProxy>)
 
+#include <QNetworkSession>
+#include <QNetworkConfiguration>
+#include <QNetworkConfigurationManager>
 #include "../network-settings.h"
 
 //TESTED_CLASS=
@@ -86,6 +89,7 @@ public:
 
 public slots:
     void initTestCase_data();
+    void initTestCase();
     void init();
     void cleanup();
 private slots:
@@ -107,6 +111,11 @@ private slots:
     void proxyFactory();
 
     void qtbug14268_peek();
+
+private:
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkSession *networkSession;
+#endif
 };
 
 // Testing get/set functions
@@ -141,6 +150,16 @@ void tst_QTcpServer::initTestCase_data()
     QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
 }
 
+void tst_QTcpServer::initTestCase()
+{
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager man;
+    networkSession = new QNetworkSession(man.defaultConfiguration(), this);
+    networkSession->open();
+    QVERIFY(networkSession->waitForOpened());
+#endif
+}
+
 void tst_QTcpServer::init()
 {
     QFETCH_GLOBAL(bool, setProxy);
@@ -190,7 +209,7 @@ void tst_QTcpServer::clientServerLoop()
     QTcpSocket client;
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(server.serverAddress() == QHostAddress::Any))
+    if (!(server.serverAddress() == QHostAddress::Any) && !(server.serverAddress() == QHostAddress::AnyIPv6))
         serverAddress = server.serverAddress();
 
     client.connectToHost(serverAddress, server.serverPort());
@@ -222,9 +241,6 @@ void tst_QTcpServer::clientServerLoop()
 //----------------------------------------------------------------------------------
 void tst_QTcpServer::ipv6Server()
 {
-#if defined(Q_OS_SYMBIAN)
-    QSKIP("Symbian: IPv6 is not yet supported", SkipAll);
-#endif
     //### need to enter the event loop for the server to get the connection ?? ( windows)
     QTcpServer server;
     if (!server.listen(QHostAddress::LocalHostIPv6, 8944)) {
@@ -244,6 +260,8 @@ void tst_QTcpServer::ipv6Server()
 
     QTcpSocket *serverSocket = 0;
     QVERIFY((serverSocket = server.nextPendingConnection()));
+    serverSocket->close();
+    delete serverSocket;
 }
 
 //----------------------------------------------------------------------------------
@@ -379,7 +397,8 @@ void tst_QTcpServer::setSocketDescriptor()
     QTcpServer server;
     QVERIFY(!server.setSocketDescriptor(42));
     QCOMPARE(server.serverError(), QAbstractSocket::UnsupportedSocketOperationError);
-
+#ifndef Q_OS_SYMBIAN
+    //adopting Open C sockets is not supported, neither is adopting externally created RSocket
 #ifdef Q_OS_WIN
     // ensure winsock is started
     WSADATA wsaData;
@@ -402,6 +421,7 @@ void tst_QTcpServer::setSocketDescriptor()
 #ifdef Q_OS_WIN
     WSACleanup();
 #endif
+#endif
 }
 
 //----------------------------------------------------------------------------------
@@ -493,6 +513,9 @@ void tst_QTcpServer::addressReusable()
 
 void tst_QTcpServer::setNewSocketDescriptorBlocking()
 {
+#ifdef Q_OS_SYMBIAN
+    QSKIP("open C ioctls on Qt sockets not supported", SkipAll);
+#else
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy) {
         QFETCH_GLOBAL(int, proxyType);
@@ -507,6 +530,7 @@ void tst_QTcpServer::setNewSocketDescriptorBlocking()
     socket.connectToHost(QHostAddress::LocalHost, server.serverPort());
     QVERIFY(server.waitForNewConnection(5000));
     QVERIFY(server.ok);
+#endif
 }
 
 void tst_QTcpServer::invalidProxy_data()
-- 
cgit v0.12


From a2c9031817a7faaab62b15b8976a1c8664e108d6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 10 Mar 2011 18:20:53 +0000
Subject: QSymbianSocketEngine - return expected error code from bind

In the unix socket engine, EADDRNOTAVAIL is returned by the native call
when attempting to bind to a non existant interface. On symbian, the
generic KErrNotFound is returned.
Specifically for bind() convert KErrNotFound to the expected error code
QAbstractSocket::SocketAddressNotAvailableError which is relied on by
autotest (and possibly but unlikely, existing applications)

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index ed7962c..491b515 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -669,7 +669,15 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
 #endif
 
     if (err) {
-        d->setError(err);
+        switch (err) {
+        case KErrNotFound:
+            // the specified interface was not found - use the error code expected
+            d->setError(QAbstractSocket::SocketAddressNotAvailableError, QSymbianSocketEnginePrivate::AddressNotAvailableErrorString);
+            break;
+        default:
+            d->setError(err);
+            break;
+        }
 
 #if defined (QNATIVESOCKETENGINE_DEBUG)
         qDebug("QSymbianSocketEngine::bind(%s, %i) == false (%s)",
-- 
cgit v0.12


From 7f75862d6e8dbfb714a04ecd5047b4ec1714a3cf Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 14 Mar 2011 15:46:59 +0100
Subject: QLocalServer: Fix compilation

---
 src/network/socket/qlocalserver_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h
index 8ec3ef0..1ee5df2 100644
--- a/src/network/socket/qlocalserver_p.h
+++ b/src/network/socket/qlocalserver_p.h
@@ -65,7 +65,7 @@
 #   include <qt_windows.h>
 #   include <private/qwineventnotifier_p.h>
 #else
-#   include <qabstractsocketengine_p.h>
+#   include <private/qabstractsocketengine_p.h>
 #   include <qsocketnotifier.h>
 #endif
 
-- 
cgit v0.12


From 76487301421c2b127f564564e32c0c90a7b89ea2 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 14 Mar 2011 16:20:55 +0100
Subject: QSymbianSocketEngine: Compile fix

---
 src/network/socket/qsymbiansocketengine.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 491b515..db98ade 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -47,7 +47,7 @@
 #include "qelapsedtimer.h"
 #include "qvarlengtharray.h"
 #include "qnetworkinterface.h"
-#include "qnetworksession_p.h"
+#include <private/qnetworksession_p.h>
 #include <es_sock.h>
 #include <in_sock.h>
 #include <net/if.h>
-- 
cgit v0.12


From 479f234ec89db7e5916c27a7eac234d2ee8833c1 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 11 Mar 2011 16:21:52 +0000
Subject: Remove indirection through fake socket notifier in symbian socket
 engine

Instead of creating socket notifiers and sending faked events to them,
call the engine's notification functions directly.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 218 +++++++---------------------
 src/network/socket/qsymbiansocketengine_p.h |  11 +-
 2 files changed, 58 insertions(+), 171 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index db98ade..be04b56 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -70,8 +70,6 @@
 #include <private/qobject_p.h>
 #include <private/qsystemerror_p.h>
 
-#define QNATIVESOCKETENGINE_DEBUG
-
 #if defined QNATIVESOCKETENGINE_DEBUG
 #include <qstring.h>
 #include <ctype.h>
@@ -263,9 +261,9 @@ void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint
 QSymbianSocketEnginePrivate::QSymbianSocketEnginePrivate() :
     socketDescriptor(-1),
     socketServer(QSymbianSocketManager::instance().getSocketServer()),
-    readNotifier(0),
-    writeNotifier(0),
-    exceptNotifier(0),
+    readNotificationsEnabled(false),
+    writeNotificationsEnabled(false),
+    exceptNotificationsEnabled(false),
     asyncSelect(0)
 {
 }
@@ -970,12 +968,9 @@ void QSymbianSocketEngine::close()
     qDebug("QSymbianSocketEngine::close()");
 #endif
 
-    if (d->readNotifier)
-        d->readNotifier->setEnabled(false);
-    if (d->writeNotifier)
-        d->writeNotifier->setEnabled(false);
-    if (d->exceptNotifier)
-        d->exceptNotifier->setEnabled(false);
+    d->readNotificationsEnabled = false;
+    d->writeNotificationsEnabled = false;
+    d->exceptNotificationsEnabled = false;
     if (d->asyncSelect) {
         d->asyncSelect->deleteLater();
         d->asyncSelect = 0;
@@ -1003,18 +998,6 @@ void QSymbianSocketEngine::close()
     d->localAddress.clear();
     d->peerPort = 0;
     d->peerAddress.clear();
-    if (d->readNotifier) {
-        qDeleteInEventHandler(d->readNotifier);
-        d->readNotifier = 0;
-    }
-    if (d->writeNotifier) {
-        qDeleteInEventHandler(d->writeNotifier);
-        d->writeNotifier = 0;
-    }
-    if (d->exceptNotifier) {
-        qDeleteInEventHandler(d->exceptNotifier);
-        d->exceptNotifier = 0;
-    }
 }
 
 qint64 QSymbianSocketEngine::write(const char *data, qint64 len)
@@ -1446,136 +1429,55 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
     hasSetSocketError = true;
 }
 
-class QReadNotifier : public QSocketNotifier
-{
-    friend class QAsyncSelect;
-public:
-    QReadNotifier(int fd, QSymbianSocketEngine *parent)
-        : QSocketNotifier(fd, QSocketNotifier::Read, parent)
-    { engine = parent; }
-protected:
-    bool event(QEvent *);
-
-    QSymbianSocketEngine *engine;
-};
-
-bool QReadNotifier::event(QEvent *e)
-{
-    if (e->type() == QEvent::SockAct) {
-        engine->readNotification();
-        return true;
-    }
-    return QSocketNotifier::event(e);
-}
-
 bool QSymbianSocketEngine::isReadNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isReadNotificationEnabled(), false);
-    return d->readNotifier && d->readNotifier->isEnabled();
+    return d->readNotificationsEnabled;
 }
 
 void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setReadNotificationEnabled(), Q_VOID);
-    if (d->readNotifier) {
-        d->readNotifier->setEnabled(enable);
-    } else if (enable && d->threadData->eventDispatcher) {
-        QReadNotifier *rn = new QReadNotifier(d->socketDescriptor, this);
-        d->readNotifier = rn;
-        if (!d->asyncSelect)
-            d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
-        d->asyncSelect->setReadNotifier(rn);
-        d->readNotifier->setEnabled(true);
-    }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::setReadNotificationEnabled" << enable << "socket" << d->socketDescriptor;
+#endif
+    d->readNotificationsEnabled = enable;
+    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
+        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
     // TODO: what do we do if event dispatcher doesn't exist yet?
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
 }
 
-
-class QWriteNotifier : public QSocketNotifier
-{
-    friend class QAsyncSelect;
-public:
-    QWriteNotifier(int fd, QSymbianSocketEngine *parent)
-        : QSocketNotifier(fd, QSocketNotifier::Write, parent)
-    { engine = parent; }
-protected:
-    bool event(QEvent *);
-
-    QSymbianSocketEngine *engine;
-};
-
-bool QWriteNotifier::event(QEvent *e)
-{
-    if (e->type() == QEvent::SockAct) {
-        if (engine->state() == QAbstractSocket::ConnectingState)
-            engine->connectionNotification();
-        else
-            engine->writeNotification();
-        return true;
-    }
-    return QSocketNotifier::event(e);
-}
-
 bool QSymbianSocketEngine::isWriteNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isWriteNotificationEnabled(), false);
-    return d->writeNotifier && d->writeNotifier->isEnabled();
+    return d->writeNotificationsEnabled;
 }
 
 void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setWriteNotificationEnabled(), Q_VOID);
-    if (d->writeNotifier) {
-        d->writeNotifier->setEnabled(enable);
-    } else if (enable && d->threadData->eventDispatcher) {
-        QWriteNotifier *wn = new QWriteNotifier(d->socketDescriptor, this);
-        d->writeNotifier = wn;
-        if (!(d->asyncSelect))
-            d->asyncSelect = q_check_ptr(new QAsyncSelect(d->threadData->eventDispatcher, d->nativeSocket, this));
-        d->asyncSelect->setWriteNotifier(wn);
-        d->writeNotifier->setEnabled(true);
-    }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::setWriteNotificationEnabled" << enable << "socket" << d->socketDescriptor;
+#endif
+    d->writeNotificationsEnabled = enable;
+    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
+        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
     // TODO: what do we do if event dispatcher doesn't exist yet?
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
 }
 
-class QExceptionNotifier : public QSocketNotifier
-{
-    friend class QAsyncSelect;
-public:
-    QExceptionNotifier(int fd, QSymbianSocketEngine *parent)
-        : QSocketNotifier(fd, QSocketNotifier::Exception, parent) { engine = parent; }
-
-protected:
-    bool event(QEvent *);
-
-    QSymbianSocketEngine *engine;
-};
-
-bool QExceptionNotifier::event(QEvent *e)
-{
-    if (e->type() == QEvent::SockAct) {
-        if (engine->state() == QAbstractSocket::ConnectingState)
-            engine->connectionNotification();
-        else
-            engine->exceptionNotification();
-        return true;
-    }
-    return QSocketNotifier::event(e);
-}
-
 bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::isExceptionNotificationEnabled(), false);
-    return d->exceptNotifier && d->exceptNotifier->isEnabled();
+    return d->exceptNotificationsEnabled;
     return false;
 }
 
@@ -1584,16 +1486,12 @@ void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::setExceptionNotificationEnabled(), Q_VOID);
-    if (d->exceptNotifier) {
-        d->exceptNotifier->setEnabled(enable);
-    } else if (enable && d->threadData->eventDispatcher) {
-        QExceptionNotifier *en = new QExceptionNotifier(d->socketDescriptor, this);
-        d->exceptNotifier = en;
-        if (!(d->asyncSelect))
-            d->asyncSelect = q_check_ptr(new QAsyncSelect(d->threadData->eventDispatcher, d->nativeSocket, this));
-        d->asyncSelect->setExceptionNotifier(en);
-        d->writeNotifier->setEnabled(true);
-    }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QSymbianSocketEngine::setExceptionNotificationEnabled" << enable << "socket" << d->socketDescriptor;
+#endif
+    d->exceptNotificationsEnabled = enable;
+    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
+        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
 }
@@ -1692,7 +1590,7 @@ bool QSymbianSocketEngine::event(QEvent* ev)
     switch (ev->type()) {
     case QEvent::ThreadChange:
 #ifdef QNATIVESOCKETENGINE_DEBUG
-        qDebug() << "ThreadChange";
+        qDebug() << "ThreadChange" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
 #endif
         if (d->asyncSelect) {
             delete d->asyncSelect;
@@ -1704,22 +1602,11 @@ bool QSymbianSocketEngine::event(QEvent* ev)
         return true;
     case PostThreadChangeEvent:
 #ifdef QNATIVESOCKETENGINE_DEBUG
-        qDebug() << "PostThreadChangeEvent";
+        qDebug() << "PostThreadChangeEvent" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
 #endif
         // recreate select in new thread
         d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
-        if (d->readNotifier) {
-            d->asyncSelect->setReadNotifier(static_cast<QReadNotifier*>(d->readNotifier));
-            setReadNotificationEnabled(d->readNotifier->isEnabled());
-        }
-        if (d->writeNotifier) {
-            d->asyncSelect->setWriteNotifier(static_cast<QWriteNotifier*>(d->writeNotifier));
-            setReadNotificationEnabled(d->writeNotifier->isEnabled());
-        }
-        if (d->exceptNotifier) {
-            d->asyncSelect->setExceptionNotifier(static_cast<QExceptionNotifier*>(d->exceptNotifier));
-            setReadNotificationEnabled(d->exceptNotifier->isEnabled());
-        }
+        d->asyncSelect->IssueRequest();
         return true;
     }
     return QAbstractSocketEngine::event(ev);
@@ -1758,11 +1645,10 @@ TInt QAsyncSelect::RunError(TInt aError)
     if (engine) {
         QT_TRY {
             engine->d_func()->setError(aError);
-            QEvent e(QEvent::SockAct);
-            if (iExcN)
-                iExcN->event(&e);
-            if (iReadN)
-                iReadN->event(&e);
+            if (engine->isExceptionNotificationEnabled())
+                engine->exceptionNotification();
+            if (engine->isReadNotificationEnabled())
+                engine->readNotification();
         }
         QT_CATCH(...) {}
     }
@@ -1781,17 +1667,20 @@ void QAsyncSelect::run()
     m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
     //KSockSelectReadContinuation is for reading datagrams in a mode that doesn't discard when the
     //datagram is larger than the read buffer - Qt doesn't need to use this.
-    if (iReadN && ((m_selectBuf() & KSockSelectRead) || iStatus != KErrNone)) {
-        QEvent e(QEvent::SockAct);
-        iReadN->event(&e);
+    if (engine && engine->isReadNotificationEnabled()
+        && ((m_selectBuf() & KSockSelectRead) || iStatus != KErrNone)) {
+        engine->readNotification();
     }
-    if (iWriteN && ((m_selectBuf() & KSockSelectWrite) || iStatus != KErrNone)) {
-        QEvent e(QEvent::SockAct);
-        iWriteN->event(&e);
+    if (engine && engine->isWriteNotificationEnabled()
+        && ((m_selectBuf() & KSockSelectWrite) || iStatus != KErrNone)) {
+        if (engine->state() == QAbstractSocket::ConnectingState)
+            engine->connectionNotification();
+        else
+            engine->writeNotification();
     }
-    if (iExcN && ((m_selectBuf() & KSockSelectExcept) || iStatus != KErrNone)) {
-        QEvent e(QEvent::SockAct);
-        iExcN->event(&e);
+    if (engine && engine->isExceptionNotificationEnabled()
+        && ((m_selectBuf() & KSockSelectExcept) || iStatus != KErrNone)) {
+        engine->exceptionNotification();
     }
     m_inSocketEvent = false;
     if (m_deleteLater) {
@@ -1805,9 +1694,6 @@ void QAsyncSelect::run()
 void QAsyncSelect::deleteLater()
 {
     if (m_inSocketEvent) {
-        iExcN = 0;
-        iReadN = 0;
-        iWriteN = 0;
         engine = 0;
         m_deleteLater = true;
     } else {
@@ -1820,13 +1706,16 @@ void QAsyncSelect::IssueRequest()
     if (m_inSocketEvent)
         return; //prevent thrashing during a callback - socket engine enables/disables multiple notifiers
     TUint selectFlags = 0;
-    if (iReadN && iReadN->isEnabled())
+    if (engine->isReadNotificationEnabled())
         selectFlags |= KSockSelectRead;
-    if (iWriteN && iWriteN->isEnabled())
+    if (engine->isWriteNotificationEnabled())
         selectFlags |= KSockSelectWrite;
-    if (iExcN && iExcN->isEnabled())
+    if (engine->isExceptionNotificationEnabled())
         selectFlags |= KSockSelectExcept;
     if (selectFlags != m_selectFlags) {
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QAsyncSelect::IssueRequest() - select flags" << m_selectFlags << "->" << selectFlags;
+#endif
         Cancel();
         m_selectFlags = selectFlags;
     }
@@ -1836,6 +1725,9 @@ void QAsyncSelect::IssueRequest()
         m_socket.Ioctl(KIOctlSelect, iStatus, &m_selectBuf, KSOLSocket);
         SetActive();
     }
+#ifdef QNATIVESOCKETENGINE_DEBUG
+    qDebug() << "QAsyncSelect::IssueRequest() - IsActive" << IsActive();
+#endif
 }
 
 QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index bc39450..432e4dc 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -162,10 +162,6 @@ public:
 
     void refresh();
 
-    void setReadNotifier(QReadNotifier *rn) { iReadN = rn; }
-    void setWriteNotifier(QWriteNotifier *wn) { iWriteN = wn; }
-    void setExceptionNotifier(QExceptionNotifier *en) { iExcN = en; }
-
 protected:
     void DoCancel();
     void RunL();
@@ -173,9 +169,6 @@ protected:
     TInt RunError(TInt aError);
 
 private:
-    QReadNotifier* iReadN;
-    QWriteNotifier* iWriteN;
-    QExceptionNotifier* iExcN;
     bool m_inSocketEvent;
     bool m_deleteLater;
     RSocket &m_socket;
@@ -198,7 +191,9 @@ public:
     RSocketServ& socketServer;
     mutable RTimer selectTimer;
 
-    QSocketNotifier *readNotifier, *writeNotifier, *exceptNotifier;
+    bool readNotificationsEnabled;
+    bool writeNotificationsEnabled;
+    bool exceptNotificationsEnabled;
     QAsyncSelect* asyncSelect;
 
     // FIXME this is duplicated from qnativesocketengine_p.h
-- 
cgit v0.12


From 230ef5e3ad8bb4dadef7dbf2c8bf41156bf30130 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 11 Mar 2011 16:59:48 +0000
Subject: tst_QNetworkReply::ioGetFromBuiltinHttp issues

The https:limited subtest was too slow and didn't fail in the expected
place (it was expected to be too fast)
Both limited test cases timed out when debug enabled in the socket engine,
so the timeout is increased from 11->30 seconds

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 7fde3f8..ffe7ea4 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -3846,7 +3846,7 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
     QTime loopTime;
     loopTime.start();
-    QTestEventLoop::instance().enterLoop(11);
+    QTestEventLoop::instance().enterLoop(30);
     const int elapsedTime = loopTime.elapsed();
     server.wait();
     reader.wrapUp();
@@ -3878,10 +3878,9 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
         const int minRate = rate * 1024 * (100-allowedDeviation) / 100;
         const int maxRate = rate * 1024 * (100+allowedDeviation) / 100;
         qDebug() << minRate << "<="<< server.transferRate << "<=" << maxRate << "?";
-        QVERIFY(server.transferRate >= minRate);
         QEXPECT_FAIL("http+limited", "Limiting is broken right now, check QTBUG-15065", Continue);
         QEXPECT_FAIL("https+limited", "Limiting is broken right now, check QTBUG-15065", Continue);
-        QVERIFY(server.transferRate <= maxRate);
+        QVERIFY(server.transferRate >= minRate && server.transferRate <= maxRate);
     }
 }
 
-- 
cgit v0.12


From b24711c377d5d0eab17d729d3d1291771410b846 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 11 Mar 2011 19:19:07 +0000
Subject: Fix capabilities in qtpcsocket autotest

Moved from the subdirs pro file to the executable pro files.

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/qtcpsocket.pro            | 1 -
 tests/auto/qtcpsocket/stressTest/stressTest.pro | 1 +
 tests/auto/qtcpsocket/test/test.pro             | 5 ++++-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/tests/auto/qtcpsocket/qtcpsocket.pro b/tests/auto/qtcpsocket/qtcpsocket.pro
index 8b1f664..5dfff5b 100644
--- a/tests/auto/qtcpsocket/qtcpsocket.pro
+++ b/tests/auto/qtcpsocket/qtcpsocket.pro
@@ -6,4 +6,3 @@ wince*|symbian|vxworks* : SUBDIRS = test
 
 
 requires(contains(QT_CONFIG,private_tests))
-symbian: TARGET.CAPABILITY = NetworkServices
diff --git a/tests/auto/qtcpsocket/stressTest/stressTest.pro b/tests/auto/qtcpsocket/stressTest/stressTest.pro
index 9a653c6..adf0217 100644
--- a/tests/auto/qtcpsocket/stressTest/stressTest.pro
+++ b/tests/auto/qtcpsocket/stressTest/stressTest.pro
@@ -9,4 +9,5 @@ DESTDIR = ./
 MOC_DIR = .moc/
 TMP_DIR = .tmp/
 
+symbian: TARGET.CAPABILITY = NetworkServices
 
diff --git a/tests/auto/qtcpsocket/test/test.pro b/tests/auto/qtcpsocket/test/test.pro
index 5dde565..f4207d6 100644
--- a/tests/auto/qtcpsocket/test/test.pro
+++ b/tests/auto/qtcpsocket/test/test.pro
@@ -11,7 +11,10 @@ wince*: {
 QT += network
 vxworks:QT -= gui
 
-symbian: TARGET.EPOCHEAPSIZE="0x100 0x3000000"
+symbian: {
+    TARGET.EPOCHEAPSIZE="0x100 0x3000000"
+    TARGET.CAPABILITY = NetworkServices
+}
 
 TARGET = tst_qtcpsocket
 
-- 
cgit v0.12


From cec4faf5b0eb2d5f55c4651c1a8e6137808c21c7 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 11 Mar 2011 19:40:32 +0000
Subject: Fix for server.listen getting IPv6 address

Reviewed-by: Markus Goetz
---
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index b972130..6852e29 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -1432,7 +1432,7 @@ void tst_QTcpSocket::dontCloseOnTimeout()
     QVERIFY(server.listen());
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(server.serverAddress() == QHostAddress::Any))
+    if (!(server.serverAddress() == QHostAddress::Any) && !(server.serverAddress() == QHostAddress::AnyIPv6))
         serverAddress = server.serverAddress();
 
     QTcpSocket *socket = newSocket();
-- 
cgit v0.12


From 76a18d2eab6b94929f79dc0c4bec59caaaa8d270 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 14 Mar 2011 16:17:10 +0000
Subject: Enable IPv6 test in QNetworkInterface autotest

IPv6 test was skipped for symbian, now enabled it.
Also start the default bearer before testing, so there are interfaces
other than loopback available to test.

Reviewed-by: Markus Goetz
---
 .../qnetworkinterface/tst_qnetworkinterface.cpp    | 38 ++++++++++++++++++----
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp
index 0d7c68e..c630eca 100644
--- a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp
+++ b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp
@@ -45,6 +45,8 @@
 #include <qcoreapplication.h>
 #include <qnetworkinterface.h>
 #include <qtcpsocket.h>
+#include <QNetworkConfigurationManager>
+#include <QNetworkSession>
 #include "../network-settings.h"
 
 //TESTED_FILES=qnetworkinterface.cpp qnetworkinterface.h qnetworkinterface_unix.cpp qnetworkinterface_win.cpp
@@ -58,23 +60,52 @@ public:
     virtual ~tst_QNetworkInterface();
 
 private slots:
+    void initTestCase();
+    void cleanupTestCase();
     void dump();
     void loopbackIPv4();
     void loopbackIPv6();
     void localAddress();
     void interfaceFromXXX();
     void copyInvalidInterface();
+
+private:
+#ifndef QT_NO_BEARER_MANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QScopedPointer<QNetworkSession> networkSession;
+#endif
 };
 
 tst_QNetworkInterface::tst_QNetworkInterface()
 {
-    Q_SET_DEFAULT_IAP
 }
 
 tst_QNetworkInterface::~tst_QNetworkInterface()
 {
 }
 
+void tst_QNetworkInterface::initTestCase()
+{
+#ifndef QT_NO_BEARERMANAGEMENT
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession.reset(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
+}
+
+void tst_QNetworkInterface::cleanupTestCase()
+{
+#ifndef QT_NO_BEARERMANAGEMENT
+    if (networkSession && networkSession->isOpen()) {
+        networkSession->close();
+    }
+#endif
+}
 
 void tst_QNetworkInterface::dump()
 {
@@ -127,10 +158,6 @@ void tst_QNetworkInterface::loopbackIPv4()
 
 void tst_QNetworkInterface::loopbackIPv6()
 {
-#ifdef Q_OS_SYMBIAN
-    QSKIP( "Symbian: IPv6 is not yet supported", SkipAll );
-#else
-
     QList<QHostAddress> all = QNetworkInterface::allAddresses();
 
     bool loopbackfound = false;
@@ -144,7 +171,6 @@ void tst_QNetworkInterface::loopbackIPv6()
             anyIPv6 = true;
 
     QVERIFY(!anyIPv6 || loopbackfound);
-#endif
 }
 
 void tst_QNetworkInterface::localAddress()
-- 
cgit v0.12


From 981ca30f216b4655b4c171aba5bcb37890cb92b1 Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Tue, 15 Mar 2011 12:25:28 +0100
Subject: SSL: fix compilation on Windows

Reviewed-by: Markus Goetz
---
 src/network/ssl/qsslsocket_p.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index 7b92f95..4662c56 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -73,6 +73,7 @@ QT_BEGIN_NAMESPACE
     typedef OSStatus (*PtrSecTrustSettingsCopyCertificates)(int, CFArrayRef*);
     typedef OSStatus (*PtrSecTrustCopyAnchorCertificates)(CFArrayRef*);
 #elif defined(Q_OS_WIN)
+#include <windows.h>
 #include <wincrypt.h>
 #ifndef HCRYPTPROV_LEGACY
 #define HCRYPTPROV_LEGACY HCRYPTPROV
-- 
cgit v0.12


From e0b7d5afff1a5087211883a80ab0d4c1292d12f3 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 14 Mar 2011 17:28:15 +0100
Subject: QNAM HTTP: error() in case connection is closed unexpectedly

Task-number: QT-4658
Task-number: QT-3494
Reviewed-by: Peter Hartmann
---
 .../access/qhttpnetworkconnectionchannel.cpp       | 15 +++++++++++++-
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp     | 24 +++++++++++++++-------
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index 23dd518..6a05fd3 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -1020,8 +1020,20 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
             } else {
                 errorCode = QNetworkReply::RemoteHostClosedError;
             }
+        } else if (state == QHttpNetworkConnectionChannel::ReadingState) {
+            if (!reply->d_func()->expectContent()) {
+                // No content expected, this is a valid way to have the connection closed by the server
+                return;
+            }
+            if (reply->contentLength() == -1 && !reply->d_func()->isChunked()) {
+                // There was no content-length header and it's not chunked encoding,
+                // so this is a valid way to have the connection closed by the server
+                return;
+            }
+            // ok, we got a disconnect even though we did not expect it
+            errorCode = QNetworkReply::RemoteHostClosedError;
         } else {
-            return;
+            errorCode = QNetworkReply::RemoteHostClosedError;
         }
         break;
     case QAbstractSocket::SocketTimeoutError:
@@ -1052,6 +1064,7 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
     if (reply) {
         reply->d_func()->errorString = errorString;
         emit reply->finishedWithError(errorCode, errorString);
+        reply = 0;
     }
     // send the next request
     QMetaObject::invokeMethod(that, "_q_startNextRequest", Qt::QueuedConnection);
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index a7e6f9f..49ae768 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -969,6 +969,7 @@ tst_QNetworkReply::tst_QNetworkReply()
 #ifndef QT_NO_OPENSSL
     qRegisterMetaType<QList<QSslError> >();
 #endif
+    qRegisterMetaType<QNetworkReply::NetworkError>();
 
     Q_SET_DEFAULT_IAP
 
@@ -2605,6 +2606,9 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer_data()
     QTest::newRow("justHalfStatus+disconnect") << QByteArray("HTTP/1.1") << true;
     QTest::newRow("justStatus+disconnect") << QByteArray("HTTP/1.1 200 OK\r\n") << true;
     QTest::newRow("justStatusAndHalfHeaders+disconnect") << QByteArray("HTTP/1.1 200 OK\r\nContent-L") << true;
+
+    QTest::newRow("halfContent+disconnect") << QByteArray("HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\nAB") << true;
+
 }
 
 void tst_QNetworkReply::ioGetFromHttpBrokenServer()
@@ -2616,29 +2620,35 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer()
 
     QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
     QNetworkReplyPtr reply = manager.get(request);
+    QSignalSpy spy(reply, SIGNAL(error(QNetworkReply::NetworkError)));
+
 
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
     QTestEventLoop::instance().enterLoop(10);
     QVERIFY(!QTestEventLoop::instance().timeout());
 
     QCOMPARE(reply->url(), request.url());
+    QCOMPARE(spy.count(), 1);
     QVERIFY(reply->error() != QNetworkReply::NoError);
 }
 
 void tst_QNetworkReply::ioGetFromHttpStatus100_data()
 {
     QTest::addColumn<QByteArray>("dataToSend");
-    QTest::newRow("normal") << QByteArray("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
-    QTest::newRow("minimal") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
-    QTest::newRow("minimal2") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\r\n\r\n");
-    QTest::newRow("minimal3") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\n\n");
-    QTest::newRow("with_headers") << QByteArray("HTTP/1.1 100 Continue\r\nBla: x\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
-    QTest::newRow("with_headers2") << QByteArray("HTTP/1.1 100 Continue\nBla: x\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
+    QTest::addColumn<int>("statusCode");
+    QTest::newRow("normal") << QByteArray("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") << 200;
+    QTest::newRow("minimal") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") << 200;
+    QTest::newRow("minimal2") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\r\n\r\n") << 200;
+    QTest::newRow("minimal3") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\n\n") << 200;
+    QTest::newRow("minimal+404") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 204 No Content\r\n\r\n") << 204;
+    QTest::newRow("with_headers") << QByteArray("HTTP/1.1 100 Continue\r\nBla: x\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") << 200;
+    QTest::newRow("with_headers2") << QByteArray("HTTP/1.1 100 Continue\nBla: x\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") << 200;
 }
 
 void tst_QNetworkReply::ioGetFromHttpStatus100()
 {
     QFETCH(QByteArray, dataToSend);
+    QFETCH(int, statusCode);
     MiniHttpServer server(dataToSend);
     server.doClose = true;
 
@@ -2651,7 +2661,7 @@ void tst_QNetworkReply::ioGetFromHttpStatus100()
 
     QCOMPARE(reply->url(), request.url());
     QCOMPARE(reply->error(), QNetworkReply::NoError);
-    QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+    QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), statusCode);
     QVERIFY(reply->rawHeader("bla").isNull());
 }
 
-- 
cgit v0.12


From 8e6df3ec44a87952817d766253c8f93adc8514a4 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 15 Mar 2011 15:21:39 +0100
Subject: tst_qhostinfo: Fixes

Reviewed-by: Peter Hartmann
---
 tests/auto/qhostinfo/tst_qhostinfo.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp
index ee2fe0d..8be8dcb 100644
--- a/tests/auto/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp
@@ -291,6 +291,7 @@ void tst_QHostInfo::lookupIPv6_data()
     QTest::addColumn<int>("err");
 
     QTest::newRow("ip6") << "www.ipv6-net.org" << "62.93.217.177 2001:618:1401:0:0:0:0:4" << int(QHostInfo::NoError);
+    QTest::newRow("ip6") << "ipv6.google.com" << "2A00:1450:8007:0:0:0:0:63" << int(QHostInfo::NoError);
 
     // avoid using real IPv6 addresses here because this will do a DNS query
     // real addresses are between 2000:: and 3fff:ffff:ffff:ffff:ffff:ffff:ffff
@@ -337,7 +338,7 @@ void tst_QHostInfo::reverseLookup_data()
 
     // ### Use internal DNS instead. Discussed with Andreas.
     //QTest::newRow("classical.hexago.com") << QString("2001:5c0:0:2::24") << QStringList(QString("classical.hexago.com")) << 0;
-    QTest::newRow("origin.cisco.com") << QString("12.159.148.94") << QStringList(QString("origin.cisco.com")) << 0;
+    QTest::newRow("gitorious.org") << QString("87.238.52.168") << QStringList(QString("gitorious.org")) << 0;
     QTest::newRow("bogus-name") << QString("1::2::3::4") << QStringList() << 1;
 }
 
-- 
cgit v0.12


From 86b1e68285a4dae855a5826f76728cee347d1af2 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 15 Mar 2011 15:21:39 +0100
Subject: tst_qhostinfo: Fixes

Reviewed-by: Peter Hartmann
---
 tests/auto/qhostinfo/tst_qhostinfo.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp
index ee2fe0d..8be8dcb 100644
--- a/tests/auto/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp
@@ -291,6 +291,7 @@ void tst_QHostInfo::lookupIPv6_data()
     QTest::addColumn<int>("err");
 
     QTest::newRow("ip6") << "www.ipv6-net.org" << "62.93.217.177 2001:618:1401:0:0:0:0:4" << int(QHostInfo::NoError);
+    QTest::newRow("ip6") << "ipv6.google.com" << "2A00:1450:8007:0:0:0:0:63" << int(QHostInfo::NoError);
 
     // avoid using real IPv6 addresses here because this will do a DNS query
     // real addresses are between 2000:: and 3fff:ffff:ffff:ffff:ffff:ffff:ffff
@@ -337,7 +338,7 @@ void tst_QHostInfo::reverseLookup_data()
 
     // ### Use internal DNS instead. Discussed with Andreas.
     //QTest::newRow("classical.hexago.com") << QString("2001:5c0:0:2::24") << QStringList(QString("classical.hexago.com")) << 0;
-    QTest::newRow("origin.cisco.com") << QString("12.159.148.94") << QStringList(QString("origin.cisco.com")) << 0;
+    QTest::newRow("gitorious.org") << QString("87.238.52.168") << QStringList(QString("gitorious.org")) << 0;
     QTest::newRow("bogus-name") << QString("1::2::3::4") << QStringList() << 1;
 }
 
-- 
cgit v0.12


From 3dd9e6a40bc4131ebc35d367af69fd9197e19344 Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Tue, 15 Mar 2011 14:42:03 +0100
Subject: Option::fixString: Avoid double hash lookups for cache hits.

Reviewed-by: Oswald Buddenhagen
---
 qmake/option.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/qmake/option.cpp b/qmake/option.cpp
index fcbf5fa..28b764a 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -624,10 +624,12 @@ Option::fixString(QString string, uchar flags)
         qmakeAddCacheClear(qmakeDeleteCacheClear<QHash<FixStringCacheKey, QString> >, (void**)&cache);
     }
     FixStringCacheKey cacheKey(string, flags);
-    if(cache->contains(cacheKey)) {
-	const QString ret = cache->value(cacheKey);
-	//qDebug() << "Fix (cached) " << orig_string << "->" << ret;
-        return ret;
+
+    QHash<FixStringCacheKey, QString>::const_iterator it = cache->constFind(cacheKey);
+
+    if (it != cache->constEnd()) {
+        //qDebug() << "Fix (cached) " << orig_string << "->" << it.value();
+        return it.value();
     }
 
     //fix the environment variables
-- 
cgit v0.12


From 32d872a3456ecd7cb8c0f0437a7301e1c476bbd3 Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Tue, 15 Mar 2011 14:45:21 +0100
Subject: Option::fixString: Don't recreate same QRegExp on each function call.

Reviewed-by: Oswald Buddenhagen
---
 qmake/option.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qmake/option.cpp b/qmake/option.cpp
index 28b764a..7bee659 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -635,7 +635,7 @@ Option::fixString(QString string, uchar flags)
     //fix the environment variables
     if(flags & Option::FixEnvVars) {
         int rep;
-        QRegExp reg_var("\\$\\(.*\\)");
+        static QRegExp reg_var("\\$\\(.*\\)");
         reg_var.setMinimal(true);
         while((rep = reg_var.indexIn(string)) != -1)
             string.replace(rep, reg_var.matchedLength(),
-- 
cgit v0.12


From 3a2bb048b49e8d009d785ddd4c0ed221766cc11e Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Tue, 15 Mar 2011 14:20:03 +0100
Subject: Don't cache resolved paths in MakefileGenerator::fileFixify().

The cache ends up dog-slow because of poor distribution in hashing
of QStrings, and even with a better hashing function, computing the
result on the fly is still faster.

Tested with WebCore.pro, on Linux processing time goes from 58 to
8 seconds, and on Windows from 105 to 65 seconds.

Reviewed-by: Marius Storm-Olsen
---
 qmake/cachekeys.h             | 48 -------------------------------------------
 qmake/generators/makefile.cpp | 12 -----------
 2 files changed, 60 deletions(-)

diff --git a/qmake/cachekeys.h b/qmake/cachekeys.h
index 2957d61..b29e4f2 100644
--- a/qmake/cachekeys.h
+++ b/qmake/cachekeys.h
@@ -118,54 +118,6 @@ struct FileInfoCacheKey
 inline uint qHash(const FileInfoCacheKey &f) { return f.hashCode(); }
 
 // -------------------------------------------------------------------------------------------------
-struct FileFixifyCacheKey
-{
-    mutable uint hash;
-    QString in_d, out_d;
-    QString file, pwd;
-    uint fixType;
-    bool canonicalize;
-    FileFixifyCacheKey(const QString &f, const QString &od, const QString &id,
-                       uint ft, bool c)
-    {
-        hash = 0;
-        pwd = qmake_getpwd();
-        file = f;
-        if(od.isNull())
-            out_d = Option::output_dir;
-        else
-            out_d = od;
-        if(id.isNull())
-            in_d = qmake_getpwd();
-        else
-            in_d = id;
-        fixType = ft;
-        canonicalize = c;
-    }
-    QString toString() const {
-        return file + "--" + in_d + "--" + out_d + "--" + pwd + "--" +
-            QString::number(fixType) + "--" + QString::number((int)canonicalize);
-    }
-    bool operator==(const FileFixifyCacheKey &f) const
-    {
-        return (f.canonicalize == canonicalize &&
-                f.fixType == fixType &&
-                f.file == file &&
-                f.in_d == in_d &&
-                f.out_d == out_d &&
-                f.pwd == pwd);
-    }
-    inline uint hashCode() const {
-        if(!hash)
-            hash = uint(canonicalize) | uint(fixType) |
-                   qHash(file) | qHash(in_d) | qHash(out_d) /*|qHash(pwd)*/;
-        return hash;
-    }
-};
-
-inline uint qHash(const FileFixifyCacheKey &f) { return f.hashCode(); }
-// -------------------------------------------------------------------------------------------------
-
 template <typename T>
 inline void qmakeDeleteCacheClear(void *i) { delete reinterpret_cast<T*>(i); }
 
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 595768f..7963976 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -2813,17 +2813,6 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q
         return file;
     QString ret = unescapeFilePath(file);
 
-    //setup the cache
-    static QHash<FileFixifyCacheKey, QString> *cache = 0;
-    if(!cache) {
-        cache = new QHash<FileFixifyCacheKey, QString>;
-        qmakeAddCacheClear(qmakeDeleteCacheClear<QHash<FileFixifyCacheKey, QString> >, (void**)&cache);
-    }
-    FileFixifyCacheKey cacheKey(ret, out_d, in_d, fix, canon);
-    QString cacheVal = cache->value(cacheKey);
-    if(!cacheVal.isNull())
-        return cacheVal;
-
     //do the fixin'
     QString pwd = qmake_getpwd();
     if (!pwd.endsWith('/'))
@@ -2908,7 +2897,6 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q
     debug_msg(3, "Fixed[%d,%d] %s :: to :: %s [%s::%s] [%s::%s]", fix, canon, orig_file.toLatin1().constData(),
               ret.toLatin1().constData(), in_d.toLatin1().constData(), out_d.toLatin1().constData(),
               pwd.toLatin1().constData(), Option::output_dir.toLatin1().constData());
-    cache->insert(cacheKey, ret);
     return ret;
 }
 
-- 
cgit v0.12


From 59c7740c9d45a88713db20efbfcfbdaf3873b60c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 15 Mar 2011 18:47:11 +0000
Subject: Make creating sockets with an explicit network session thread safe

Added a mutex to QNetworkSessionPrivate
Lock the mutex in the symbian bearer plugin for functions that change
    the validity of the RConnection.
Added factory functions to open an RSocket or RHostResolver, which lock
    the mutex before the esock function calls. If there is no RConnection,
    then KErrNotReady is returned (the same as when there is an RConnection
    but it has not been started).

Task-number: QTBUG-18143
Reviewed-by: Markus Goetz
---
 src/network/bearer/qnetworksession.cpp             | 31 ++++++++++++++++++++++
 src/network/bearer/qnetworksession_p.h             |  9 +++++++
 src/network/socket/qsymbiansocketengine.cpp        | 14 +++-------
 .../bearer/symbian/qnetworksession_impl.cpp        |  3 +++
 4 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 6106550..21e64d9 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -44,10 +44,16 @@
 
 #include <QEventLoop>
 #include <QTimer>
+#include <QThread>
 
 #include "qnetworkconfigmanager_p.h"
 #include "qnetworksession_p.h"
 
+#ifdef Q_OS_SYMBIAN
+#include <es_sock.h>
+#include <private/qcore_symbian_p.h>
+#endif
+
 #ifndef QT_NO_BEARERMANAGEMENT
 
 QT_BEGIN_NAMESPACE
@@ -710,8 +716,33 @@ RConnection* QNetworkSessionPrivate::nativeSession(QNetworkSession &s)
 {
     if (!s.d)
         return 0;
+    if (s.thread() != QThread::currentThread())
+        qWarning("QNetworkSessionPrivate::nativeSession called in wrong thread");
     return s.d->nativeSession();
 }
+
+TInt QNetworkSessionPrivate::nativeOpenSocket(QNetworkSession& s, RSocket& sock, TUint family, TUint type, TUint protocol)
+{
+    if (!s.d)
+        return 0;
+    QMutexLocker lock(&(s.d->mutex));
+    RConnection *con = s.d->nativeSession();
+    if (!con || !con->SubSessionHandle())
+        return KErrNotReady;
+    return sock.Open(qt_symbianGetSocketServer(), family, type, protocol, *con);
+}
+
+TInt QNetworkSessionPrivate::nativeOpenHostResolver(QNetworkSession& s, RHostResolver& resolver, TUint family, TUint protocol)
+{
+    if (!s.d)
+        return 0;
+    QMutexLocker lock(&(s.d->mutex));
+    RConnection *con = s.d->nativeSession();
+    if (!con || !con->SubSessionHandle())
+        return KErrNotReady;
+    return resolver.Open(qt_symbianGetSocketServer(), family, protocol, *con);
+}
+
 #endif
 
 #include "moc_qnetworksession.cpp"
diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
index e2fcfe6..b359f80 100644
--- a/src/network/bearer/qnetworksession_p.h
+++ b/src/network/bearer/qnetworksession_p.h
@@ -61,6 +61,8 @@
 
 #ifdef Q_OS_SYMBIAN
 class RConnection;
+class RSocket;
+class RHostResolver;
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -108,8 +110,13 @@ public:
     virtual quint64 activeTime() const = 0;
 
 #ifdef Q_OS_SYMBIAN
+    // get internal RConnection (not thread safe, call only from thread that owns the QNetworkSession)
     static RConnection* nativeSession(QNetworkSession&);
     virtual RConnection* nativeSession() = 0;
+    // open socket using the internal RConnection (thread safe)
+    static TInt nativeOpenSocket(QNetworkSession& session, RSocket& socket, TUint family, TUint type, TUint protocol);
+    // open host resolver using the internal RConnection (thread safe)
+    static TInt nativeOpenHostResolver(QNetworkSession& session, RHostResolver& resolver, TUint family, TUint protocol);
 #endif
 protected:
     inline QNetworkConfigurationPrivatePointer privateConfiguration(const QNetworkConfiguration &config) const
@@ -150,6 +157,8 @@ protected:
 
     QNetworkSession::State state;
     bool isOpen;
+
+    QMutex mutex;
 };
 
 QT_END_NAMESPACE
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index be04b56..688f724 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -189,21 +189,13 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     //Check if there is a user specified session
     RConnection *connection = 0;
     QVariant v(q->property("_q_networksession"));
+    TInt err;
     if (v.isValid()) {
         QSharedPointer<QNetworkSession> s = qvariant_cast<QSharedPointer<QNetworkSession> >(v);
-        connection = QNetworkSessionPrivate::nativeSession(*s);
+        err = QNetworkSessionPrivate::nativeOpenSocket(*s, nativeSocket, family, type, protocol);
 #ifdef QNATIVESOCKETENGINE_DEBUG
-        qDebug() << "QSymbianSocketEnginePrivate::createNewSocket - _q_networksession was set" << connection;
+        qDebug() << "QSymbianSocketEnginePrivate::createNewSocket - _q_networksession was set" << err;
 #endif
-    }
-    TInt err;
-    if (connection) {
-        if (connection->SubSessionHandle())
-            err = nativeSocket.Open(socketServer, family, type, protocol, *connection);
-        else {
-            setError(QAbstractSocket::NetworkError, SessionNotOpenErrorString);
-            return false;
-        }
     } else
         err = nativeSocket.Open(socketServer, family, type, protocol); //TODO: FIXME - deprecated API, make sure we always have a connection instead
 
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 5325293..a9bd414 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -76,6 +76,7 @@ QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
 
 void QNetworkSessionPrivateImpl::closeHandles()
 {
+    QMutexLocker lock(&mutex);
     // Cancel Connection Progress Notifications first.
     // Note: ConnectionNotifier must be destroyed before RConnection::Close()
     //       => deleting ipConnectionNotifier results RConnection::CancelProgressNotification()
@@ -317,6 +318,7 @@ QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const
 
 void QNetworkSessionPrivateImpl::open()
 {
+    QMutexLocker lock(&mutex);
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
         qDebug() << "QNS this : " << QString::number((uint)this) << " - "
                 << "open() called, session state is: " << state << " and isOpen is: "
@@ -526,6 +528,7 @@ void QNetworkSessionPrivateImpl::close(bool allowSignals)
 
 void QNetworkSessionPrivateImpl::stop()
 {
+    QMutexLocker lock(&mutex);
 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
     qDebug() << "QNS this : " << QString::number((uint)this) << " - "
             << "stop() called, session state is: " << state << " and isOpen is : "
-- 
cgit v0.12


From 8f239f0b0cb7faa580ba66197f56fb3d8109aaf7 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 16 Mar 2011 13:00:43 +0000
Subject: Implement IPv6 in symbian QNetworkInterface

For IPv6 interfaces, the network mask is reported correctly, so we use
that.
For IPv4 interfaces, the network mask is reported as 0.0.0.0 so the
existing workaround to get the netmask from routes is used.
For loopback interfaces, the mask can be statically determined.

Skip checking the routes if proper masks were reported for all the
interfaces.

Added a helper function for converting TInetAddr -> QHostAddress using
the constructors that take binary data. (better than conversion to/from
strings)

Task-number: QTBUG-18137
Reviewed-by: Markus Goetz
---
 src/network/kernel/qnetworkinterface_symbian.cpp | 128 +++++++++++++++--------
 1 file changed, 83 insertions(+), 45 deletions(-)

diff --git a/src/network/kernel/qnetworkinterface_symbian.cpp b/src/network/kernel/qnetworkinterface_symbian.cpp
index 42a041c..7767f54 100644
--- a/src/network/kernel/qnetworkinterface_symbian.cpp
+++ b/src/network/kernel/qnetworkinterface_symbian.cpp
@@ -67,10 +67,24 @@ static QNetworkInterface::InterfaceFlags convertFlags(const TSoInetInterfaceInfo
     return flags;
 }
 
+//TODO: share this, at least QHostInfo needs to do the same thing
+static QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr)
+{
+    //TODO: do we want to call v4 mapped addresses v4 or v6 outside of this file?
+    if (addr.IsV4Mapped() || addr.Family() == KAfInet) {
+        //convert v4 host address
+        return QHostAddress(addr.Address());
+    } else {
+        //convert v6 host address
+        return QHostAddress((quint8 *)(addr.Ip6Address().u.iAddr8));
+    }
+}
+
 static QList<QNetworkInterfacePrivate *> interfaceListing()
 {
     TInt err(KErrNone);
     QList<QNetworkInterfacePrivate *> interfaces;
+    QList<QHostAddress> addressesWithEstimatedNetmasks;
 
     // Open dummy socket for interface queries
     RSocket socket;
@@ -90,8 +104,7 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     TPckgBuf<TSoInetInterfaceInfo> infoPckg;
     TSoInetInterfaceInfo &info = infoPckg();
     while (socket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, infoPckg) == KErrNone) {
-        // Do not include IPv6 addresses because netmask and broadcast address cannot be determined correctly
-        if (info.iName != KNullDesC && info.iAddress.IsV4Mapped()) {
+        if (info.iName != KNullDesC) {
             TName address;
             QNetworkAddressEntry entry;
             QNetworkInterfacePrivate *iface = 0;
@@ -113,40 +126,58 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
             }
 
             // Get the address of the interface
-            info.iAddress.Output(address);
-            entry.setIp(QHostAddress(qt_TDesC2QString(address)));
+            entry.setIp(qt_QHostAddressFromTInetAddr(info.iAddress));
+
+#if defined(QNETWORKINTERFACE_DEBUG)
+            qDebug() << "address is" << info.iAddress.Family() << entry.ip();
+            qDebug() << "netmask is" << info.iNetMask.Family() << qt_QHostAddressFromTInetAddr( info.iNetMask );
+#endif
 
             // Get the interface netmask
-            // For some reason netmask is always 0.0.0.0
-            // info.iNetMask.Output(address);
-            // entry.setNetmask( QHostAddress( qt_TDesC2QString( address ) ) );
-
-            // Workaround: Let Symbian determine netmask based on IP address class
-            // TODO: Works only for IPv4 - Task: 259128 Implement IPv6 support
-            TInetAddr netmask;
-            netmask.NetMask(info.iAddress);
-            netmask.Output(address);
-            entry.setNetmask(QHostAddress(qt_TDesC2QString(address)));
-
-            // Get the interface broadcast address
-            if (iface->flags & QNetworkInterface::CanBroadcast) {
-                // For some reason broadcast address is always 0.0.0.0
-                // info.iBrdAddr.Output(address);
-                // entry.setBroadcast( QHostAddress( qt_TDesC2QString( address ) ) );
-
-                // Workaround: Let Symbian determine broadcast address based on IP address
-                // TODO: Works only for IPv4 - Task: 259128 Implement IPv6 support
-                TInetAddr broadcast;
-                broadcast.NetBroadcast(info.iAddress);
-                broadcast.Output(address);
-                entry.setBroadcast(QHostAddress(qt_TDesC2QString(address)));
+            if (info.iNetMask.IsUnspecified()) {
+                // For some reason netmask is always 0.0.0.0 for IPv4 interfaces
+                // and loopback interfaces (which we statically know)
+                if (info.iAddress.IsV4Mapped()) {
+                    if (info.iFeatures & KIfIsLoopback) {
+                        entry.setPrefixLength(32);
+                    } else {
+                        // Workaround: Let Symbian determine netmask based on IP address class (IPv4 only API)
+                        TInetAddr netmask;
+                        netmask.NetMask(info.iAddress);
+                        entry.setNetmask(QHostAddress(netmask.Address())); //binary convert v4 address
+                        addressesWithEstimatedNetmasks << entry.ip();
+#if defined(QNETWORKINTERFACE_DEBUG)
+                        qDebug() << "address class determined netmask" << entry.netmask();
+#endif
+                    }
+                } else {
+                    // For IPv6 interfaces
+                    if (info.iFeatures & KIfIsLoopback) {
+                        entry.setPrefixLength(128);
+                    } else if (info.iNetMask.IsUnspecified()) {
+                        //Don't see this error for IPv6, but try to handle it if it happens
+                        entry.setPrefixLength(64); //most common
+#if defined(QNETWORKINTERFACE_DEBUG)
+                        qDebug() << "total guess netmask" << entry.netmask();
+#endif
+                        addressesWithEstimatedNetmasks << entry.ip();
+                    }
+                }
+            } else {
+                //Expected code path for IPv6 non loopback interfaces (IPv4 could come here if symbian is fixed)
+                entry.setNetmask(qt_QHostAddressFromTInetAddr(info.iNetMask));
+#if defined(QNETWORKINTERFACE_DEBUG)
+                qDebug() << "reported netmask" << entry.netmask();
+#endif
             }
 
+            // broadcast address is determined from the netmask in postProcess()
+
             // Add new entry to interface address entries
             iface->addressEntries << entry;
 
 #if defined(QNETWORKINTERFACE_DEBUG)
-            printf("\n       Found network interface %s, interface flags:\n\
+            qDebug("\n       Found network interface %s, interface flags:\n\
                 IsUp = %d, IsRunning = %d, CanBroadcast = %d,\n\
                 IsLoopBack = %d, IsPointToPoint = %d, CanMulticast = %d, \n\
                 ip = %s, netmask = %s, broadcast = %s,\n\
@@ -160,8 +191,14 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
         }
     }
 
+    // if we didn't have to guess any netmasks, then we're done.
+    if (addressesWithEstimatedNetmasks.isEmpty()) {
+        socket.Close();
+        return interfaces;
+    }
+
     // we will try to use routing info to detect more precisely
-    // netmask and then ::postProcess() should calculate
+    // estimated netmasks and then ::postProcess() should calculate
     // broadcast addresses
 
     // use dummy socket to start enumerating routes
@@ -176,16 +213,21 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
     TSoInetRouteInfo routeInfo;
     TPckg<TSoInetRouteInfo> routeInfoPkg(routeInfo);
     while (socket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, routeInfoPkg) == KErrNone) {
-        TName address;
-
         // get interface address
-        routeInfo.iIfAddr.Output(address);
-        QHostAddress ifAddr(qt_TDesC2QString(address));
+        QHostAddress ifAddr(qt_QHostAddressFromTInetAddr(routeInfo.iIfAddr));
         if (ifAddr.isNull())
             continue;
+        if (!addressesWithEstimatedNetmasks.contains(ifAddr)) {
+#if defined(QNETWORKINTERFACE_DEBUG)
+            qDebug() << "skipping route from" << ifAddr << "because it wasn't an estimated netmask";
+#endif
+            continue;
+        }
 
-        routeInfo.iDstAddr.Output(address);
-        QHostAddress destination(qt_TDesC2QString(address));
+        QHostAddress destination(qt_QHostAddressFromTInetAddr(routeInfo.iDstAddr));
+#if defined(QNETWORKINTERFACE_DEBUG)
+        qDebug() << "route from" << ifAddr << "to" << destination;
+#endif
         if (destination.isNull() || destination != ifAddr)
             continue;
 
@@ -196,17 +238,13 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
                 QNetworkAddressEntry entry = iface->addressEntries.at(eindex);
                 if (entry.ip() != ifAddr) {
                     continue;
-                } else if (entry.ip().protocol() != QAbstractSocket::IPv4Protocol) {
-                    // skip if not IPv4 address (e.g. IPv6)
-                    // as results not reliable on Symbian
-                    continue;
-                } else {
-                    routeInfo.iNetMask.Output(address);
-                    QHostAddress netmask(qt_TDesC2QString(address));
+                } else if (!routeInfo.iNetMask.IsUnspecified()) {
+                    //the route may also return 0.0.0.0 netmask, in which case don't use it.
+                    QHostAddress netmask(qt_QHostAddressFromTInetAddr(routeInfo.iNetMask));
                     entry.setNetmask(netmask);
-                    // NULL boradcast address for
-                    // ::postProcess to have effect
-                    entry.setBroadcast(QHostAddress());
+#if defined(QNETWORKINTERFACE_DEBUG)
+                    qDebug() << " - route netmask" << routeInfo.iNetMask.Family() << netmask << " (using route determined netmask)";
+#endif
                     iface->addressEntries.replace(eindex, entry);
                 }
             }
-- 
cgit v0.12


From fd009286dfcea0a849d85c824f214e640c4d4ce2 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 16 Mar 2011 13:06:08 +0100
Subject: QTcpSocket: Fix for disconnect in Unbuffered mode.

We need to set the state properly after we have been disconnected.
Also fix the HTTP layer, it needs to handle the disconnect
when reading.

Reviewed-by: Peter Hartmann
---
 src/network/access/qhttpnetworkconnectionchannel.cpp | 13 ++++++++-----
 src/network/socket/qabstractsocket.cpp               |  2 ++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index 6a05fd3..62c6fab 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -915,15 +915,18 @@ bool QHttpNetworkConnectionChannel::isSocketReading() const
 //private slots
 void QHttpNetworkConnectionChannel::_q_readyRead()
 {
-    // We got a readyRead but no bytes are available..
-    // This happens for the Unbuffered QTcpSocket
-    // Also check if socket is in ConnectedState since
-    // this function may also be invoked via the event loop.
     if (socket->state() == QAbstractSocket::ConnectedState && socket->bytesAvailable() == 0) {
+        // We got a readyRead but no bytes are available..
+        // This happens for the Unbuffered QTcpSocket
+        // Also check if socket is in ConnectedState since
+        // this function may also be invoked via the event loop.
         char c;
         qint64  ret = socket->peek(&c, 1);
         if (ret < 0) {
-            socket->disconnectFromHost();
+            _q_error(socket->error());
+            // We still need to handle the reply so it emits its signals etc.
+            if (reply)
+                _q_receiveReply();
             return;
         }
     }
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 2a942cc..c7c2e82 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -2210,6 +2210,8 @@ qint64 QAbstractSocket::readData(char *data, qint64 maxSize)
         } else if (readBytes < 0) {
             d->socketError = d->socketEngine->error();
             setErrorString(d->socketEngine->errorString());
+            d->resetSocketLayer();
+            d->state = QAbstractSocket::UnconnectedState;
         } else if (!d->socketEngine->isReadNotificationEnabled()) {
             // Only do this when there was no error
             d->socketEngine->setReadNotificationEnabled(true);
-- 
cgit v0.12


From 0112a4ce3980bfaf5a3e45a5f77cf65700db5436 Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Thu, 17 Mar 2011 14:53:13 +0100
Subject: QNAM: fix the tst_QNetworkAccessManager_And_QProgressDialog auto test

QNetworkAccessHttpBackend::replyDownloadData could possibly be called
recursivly as it will emit downloadProgress. In the case of this test
the progress dialog calls progressEvents() which will cause the
recursion.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccesshttpbackend.cpp       |  7 ++++++-
 src/network/access/qnetworkreplyimpl.cpp               | 14 ++++++++++----
 .../tst_qnetworkaccessmanager_and_qprogressdialog.cpp  | 18 +++++++++++++++++-
 3 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 4908e0a..120e3a7 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -711,8 +711,13 @@ void QNetworkAccessHttpBackend::replyDownloadData(QByteArray d)
 
     pendingDownloadData.append(d);
     d.clear();
-    writeDownstreamData(pendingDownloadData);
+    // We need to usa a copy for calling writeDownstreamData as we could
+    // possibly recurse into this this function when we call
+    // appendDownstreamDataSignalEmissions because the user might call
+    // processEvents() or spin an event loop when this occur.
+    QByteDataBuffer pendingDownloadDataCopy = pendingDownloadData;
     pendingDownloadData.clear();
+    writeDownstreamData(pendingDownloadDataCopy);
 }
 
 void QNetworkAccessHttpBackend::replyFinished()
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 485f449..ce42327 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -178,9 +178,11 @@ void QNetworkReplyImplPrivate::_q_copyReadyRead()
     if (preMigrationDownloaded != Q_INT64_C(-1))
         totalSize = totalSize.toLongLong() + preMigrationDownloaded;
     pauseNotificationHandling();
+    // emit readyRead before downloadProgress incase this will cause events to be
+    // processed and we get into a recursive call (as in QProgressDialog).
+    emit q->readyRead();
     emit q->downloadProgress(bytesDownloaded,
                              totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
-    emit q->readyRead();
     resumeNotificationHandling();
 }
 
@@ -579,11 +581,13 @@ void QNetworkReplyImplPrivate::appendDownstreamDataSignalEmissions()
     if (preMigrationDownloaded != Q_INT64_C(-1))
         totalSize = totalSize.toLongLong() + preMigrationDownloaded;
     pauseNotificationHandling();
-    emit q->downloadProgress(bytesDownloaded,
-                             totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
     // important: At the point of this readyRead(), the data parameter list must be empty,
     // else implicit sharing will trigger memcpy when the user is reading data!
     emit q->readyRead();
+    // emit readyRead before downloadProgress incase this will cause events to be
+    // processed and we get into a recursive call (as in QProgressDialog).
+    emit q->downloadProgress(bytesDownloaded,
+                             totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
 
     resumeNotificationHandling();
     // do we still have room in the buffer?
@@ -684,10 +688,12 @@ void QNetworkReplyImplPrivate::appendDownstreamDataDownloadBuffer(qint64 bytesRe
 
     downloadBufferCurrentSize = bytesReceived;
 
-    emit q->downloadProgress(bytesDownloaded, bytesTotal);
     // Only emit readyRead when actual data is there
+    // emit readyRead before downloadProgress incase this will cause events to be
+    // processed and we get into a recursive call (as in QProgressDialog).
     if (bytesDownloaded > 0)
         emit q->readyRead();
+    emit q->downloadProgress(bytesDownloaded, bytesTotal);
 }
 
 void QNetworkReplyImplPrivate::finished()
diff --git a/tests/auto/qnetworkaccessmanager_and_qprogressdialog/tst_qnetworkaccessmanager_and_qprogressdialog.cpp b/tests/auto/qnetworkaccessmanager_and_qprogressdialog/tst_qnetworkaccessmanager_and_qprogressdialog.cpp
index 42bb069..f7c5ca1 100644
--- a/tests/auto/qnetworkaccessmanager_and_qprogressdialog/tst_qnetworkaccessmanager_and_qprogressdialog.cpp
+++ b/tests/auto/qnetworkaccessmanager_and_qprogressdialog/tst_qnetworkaccessmanager_and_qprogressdialog.cpp
@@ -58,6 +58,7 @@ public:
     tst_QNetworkAccessManager_And_QProgressDialog();
 private slots:
     void downloadCheck();
+    void downloadCheck_data();
 };
 
 class DownloadCheckWidget : public QWidget
@@ -72,9 +73,14 @@ public:
         QMetaObject::invokeMethod(this, "go", Qt::QueuedConnection);
     }
     bool lateReadyRead;
+    bool zeroCopy;
 public slots:
     void go()
     {
+        QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile"));
+        if (zeroCopy)
+            request.setAttribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute, 10*1024*1024);
+                
         QNetworkReply *reply = netmanager.get(
                 QNetworkRequest(
                 QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile")
@@ -106,20 +112,30 @@ public slots:
         QTestEventLoop::instance().exitLoop();
     }
 
-
 private:
     QProgressDialog progressDlg;
     QNetworkAccessManager netmanager;
 };
 
+
 tst_QNetworkAccessManager_And_QProgressDialog::tst_QNetworkAccessManager_And_QProgressDialog()
 {
     Q_SET_DEFAULT_IAP
 }
 
+void tst_QNetworkAccessManager_And_QProgressDialog::downloadCheck_data()
+{
+    QTest::addColumn<bool>("useZeroCopy");
+    QTest::newRow("with-zeroCopy") << true;
+    QTest::newRow("without-zeroCopy") << false;
+}
+
 void tst_QNetworkAccessManager_And_QProgressDialog::downloadCheck()
 {
+    QFETCH(bool, useZeroCopy);
+
     DownloadCheckWidget widget;
+    widget.zeroCopy = useZeroCopy;
     widget.show();
     // run and exit on finished()
     QTestEventLoop::instance().enterLoop(10);
-- 
cgit v0.12


From 6f7076d6fe80f656d8d2f7f1b005dc138b05bef3 Mon Sep 17 00:00:00 2001
From: Aaron Tunney <ext-aaron.2.tunney@nokia.com>
Date: Wed, 9 Mar 2011 14:26:43 +0000
Subject: Implementation of async DNS lookup.

Reviewed-by: Shane Kearns
---
 src/network/kernel/qhostinfo.cpp         |  53 ++++-
 src/network/kernel/qhostinfo_p.h         | 115 ++++++++++-
 src/network/kernel/qhostinfo_symbian.cpp | 323 ++++++++++++++++++++++++++++++-
 3 files changed, 473 insertions(+), 18 deletions(-)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index 5ec6041..7a15a05 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -56,10 +56,14 @@
 
 QT_BEGIN_NAMESPACE
 
-Q_GLOBAL_STATIC(QHostInfoLookupManager, theHostInfoLookupManager)
-
 //#define QHOSTINFO_DEBUG
 
+#ifndef Q_OS_SYMBIAN
+Q_GLOBAL_STATIC(QHostInfoLookupManager, theHostInfoLookupManager)
+#else
+Q_GLOBAL_STATIC(QSymbianHostInfoLookupManger, theHostInfoLookupManager)
+#endif
+
 /*!
     \class QHostInfo
     \brief The QHostInfo class provides static functions for host name lookups.
@@ -152,6 +156,7 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver,
     qDebug("QHostInfo::lookupHost(\"%s\", %p, %s)",
            name.toLatin1().constData(), receiver, member ? member + 1 : 0);
 #endif
+
     if (!QAbstractEventDispatcher::instance(QThread::currentThread())) {
         qWarning("QHostInfo::lookupHost() called with no event dispatcher");
         return -1;
@@ -172,7 +177,9 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver,
         return id;
     }
 
+#ifndef Q_OS_SYMBIAN
     QHostInfoLookupManager *manager = theHostInfoLookupManager();
+
     if (manager) {
         // the application is still alive
         if (manager->cache.isEnabled()) {
@@ -187,11 +194,38 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver,
                 return id;
             }
         }
+
         // cache is not enabled or it was not in the cache, do normal lookup
         QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id);
         QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
         manager->scheduleLookup(runnable);
     }
+#else
+    QSymbianHostInfoLookupManger *manager = theHostInfoLookupManager();
+
+    if (manager) {
+        // the application is still alive
+        if (manager->cache.isEnabled()) {
+            // check cache first
+            bool valid = false;
+            QHostInfo info = manager->cache.get(name, &valid);
+            if (valid) {
+                info.setLookupId(id);
+                QHostInfoResult result;
+                QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
+                result.emitResultsReady(info);
+                return id;
+            }
+        }
+
+        // cache is not enabled or it was not in the cache, do normal lookup
+        QSymbianHostResolver *symbianResolver = 0;
+        QT_TRAP_THROWING(symbianResolver = new QSymbianHostResolver(name, id));
+        QObject::connect(&symbianResolver->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
+        manager->scheduleLookup(symbianResolver);
+    }
+#endif
+
     return id;
 }
 
@@ -225,7 +259,7 @@ QHostInfo QHostInfo::fromName(const QString &name)
 #endif
 
     QHostInfo hostInfo = QHostInfoAgent::fromName(name);
-    QHostInfoLookupManager *manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
     manager->cache.put(name, hostInfo);
     return hostInfo;
 }
@@ -406,6 +440,7 @@ void QHostInfo::setErrorString(const QString &str)
     \sa hostName()
 */
 
+#ifndef Q_OS_SYMBIAN
 QHostInfoRunnable::QHostInfoRunnable(QString hn, int i) : toBeLookedUp(hn), id(i)
 {
     setAutoDelete(true);
@@ -632,6 +667,7 @@ void QHostInfoLookupManager::lookupFinished(QHostInfoRunnable *r)
     finishedLookups.append(r);
     work();
 }
+#endif
 
 // This function returns immediately when we had a result in the cache, else it will later emit a signal
 QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char *member, bool *valid, int *id)
@@ -640,7 +676,7 @@ QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char
     *id = -1;
 
     // check cache
-    QHostInfoLookupManager* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
     if (manager && manager->cache.isEnabled()) {
         QHostInfo info = manager->cache.get(name, valid);
         if (*valid) {
@@ -657,7 +693,7 @@ QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char
 
 void qt_qhostinfo_clear_cache()
 {
-    QHostInfoLookupManager* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
     if (manager) {
         manager->clear();
     }
@@ -665,7 +701,7 @@ void qt_qhostinfo_clear_cache()
 
 void Q_AUTOTEST_EXPORT qt_qhostinfo_enable_cache(bool e)
 {
-    QHostInfoLookupManager* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
     if (manager) {
         manager->cache.setEnabled(e);
     }
@@ -733,4 +769,9 @@ void QHostInfoCache::clear()
     cache.clear();
 }
 
+QAbstractHostInfoLookupManger* QAbstractHostInfoLookupManger::globalInstance()
+{
+    return theHostInfoLookupManager();
+}
+
 QT_END_NAMESPACE
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index b568ec2..ec7a63e 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -69,9 +69,18 @@
 #include <QElapsedTimer>
 #include <QCache>
 
+#include <QNetworkSession>
+
+#ifdef Q_OS_SYMBIAN
+// Symbian Headers
+#include <es_sock.h>
+#include <in_sock.h>
+#endif
+
 
 QT_BEGIN_NAMESPACE
 
+
 class QHostInfoResult : public QObject
 {
     Q_OBJECT
@@ -91,6 +100,12 @@ class QHostInfoAgent : public QObject
     Q_OBJECT
 public:
     static QHostInfo fromName(const QString &hostName);
+    static QHostInfo fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession);
+
+#ifdef Q_OS_SYMBIAN
+    static int lookupHost(const QString &name, QObject *receiver, const char *member);
+    static void abortHostLookup(int lookupId);
+#endif
 };
 
 class QHostInfoPrivate
@@ -151,7 +166,25 @@ public:
     QHostInfoResult resultEmitter;
 };
 
-class QHostInfoLookupManager : public QObject
+
+class QAbstractHostInfoLookupManger : public QObject
+{
+    Q_OBJECT
+
+public:
+    ~QAbstractHostInfoLookupManger() {}
+    virtual void clear() = 0;
+
+    QHostInfoCache cache;
+
+protected:
+     QAbstractHostInfoLookupManger() {}
+     static QAbstractHostInfoLookupManger* globalInstance();
+
+};
+
+#ifndef Q_OS_SYMBIAN
+class QHostInfoLookupManager : public QAbstractInfoLookupManager
 {
     Q_OBJECT
 public:
@@ -169,8 +202,6 @@ public:
     void lookupFinished(QHostInfoRunnable *r);
     bool wasAborted(int id);
 
-    QHostInfoCache cache;
-
     friend class QHostInfoRunnable;
 protected:
     QList<QHostInfoRunnable*> currentLookups; // in progress
@@ -189,6 +220,84 @@ private slots:
     void waitForThreadPoolDone() { threadPool.waitForDone(); }
 };
 
+#else
+
+class QSymbianHostResolver : public CActive
+{
+public:
+    QSymbianHostResolver(const QString &hostName, int id);
+    ~QSymbianHostResolver();
+
+    QHostInfo requestHostLookup();
+    int id();
+
+    QHostInfoResult resultEmitter;
+
+private:
+    void DoCancel();
+    void RunL();
+    void run();
+    TInt RunError(TInt aError);
+
+    void processNameResults();
+    void processAddressResults();
+
+private:
+    int iId;
+
+    const QString iHostName;
+
+    RSocketServ& iSocketServ;
+    RHostResolver iHostResolver;
+
+    TRequestStatus iStatus;
+
+    TNameEntry iNameResult;
+    QHostAddress iAddress;
+
+    QHostInfo iResults;
+
+    enum {
+        EIdle,
+        EGetByName,
+        EGetByAddress
+    } iState;
+};
+
+class QSymbianHostInfoLookupManger : public QAbstractHostInfoLookupManger
+{
+    Q_OBJECT
+public:
+    QSymbianHostInfoLookupManger();
+    ~QSymbianHostInfoLookupManger();
+
+    static QSymbianHostInfoLookupManger* globalInstance();
+
+    int id();
+    void clear();
+
+    // called from QHostInfo
+    void scheduleLookup(QSymbianHostResolver *r);
+    void abortLookup(int id);
+
+    // called from QSymbianHostResolver
+    void lookupFinished(QSymbianHostResolver *r);
+
+private:
+    void runNextLookup();
+
+    static const int KMaxConcurrentLookups = 5;
+
+    RPointerArray<QSymbianHostResolver> iCurrentLookups;
+    RPointerArray<QSymbianHostResolver> iScheduledLookups;
+    RPointerArray<QSymbianHostResolver> iFinishedLookups;
+
+    QMutex mutex;
+};
+#endif
+
+
+
 QT_END_NAMESPACE
 
 #endif // QHOSTINFO_P_H
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 9599274..2b582bd 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -41,10 +41,6 @@
 
 //#define QHOSTINFO_DEBUG
 
-// Symbian Headers
-#include <es_sock.h>
-#include <in_sock.h>
-
 // Qt Headers
 #include <QByteArray>
 #include <QUrl>
@@ -54,11 +50,13 @@
 
 #include "qhostinfo_p.h"
 #include <private/qcore_symbian_p.h>
+#include <private/qsystemerror_p.h>
 
 QT_BEGIN_NAMESPACE
 
 
-QHostInfo QHostInfoAgent::fromName(const QString &hostName)
+
+QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession)
 {
     QHostInfo results;
 
@@ -66,12 +64,20 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     RSocketServ socketServ(qt_symbianGetSocketServer());
     RHostResolver hostResolver;
 
+
+    // TODO - check if networkSession is null
+    // RConnection connection = magicalApi(networkSession);
+    // int err = connection.Open(blah, blah);
+    // if (err) {
+    //          do something;
+    // }
+
     // Will return both IPv4 and IPv6
     // TODO: Pass RHostResolver.Open() the global RConnection
     int err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
     if (err) {
         results.setError(QHostInfo::UnknownError);
-        results.setErrorString(tr("Symbian error code: %1").arg(err));
+        results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
 
         return results;
     }
@@ -99,7 +105,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
                 results.setErrorString(tr("Host not found"));
             } else {
                 results.setError(QHostInfo::UnknownError);
-                results.setErrorString(tr("Symbian error code: %1").arg(err));
+                results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
             }
 
             return results;
@@ -134,7 +140,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
             results.setErrorString(tr("Host not found"));
         } else {
             results.setError(QHostInfo::UnknownError);
-            results.setErrorString(tr("Symbian error code: %1").arg(err));
+            results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
         }
 
         return results;
@@ -156,7 +162,8 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
         hostAdd = nameResult().iAddr;
         hostAdd.Output(ipAddr);
 
-        if (ipAddr.Length() > 0) {
+        // Ensure that record is valid (not an alias and with length greater than 0)
+        if (!(nameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
            if (nameResult().iAddr.Family() == KAfInet) {
                 // IPv4 - prepend
                 hostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
@@ -173,6 +180,13 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName)
     return results;
 }
 
+QHostInfo QHostInfoAgent::fromName(const QString &hostName)
+{
+    // null shared pointer
+    QSharedPointer<QNetworkSession> networkSession;
+    return fromName(hostName, networkSession);
+}
+
 QString QHostInfo::localHostName()
 {
     // Connect to ESOCK
@@ -201,4 +215,295 @@ QString QHostInfo::localDomainName()
     return QString();
 }
 
+
+QSymbianHostResolver::QSymbianHostResolver(const QString &hostName, int identifier)
+    : CActive(CActive::EPriorityStandard), iId(identifier), iHostName(hostName),
+      iSocketServ(qt_symbianGetSocketServer())
+{
+    CActiveScheduler::Add(this);
+}
+
+QSymbianHostResolver::~QSymbianHostResolver()
+{
+    Cancel();
+    iHostResolver.Close();
+}
+
+// Async equivalent to QHostInfoAgent::fromName()
+QHostInfo QSymbianHostResolver::requestHostLookup()
+{
+
+#if defined(QHOSTINFO_DEBUG)
+    qDebug("QHostInfoAgent::fromName(%s) looking up...",
+           hostName.toLatin1().constData());
+#endif
+
+    int err = iHostResolver.Open(iSocketServ, KAfInet, KProtocolInetUdp);
+    if (err) {
+        // What are we doing with iResults??
+        iResults.setError(QHostInfo::UnknownError);
+        iResults.setErrorString(QObject::tr("Symbian error code: %1").arg(err));
+
+        iHostResolver.Close();
+        return iResults;
+    }
+
+    if (iAddress.setAddress(iHostName)) {
+        // Reverse lookup
+
+        TInetAddr IpAdd;
+        IpAdd.Input(qt_QString2TPtrC(iHostName));
+
+        // Asynchronous request.
+        iHostResolver.GetByAddress(IpAdd, iNameResult, iStatus); // <---- ASYNC
+        iState = EGetByAddress;
+
+    } else {
+
+        // IDN support
+        QByteArray aceHostname = QUrl::toAce(iHostName);
+        iResults.setHostName(iHostName);
+        if (aceHostname.isEmpty()) {
+            iResults.setError(QHostInfo::HostNotFound);
+            iResults.setErrorString(iHostName.isEmpty() ?
+                                   QCoreApplication::translate("QHostInfoAgent", "No host name given") :
+                                   QCoreApplication::translate("QHostInfoAgent", "Invalid hostname"));
+
+            iHostResolver.Close();
+            return iResults;
+        }
+
+        // Asynchronous request.
+        iHostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), iNameResult, iStatus);
+        iState = EGetByName;
+    }
+
+    SetActive();
+
+    return iResults;
+}
+
+void QSymbianHostResolver::DoCancel()
+{
+    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    manager->lookupFinished(this);
+    iHostResolver.Cancel();
+}
+
+void QSymbianHostResolver::RunL()
+{
+    QT_TRYCATCH_LEAVING(run());
+}
+
+void QSymbianHostResolver::run()
+{
+    if (iState == EGetByName)
+        processNameResults();
+    else if (iState == EGetByAddress)
+        processAddressResults();
+
+    iState = EIdle;
+
+    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    manager->lookupFinished(this);
+
+    resultEmitter.emitResultsReady(iResults);
+
+    delete this;
+}
+
+TInt QSymbianHostResolver::RunError(TInt aError)
+{
+    QT_TRY {
+        iState = EIdle;
+
+        QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+        manager->lookupFinished(this);
+
+        iResults.setError(QHostInfo::UnknownError);
+        iResults.setErrorString(QSystemError(aError,QSystemError::NativeError).toString());
+
+        resultEmitter.emitResultsReady(iResults);
+    }
+    QT_CATCH(...) {}
+
+    delete this;
+
+    return KErrNone;
+}
+
+void QSymbianHostResolver::processNameResults()
+{
+    TInt err = iStatus.Int();
+    if (err < 0) {
+        // TODO - Could there be other errors? Symbian docs don't say.
+        if (err = KErrNotFound) {
+            iResults.setError(QHostInfo::HostNotFound);
+            iResults.setErrorString(QObject::tr("Host not found"));
+        } else {
+            iResults.setError(QHostInfo::UnknownError);
+            iResults.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
+        }
+
+        iHostResolver.Close();
+        return;
+    }
+
+    QList<QHostAddress> hostAddresses;
+
+    TInetAddr hostAdd = iNameResult().iAddr;
+    // 39 is the maximum length of an IPv6 address.
+    TBuf<39> ipAddr;
+
+    // Fill ipAddr with the IP address from hostAdd
+    hostAdd.Output(ipAddr);
+    if (ipAddr.Length() > 0)
+        hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+
+    // Check if there's more than one IP address linkd to this name
+    while (iHostResolver.Next(iNameResult) == KErrNone) {
+        hostAdd = iNameResult().iAddr;
+        hostAdd.Output(ipAddr);
+
+        // Ensure that record is valid (not an alias and with length greater than 0)
+        if (!(iNameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
+           if (iNameResult().iAddr.Family() == KAfInet) {
+                // IPv4 - prepend
+                hostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
+            } else {
+                // IPv6 - append
+                hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+            }
+        }
+    }
+
+    iResults.setAddresses(hostAddresses);
+}
+
+void QSymbianHostResolver::processAddressResults()
+{
+    TInt err = iStatus.Int();
+
+    if (err < 0) {
+        // TODO - Could there be other errors? Symbian docs don't say.
+        if (err = KErrNotFound) {
+            iResults.setError(QHostInfo::HostNotFound);
+            iResults.setErrorString(QObject::tr("Host not found"));
+        } else {
+            iResults.setError(QHostInfo::UnknownError);
+            iResults.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
+        }
+
+        return;
+    }
+
+    iResults.setHostName(qt_TDesC2QString(iNameResult().iName));
+    iResults.setAddresses(QList<QHostAddress>() << iAddress);
+}
+
+
+int QSymbianHostResolver::id()
+{
+    return iId;
+}
+
+QSymbianHostInfoLookupManger::QSymbianHostInfoLookupManger()
+{
+}
+
+QSymbianHostInfoLookupManger::~QSymbianHostInfoLookupManger()
+{
+    iCurrentLookups.Close();
+    iScheduledLookups.Close();
+}
+
+void QSymbianHostInfoLookupManger::clear()
+{
+    QMutexLocker locker(&mutex);
+    iCurrentLookups.ResetAndDestroy();
+    iScheduledLookups.ResetAndDestroy();
+}
+
+void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
+{
+    QMutexLocker locker(&mutex);
+
+    // remove finished lookup from array and destroy
+    TInt count = iCurrentLookups.Count();
+    for (TInt i = 0; i < count; i++) {
+        if (iCurrentLookups[i]->id() == r->id()) {
+            iCurrentLookups.Remove(i);
+            break;
+        }
+    }
+
+    runNextLookup();
+}
+
+void QSymbianHostInfoLookupManger::runNextLookup()
+{
+    // check to see if there are any scheduled lookups
+    if (iScheduledLookups.Count() > 0) {
+        // if so, move one to the current lookups and run it
+        // FIFO
+        QSymbianHostResolver* hostResolver = iScheduledLookups[0];
+        iCurrentLookups.Append(hostResolver);
+        iScheduledLookups.Remove(0);
+        hostResolver->requestHostLookup();
+    }
+}
+
+// called from QHostInfo
+void QSymbianHostInfoLookupManger::scheduleLookup(QSymbianHostResolver* r)
+{
+    QMutexLocker locker(&mutex);
+
+    // Check to see if we have space on the current lookups pool.
+    if (iCurrentLookups.Count() >= KMaxConcurrentLookups) {
+        // If no, schedule for later.
+        iScheduledLookups.Append(r);
+        return;
+    } else {
+        // If yes, add it to the current lookups.
+        iCurrentLookups.Append(r);
+
+        // ... and trigger the async call.
+        r->requestHostLookup();
+    }
+}
+
+void QSymbianHostInfoLookupManger::abortLookup(int id)
+{
+    QMutexLocker locker(&mutex);
+
+    int i = 0;
+    // Find the aborted lookup by ID.
+    // First in the current lookups.
+    for (i = 0; i < iCurrentLookups.Count(); i++) {
+        if (id = iCurrentLookups[i]->id()) {
+            QSymbianHostResolver* r = iCurrentLookups[i];
+            iCurrentLookups.Remove(i);
+            r->Cancel();
+            runNextLookup();
+            return;
+        }
+    }
+    // Then in the scheduled lookups.
+    for (i = 0; i < iScheduledLookups.Count(); i++) {
+        if (id = iScheduledLookups[i]->id()) {
+            QSymbianHostResolver* r = iScheduledLookups[i];
+            iScheduledLookups.Remove(i);
+            delete r;
+            return;
+        }
+    }
+}
+
+
+QSymbianHostInfoLookupManger* QSymbianHostInfoLookupManger::globalInstance()
+{
+    return static_cast<QSymbianHostInfoLookupManger*>
+            (QAbstractHostInfoLookupManger::globalInstance());
+}
+
 QT_END_NAMESPACE
-- 
cgit v0.12


From 13f415e7d54ef8e2aaccabfb04f29ccfde0520df Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 16 Mar 2011 18:50:02 +0000
Subject: Make tst_QEventLoop::processEventsExcludeSocket stricter

The test was only checking that the socket event is not processed when
excluded. I have added an additional test that a further call with socket
events included results in the deferred socket event being processed.
i.e. makes sure events are deferred to later and not lost.

Also fixed capabilities of the autotest, so this test case can run.

Reviewed-by: Markus Goetz
---
 tests/auto/qeventloop/qeventloop.pro     | 1 +
 tests/auto/qeventloop/tst_qeventloop.cpp | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/tests/auto/qeventloop/qeventloop.pro b/tests/auto/qeventloop/qeventloop.pro
index f6c24ae..e7489fa 100644
--- a/tests/auto/qeventloop/qeventloop.pro
+++ b/tests/auto/qeventloop/qeventloop.pro
@@ -5,3 +5,4 @@ QT += network
 
 win32:!wince*:LIBS += -luser32
 
+symbian:TARGET.CAPABILITY += NetworkServices
\ No newline at end of file
diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp
index 6860f19..aad8390 100644
--- a/tests/auto/qeventloop/tst_qeventloop.cpp
+++ b/tests/auto/qeventloop/tst_qeventloop.cpp
@@ -604,6 +604,7 @@ public slots:
         serverSocket->flush();
         QCoreApplication::processEvents(QEventLoop::ExcludeSocketNotifiers);
         testResult = dataArrived;
+        QCoreApplication::processEvents(); //check the deferred event is processed
         serverSocket->close();
         QThread::currentThread()->exit(0);
     }
@@ -620,9 +621,11 @@ public:
         if (tester->init())
             exec();
         testResult = tester->testResult;
+        dataArrived = tester->dataArrived;
         delete tester;
     }
      bool testResult;
+     bool dataArrived;
 };
 
 void tst_QEventLoop::processEventsExcludeSocket()
@@ -631,6 +634,7 @@ void tst_QEventLoop::processEventsExcludeSocket()
     thread.start();
     QVERIFY(thread.wait());
     QVERIFY(!thread.testResult);
+    QVERIFY(thread.dataArrived);
 }
 
 class TimerReceiver : public QObject
-- 
cgit v0.12


From 1adef92e1b1ba9872c9676efd701eb0fd0a3a907 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 16 Mar 2011 18:59:45 +0000
Subject: Implement QEventLoop::ExcludeSocketNotifiers for symbian socket
 engine

As the symbian socket engine is driven by an active object in the
QtNetwork dll, this needs to hook into the event dispatcher in the
QtCore dll.
The QActiveObject base class is now a private export from QtCore
The method of deferring socket events now works with any kind of
QActiveObject, and not only the QSocketActiveObject (which handles
"open C" sockets)
The base class has a new function, to check if socket events are blocked.
If so, it adds the active object to the deferred queue.
The derived class should return from it's RunL in this case, which will
be called again later. (same usage as the maybeQueueForLater function)

reactivateAndComplete function in the event dispatcher is changed to
complete the active object again with the same status code as originally.
Previously it always used KErrNone, which is not ok for QAsyncSelect as
it needs to check the error code from the asynchronous call.

Reviewed-by: Markus Goetz
Reviewed-by: mread
---
 src/corelib/kernel/qeventdispatcher_symbian.cpp | 79 +++++++++++++++----------
 src/corelib/kernel/qeventdispatcher_symbian_p.h | 13 ++--
 src/network/socket/qsymbiansocketengine.cpp     | 28 +++++----
 src/network/socket/qsymbiansocketengine_p.h     |  4 +-
 4 files changed, 77 insertions(+), 47 deletions(-)

diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index b074ab4..a95e7d5 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -134,7 +134,7 @@ private:
  * The QCompleteDeferredAOs class is a special object that runs after all others, which will
  * reactivate the objects that were previously not run.
  */
-inline QActiveObject::QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher)
+QActiveObject::QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher)
     : CActive(priority),
       m_dispatcher(dispatcher),
       m_hasAlreadyRun(false),
@@ -166,12 +166,25 @@ bool QActiveObject::maybeQueueForLater()
     }
 }
 
+bool QActiveObject::maybeDeferSocketEvent()
+{
+    Q_ASSERT(!m_hasRunAgain);
+    Q_ASSERT(m_dispatcher);
+    if (!m_dispatcher->areSocketEventsBlocked()) {
+        return false;
+    }
+    m_hasRunAgain = true;
+    m_dispatcher->addDeferredSocketActiveObject(this);
+    return true;
+}
+
 void QActiveObject::reactivateAndComplete()
 {
+    TInt error = iStatus.Int();
     iStatus = KRequestPending;
     SetActive();
     TRequestStatus *status = &iStatus;
-    QEventDispatcherSymbian::RequestComplete(status, KErrNone);
+    QEventDispatcherSymbian::RequestComplete(status, error);
 
     m_hasRunAgain = false;
     m_hasAlreadyRun = false;
@@ -634,10 +647,28 @@ void QSocketActiveObject::DoCancel()
 
 void QSocketActiveObject::RunL()
 {
+    if (maybeDeferSocketEvent())
+        return;
     if (maybeQueueForLater())
         return;
 
-    QT_TRYCATCH_LEAVING(m_dispatcher->socketFired(this));
+    QT_TRYCATCH_LEAVING(run());
+}
+
+void QSocketActiveObject::run()
+{
+    QEvent e(QEvent::SockAct);
+    m_inSocketEvent = true;
+    QCoreApplication::sendEvent(m_notifier, &e);
+    m_inSocketEvent = false;
+
+    if (m_deleteLater) {
+        delete this;
+    } else {
+        iStatus = KRequestPending;
+        SetActive();
+        m_dispatcher->reactivateSocketNotifier(m_notifier);
+    }
 }
 
 void QSocketActiveObject::deleteLater()
@@ -912,27 +943,6 @@ void QEventDispatcherSymbian::timerFired(int timerId)
     return;
 }
 
-void QEventDispatcherSymbian::socketFired(QSocketActiveObject *socketAO)
-{
-    if (m_noSocketEvents) {
-        m_deferredSocketEvents.append(socketAO);
-        return;
-    }
-
-    QEvent e(QEvent::SockAct);
-    socketAO->m_inSocketEvent = true;
-    QCoreApplication::sendEvent(socketAO->m_notifier, &e);
-    socketAO->m_inSocketEvent = false;
-
-    if (socketAO->m_deleteLater) {
-        delete socketAO;
-    } else {
-        socketAO->iStatus = KRequestPending;
-        socketAO->SetActive();
-        reactivateSocketNotifier(socketAO->m_notifier);
-    }
-}
-
 void QEventDispatcherSymbian::wakeUpWasCalled()
 {
     // The reactivation should happen in RunL, right before the call to this function.
@@ -993,6 +1003,12 @@ inline void QEventDispatcherSymbian::addDeferredActiveObject(QActiveObject *obje
 inline void QEventDispatcherSymbian::removeDeferredActiveObject(QActiveObject *object)
 {
     m_deferredActiveObjects.removeAll(object);
+    m_deferredSocketEvents.removeAll(object);
+}
+
+inline void QEventDispatcherSymbian::addDeferredSocketActiveObject(QActiveObject *object)
+{
+    m_deferredSocketEvents.append(object);
 }
 
 void QEventDispatcherSymbian::queueDeferredActiveObjectsCompletion()
@@ -1018,7 +1034,8 @@ bool QEventDispatcherSymbian::sendDeferredSocketEvents()
     bool sentAnyEvents = false;
     while (!m_deferredSocketEvents.isEmpty()) {
         sentAnyEvents = true;
-        socketFired(m_deferredSocketEvents.takeFirst());
+        QActiveObject *object = m_deferredSocketEvents.takeFirst();
+        object->reactivateAndComplete();
     }
 
     return sentAnyEvents;
@@ -1037,17 +1054,18 @@ bool QEventDispatcherSymbian::hasPendingEvents()
 
 void QEventDispatcherSymbian::registerSocketNotifier ( QSocketNotifier * notifier )
 {
-    //TODO: just need to be able to do something when event loop has sockets disabled
-/*    QSocketActiveObject *socketAO = new QSocketActiveObject(this, notifier);
+    //note - this is only for "open C" file descriptors
+    //for native sockets, an active object in the symbian socket engine handles this
+    QSocketActiveObject *socketAO = new QSocketActiveObject(this, notifier);
     Q_CHECK_PTR(socketAO);
     m_notifiers.insert(notifier, socketAO);
-    selectThread().requestSocketEvents(notifier, &socketAO->iStatus);*/
+    selectThread().requestSocketEvents(notifier, &socketAO->iStatus);
 }
 
 void QEventDispatcherSymbian::unregisterSocketNotifier ( QSocketNotifier * notifier )
 {
-    //TODO: just need to be able to do something when event loop has sockets disabled
-    /*
+    //note - this is only for "open C" file descriptors
+    //for native sockets, an active object in the symbian socket engine handles this
     if (m_selectThread)
         m_selectThread->cancelSocketEvents(notifier);
     if (m_notifiers.contains(notifier)) {
@@ -1056,7 +1074,6 @@ void QEventDispatcherSymbian::unregisterSocketNotifier ( QSocketNotifier * notif
         sockObj->deleteLater();
         m_notifiers.remove(notifier);
     }
-    */
 }
 
 void QEventDispatcherSymbian::reactivateSocketNotifier(QSocketNotifier *notifier)
diff --git a/src/corelib/kernel/qeventdispatcher_symbian_p.h b/src/corelib/kernel/qeventdispatcher_symbian_p.h
index bf28144..e07d475 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian_p.h
+++ b/src/corelib/kernel/qeventdispatcher_symbian_p.h
@@ -77,13 +77,14 @@ QT_BEGIN_NAMESPACE
 class QEventDispatcherSymbian;
 class QTimerActiveObject;
 
-class Q_AUTOTEST_EXPORT QActiveObject : public CActive
+class Q_CORE_EXPORT QActiveObject : public CActive
 {
 public:
     QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher);
     ~QActiveObject();
 
     bool maybeQueueForLater();
+    bool maybeDeferSocketEvent();
 
     void reactivateAndComplete();
 
@@ -176,6 +177,7 @@ public:
 protected:
     void DoCancel();
     void RunL();
+    void run();
 
 private:
     QSocketNotifier *m_notifier;
@@ -244,7 +246,6 @@ public:
     void closingDown();
 
     void timerFired(int timerId);
-    void socketFired(QSocketActiveObject *socketAO);
     void wakeUpWasCalled();
     void reactivateSocketNotifier(QSocketNotifier *notifier);
 
@@ -256,6 +257,9 @@ public:
 
     inline int iterationCount() const { return m_iterationCount; }
 
+    void addDeferredSocketActiveObject(QActiveObject *object);
+    inline bool areSocketEventsBlocked() const { return m_noSocketEvents; }
+
     static void RequestComplete(TRequestStatus *&status, TInt reason);
     static void RequestComplete(RThread &threadHandle, TRequestStatus *&status, TInt reason);
 
@@ -281,8 +285,9 @@ private:
     unsigned char m_iterationCount;
     bool m_insideTimerEvent;
     bool m_noSocketEvents;
-    QList<QSocketActiveObject *> m_deferredSocketEvents;
-
+    //deferred until socket events are enabled
+    QList<QActiveObject *> m_deferredSocketEvents;
+    //deferred until idle
     QList<QActiveObject *> m_deferredActiveObjects;
 
     int m_delay;
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 688f724..07b2e5a 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -63,6 +63,7 @@
 #include <QCoreApplication>
 
 #include <qabstracteventdispatcher.h>
+#include <private/qeventdispatcher_symbian_p.h>
 #include <qsocketnotifier.h>
 #include <qnetworkinterface.h>
 
@@ -187,7 +188,6 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
     TUint protocol = (socketType == QAbstractSocket::UdpSocket) ? KProtocolInetUdp : KProtocolInetTcp;
 
     //Check if there is a user specified session
-    RConnection *connection = 0;
     QVariant v(q->property("_q_networksession"));
     TInt err;
     if (v.isValid()) {
@@ -1437,7 +1437,9 @@ void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
 #endif
     d->readNotificationsEnabled = enable;
     if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        d->asyncSelect = q_check_ptr(
+            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
+                d->nativeSocket, this));
     // TODO: what do we do if event dispatcher doesn't exist yet?
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
@@ -1459,7 +1461,9 @@ void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
 #endif
     d->writeNotificationsEnabled = enable;
     if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        d->asyncSelect = q_check_ptr(
+            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
+                d->nativeSocket, this));
     // TODO: what do we do if event dispatcher doesn't exist yet?
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
@@ -1483,7 +1487,9 @@ void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 #endif
     d->exceptNotificationsEnabled = enable;
     if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        d->asyncSelect = q_check_ptr(
+            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
+                d->nativeSocket, this));
     if (d->asyncSelect)
         d->asyncSelect->IssueRequest();
 }
@@ -1597,15 +1603,17 @@ bool QSymbianSocketEngine::event(QEvent* ev)
         qDebug() << "PostThreadChangeEvent" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
 #endif
         // recreate select in new thread
-        d->asyncSelect = q_check_ptr(new QAsyncSelect(0, d->nativeSocket, this));
+        d->asyncSelect = q_check_ptr(
+            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
+                d->nativeSocket, this));
         d->asyncSelect->IssueRequest();
         return true;
     }
     return QAbstractSocketEngine::event(ev);
 }
 
-QAsyncSelect::QAsyncSelect(QAbstractEventDispatcher *dispatcher, RSocket& sock, QSymbianSocketEngine *parent)
-    : CActive(CActive::EPriorityStandard),
+QAsyncSelect::QAsyncSelect(QEventDispatcherSymbian *dispatcher, RSocket& sock, QSymbianSocketEngine *parent)
+    : QActiveObject(CActive::EPriorityStandard, dispatcher),
       m_inSocketEvent(false),
       m_deleteLater(false),
       m_socket(sock),
@@ -1652,9 +1660,9 @@ TInt QAsyncSelect::RunError(TInt aError)
 
 void QAsyncSelect::run()
 {
-    //TODO: block when event loop demands it
-    //if (maybeQueueForLater())
-    //    return;
+    //when event loop disabled socket events, defer until later
+    if (maybeDeferSocketEvent())
+        return;
     m_inSocketEvent = true;
     m_selectBuf() &= m_selectFlags; //the select ioctl reports everything, so mask to only what we requested
     //KSockSelectReadContinuation is for reading datagrams in a mode that doesn't discard when the
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index 432e4dc..bbe1269 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -151,10 +151,10 @@ class QSocketNotifier;
 class QReadNotifier;
 class QWriteNotifier;
 class QExceptionNotifier;
-class QAsyncSelect : public CActive
+class QAsyncSelect : public QActiveObject
 {
 public:
-    QAsyncSelect(QAbstractEventDispatcher *dispatcher, RSocket& sock, QSymbianSocketEngine *parent);
+    QAsyncSelect(QEventDispatcherSymbian *dispatcher, RSocket& sock, QSymbianSocketEngine *parent);
     ~QAsyncSelect();
 
     void deleteLater();
-- 
cgit v0.12


From 2e2c3aab63b066aa2321792e6adeab76d12c77d1 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 17 Mar 2011 14:55:20 +0000
Subject: tst_qudpsocket - fix capabilities

Reviewed-by: Trust Me
---
 tests/auto/qudpsocket/clientserver/clientserver.pro | 2 +-
 tests/auto/qudpsocket/qudpsocket.pro                | 2 --
 tests/auto/qudpsocket/test/test.pro                 | 2 +-
 3 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/tests/auto/qudpsocket/clientserver/clientserver.pro b/tests/auto/qudpsocket/clientserver/clientserver.pro
index 5fe65b3..6da1486 100644
--- a/tests/auto/qudpsocket/clientserver/clientserver.pro
+++ b/tests/auto/qudpsocket/clientserver/clientserver.pro
@@ -5,4 +5,4 @@ CONFIG -= app_bundle
 TARGET = clientserver
 DESTDIR = ./
 
-
+symbian: TARGET.CAPABILITY += NetworkServices
diff --git a/tests/auto/qudpsocket/qudpsocket.pro b/tests/auto/qudpsocket/qudpsocket.pro
index 8fd3545..4ddb717 100644
--- a/tests/auto/qudpsocket/qudpsocket.pro
+++ b/tests/auto/qudpsocket/qudpsocket.pro
@@ -1,6 +1,4 @@
 TEMPLATE = subdirs
 SUBDIRS = test clientserver
 
-symbian: TARGET.CAPABILITY = NetworkServices
-
 
diff --git a/tests/auto/qudpsocket/test/test.pro b/tests/auto/qudpsocket/test/test.pro
index 7e5ffe4..b68d30c 100644
--- a/tests/auto/qudpsocket/test/test.pro
+++ b/tests/auto/qudpsocket/test/test.pro
@@ -22,4 +22,4 @@ wince*|symbian: {
 
 TARGET = tst_qudpsocket
 
-
+symbian: TARGET.CAPABILITY += NetworkServices
-- 
cgit v0.12


From 690ca356c52f0e4f83f5b6cb4b54fdc6db2af5ba Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Thu, 17 Mar 2011 16:12:08 +0100
Subject: QHostInfo: Compile fix for non-Symbian

---
 src/network/kernel/qhostinfo_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index ec7a63e..72175f0 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -184,7 +184,7 @@ protected:
 };
 
 #ifndef Q_OS_SYMBIAN
-class QHostInfoLookupManager : public QAbstractInfoLookupManager
+class QHostInfoLookupManager : public QAbstractHostInfoLookupManger
 {
     Q_OBJECT
 public:
-- 
cgit v0.12


From 96e3f2358ffdeb12c141e8139cdfbc8b24a14700 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 7 Mar 2011 14:26:27 +0100
Subject: Added short time format support on Windows.

Since Windows 7 there is a new TIME_NOSECONDS flag that is supposed to be used
whenever short time format is requested.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_win.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 6b49062..239df10 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -231,7 +231,7 @@ static QString winDateToString(const QDate &date, DWORD flags)
     return QString();
 }
 
-static QString winTimeToString(const QTime &time)
+static QString winTimeToString(const QTime &time, bool longFormat)
 {
     SYSTEMTIME st;
     memset(&st, 0, sizeof(SYSTEMTIME));
@@ -241,6 +241,9 @@ static QString winTimeToString(const QTime &time)
     st.wMilliseconds = 0;
 
     DWORD flags = 0;
+    if (!longFormat && QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7)
+        flags = 2; // TIME_NOSECONDS
+
     LCID id = GetUserDefaultLCID();
 
     wchar_t buf[255];
@@ -546,12 +549,12 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         return winDateToString(in.toDate(), type == DateToStringShort ? DATE_SHORTDATE : DATE_LONGDATE);
     case TimeToStringShort:
     case TimeToStringLong:
-        return winTimeToString(in.toTime());
+        return winTimeToString(in.toTime(), type == TimeToStringLong);
     case DateTimeToStringShort:
     case DateTimeToStringLong: {
         const QDateTime dt = in.toDateTime();
         return QString(winDateToString(dt.date(), type == DateTimeToStringShort ? DATE_SHORTDATE : DATE_LONGDATE)
-            + QLatin1Char(' ') + winTimeToString(dt.time())); }
+            + QLatin1Char(' ') + winTimeToString(dt.time(), type == DateTimeToStringLong)); }
 
     case ZeroDigit:
         locale_info = LOCALE_SNATIVEDIGITS;
-- 
cgit v0.12


From 0e46754b4730b7e5e8797c41d137ba20659264a0 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 7 Mar 2011 14:25:29 +0100
Subject: Added digit substitution for date/time on Windows.

Whenever we are asked to convert a date/time object to string, we should
respect the system digit substitution rules.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_win.cpp | 59 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 52 insertions(+), 7 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 239df10..319004f 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -148,6 +148,46 @@ Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
     return QLocale(QString::fromLatin1(getWinLocaleName(id)));
 }
 
+enum SubstitutionType {
+    SContext,
+    SAlways,
+    SNever
+};
+
+static SubstitutionType substitution(LCID lcid)
+{
+    wchar_t buf[8];
+    if (!GetLocaleInfo(lcid, LOCALE_IDIGITSUBSTITUTION, buf, 8))
+        return SNever;
+    if (buf[0] == '1')
+        return SNever;
+    if (buf[0] == '0')
+        return SContext;
+    if (buf[0] == '2')
+        return SAlways;
+    wchar_t digits[11];
+    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, digits, 11))
+        return SNever;
+    const wchar_t zero = digits[0];
+    if (buf[0] == zero + 2)
+        return SAlways;
+    return SNever;
+}
+
+static QString &substituteDigits(LCID lcid, QString &string)
+{
+    wchar_t buf[11];
+    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, buf, 11))
+        return string;
+    ushort zero = (ushort)buf[0];
+    ushort *qch = (ushort *)string.data();
+    for (ushort *end = qch + string.size(); qch != end; ++qch) {
+        if (*qch >= '0' && *qch <= '9')
+            *qch = zero + (*qch - '0');
+    }
+    return string;
+}
+
 static QString winToQtFormat(const QString &sys_fmt)
 {
     QString result;
@@ -212,8 +252,6 @@ static QString winToQtFormat(const QString &sys_fmt)
     return result;
 }
 
-
-
 static QString winDateToString(const QDate &date, DWORD flags)
 {
     SYSTEMTIME st;
@@ -225,9 +263,12 @@ static QString winDateToString(const QDate &date, DWORD flags)
     LCID id = GetUserDefaultLCID();
 
     wchar_t buf[255];
-    if (GetDateFormat(id, flags, &st, 0, buf, 255))
-        return QString::fromWCharArray(buf);
-
+    if (GetDateFormat(id, flags, &st, NULL, buf, 255)) {
+        QString format = QString::fromWCharArray(buf);
+        if (substitution(id) == SAlways)
+            substituteDigits(id, format);
+        return format;
+    }
     return QString();
 }
 
@@ -247,8 +288,12 @@ static QString winTimeToString(const QTime &time, bool longFormat)
     LCID id = GetUserDefaultLCID();
 
     wchar_t buf[255];
-    if (GetTimeFormat(id, flags, &st, 0, buf, 255))
-        return QString::fromWCharArray(buf);
+    if (GetTimeFormat(id, flags, &st, NULL, buf, 255)) {
+        QString format = QString::fromWCharArray(buf);
+        if (substitution(id) == SAlways)
+            substituteDigits(id, format);
+        return format;
+    }
 
     return QString();
 }
-- 
cgit v0.12


From 0ddf35198fa789c4c1b479e09241fff850a08442 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 7 Mar 2011 14:34:58 +0100
Subject: Use digit substitution on Windows for currency formatting.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_win.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 319004f..8789e33 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -492,7 +492,10 @@ static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
                             pformat, out.data(), out.size());
     }
 
-    return QString::fromWCharArray(out.data());
+    value = QString::fromWCharArray(out.data());
+    if (substitution(lcid) == SAlways)
+        substituteDigits(lcid, value);
+    return value;
 }
 
 QStringList winUILanguages()
-- 
cgit v0.12


From bb86e77cc437b92d49692bb7026c57626d77079f Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 7 Mar 2011 17:05:08 +0100
Subject: Refactored QLocale on Windows.

Added LocaleChanged system locale enum that is queried whenever we detect that
the system locale is changed. This should make it easier to have cached values
in the system locale implementations.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp     |   4 +
 src/corelib/tools/qlocale.h       |   3 +-
 src/corelib/tools/qlocale_win.cpp | 625 +++++++++++++++++++++-----------------
 3 files changed, 358 insertions(+), 274 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 4c0b154..31cf85b 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -477,6 +477,10 @@ void QLocalePrivate::updateSystemPrivate()
     const QSystemLocale *sys_locale = systemLocale();
     if (!system_lp)
         system_lp = globalLocalePrivate();
+
+    // tell the object that the system locale has changed.
+    sys_locale->query(QSystemLocale::LocaleChanged, QVariant());
+
     *system_lp = *sys_locale->fallbackLocale().d();
 
 #if defined(Q_OS_SYMBIAN)
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 4af6e82..bd50e82 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -113,7 +113,8 @@ public:
         UILanguages, // QStringList
         StringToStandardQuotation, // QString in: QStringRef to quote
         StringToAlternateQuotation, // QString in: QStringRef to quote
-        ScriptId // uint
+        ScriptId, // uint
+        LocaleChanged // system locale changed
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 8789e33..905ecd9 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -57,127 +57,128 @@
 
 QT_BEGIN_NAMESPACE
 
+static QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT);
+static const char *winLangCodeToIsoName(int code);
+static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
+static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
+
+#ifndef QT_NO_SYSTEMLOCALE
+
 #ifndef MUI_LANGUAGE_NAME
 #define MUI_LANGUAGE_NAME 0x8
 #endif
 
-static const char *winLangCodeToIsoName(int code);
-static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
+struct QSystemLocalePrivate
+{
+    QSystemLocalePrivate();
+
+    QChar zeroDigit();
+    QChar decimalPoint();
+    QChar groupSeparator();
+    QChar negativeSign();
+    QChar positiveSign();
+    QVariant dateFormat(QLocale::FormatType);
+    QVariant timeFormat(QLocale::FormatType);
+    QVariant dateTimeFormat(QLocale::FormatType);
+    QVariant dayName(int, QLocale::FormatType);
+    QVariant monthName(int, QLocale::FormatType);
+    QVariant toString(const QDate &, QLocale::FormatType);
+    QVariant toString(const QTime &, QLocale::FormatType);
+    QVariant toString(const QDateTime &, QLocale::FormatType);
+    QVariant measurementSystem();
+    QVariant amText();
+    QVariant pmText();
+    QVariant firstDayOfWeek();
+    QVariant currencySymbol(QLocale::CurrencySymbolFormat);
+    QVariant toCurrencyString(const QSystemLocale::CurrencyToStringArgument &);
+    QVariant uiLanguages();
+
+    void update();
+
+private:
+    QByteArray langEnvVar;
+
+    // cached values:
+    LCID lcid;
+
+    QString getLocaleInfo(LCTYPE type, int maxlen = 0);
+    int getLocaleInfo_int(LCTYPE type, int maxlen = 0);
+    QChar getLocaleInfo_qchar(LCTYPE type);
+
+    enum SubstitutionType {
+        SContext,
+        SAlways,
+        SNever
+    };
+
+    SubstitutionType substitution();
+    QString &substituteDigits(QString &string);
+
+    static QString winToQtFormat(const QString &sys_fmt);
 
-static QString qt_getLocaleInfo(LCID lcid, LCTYPE type, int maxlen = 0)
+};
+Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
+
+QSystemLocalePrivate::QSystemLocalePrivate()
+{
+    langEnvVar = qgetenv("LANG");
+    lcid = GetUserDefaultLCID();
+}
+
+QString QSystemLocalePrivate::getLocaleInfo(LCTYPE type, int maxlen)
 {
     QVarLengthArray<wchar_t, 64> buf(maxlen ? maxlen : 64);
     if (!GetLocaleInfo(lcid, type, buf.data(), buf.size()))
         return QString();
+    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+        int cnt = GetLocaleInfo(lcid, type, 0, 0);
+        if (cnt == 0)
+            return QString();
+        buf.resize(cnt);
+        if (!GetLocaleInfo(lcid, type, buf.data(), buf.size()))
+            return QString();
+    }
     return QString::fromWCharArray(buf.data());
 }
-static int qt_getLocaleInfo_int(LCID lcid, LCTYPE type, int maxlen = 0)
+
+int QSystemLocalePrivate::getLocaleInfo_int(LCTYPE type, int maxlen)
 {
-    QString str = qt_getLocaleInfo(lcid, type, maxlen);
+    QString str = getLocaleInfo(type, maxlen);
     bool ok = false;
     int v = str.toInt(&ok);
     return ok ? v : 0;
 }
 
-static QString getWinLocaleInfo(LCTYPE type)
-{
-    LCID id = GetUserDefaultLCID();
-    int cnt = GetLocaleInfo(id, type, 0, 0) * 2;
-
-    if (cnt == 0) {
-        qWarning("QLocale: empty windows locale info (%d)", (int)type);
-        return QString();
-    }
-
-    QByteArray buff(cnt, 0);
-
-    cnt = GetLocaleInfo(id, type, reinterpret_cast<wchar_t*>(buff.data()), buff.size() / 2);
-
-    if (cnt == 0) {
-        qWarning("QLocale: empty windows locale info (%d)", (int)type);
-        return QString();
-    }
-
-    return QString::fromWCharArray(reinterpret_cast<const wchar_t *>(buff.data()));
-}
-
-static QByteArray envVarLocale()
+QChar QSystemLocalePrivate::getLocaleInfo_qchar(LCTYPE type)
 {
-    static QByteArray lang = qgetenv("LANG");
-    return lang;
+    QString str = getLocaleInfo(type);
+    return str.isEmpty() ? QChar() : str.at(0);
 }
 
-QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT)
-{
-    QByteArray result;
-    if (id == LOCALE_USER_DEFAULT) {
-        result = envVarLocale();
-        QString lang, script, cntry;
-        if ( result == "C" || (!result.isEmpty()
-                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
-            long id = 0;
-            bool ok = false;
-            id = qstrtoll(result.data(), 0, 0, &ok);
-            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
-                return result;
-            else
-                return winLangCodeToIsoName( (int)id );
-        }
-    }
-
-#if defined(Q_OS_WINCE)
-    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
-#else
-    if (id == LOCALE_USER_DEFAULT)
-        id = GetUserDefaultLCID();
-    QString resultuage = winIso639LangName(id);
-    QString country = winIso3116CtryName(id);
-    result = resultuage.toLatin1();
-    if (!country.isEmpty()) {
-        result += '_';
-        result += country.toLatin1();
-    }
-#endif
-
-    return result;
-}
-
-Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
-{
-    return QLocale(QString::fromLatin1(getWinLocaleName(id)));
-}
-
-enum SubstitutionType {
-    SContext,
-    SAlways,
-    SNever
-};
-
-static SubstitutionType substitution(LCID lcid)
+QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
 {
     wchar_t buf[8];
-    if (!GetLocaleInfo(lcid, LOCALE_IDIGITSUBSTITUTION, buf, 8))
-        return SNever;
+    if (!GetLocaleInfo(lcid, LOCALE_IDIGITSUBSTITUTION, buf, 8)) // ###
+        return QSystemLocalePrivate::SNever;
     if (buf[0] == '1')
-        return SNever;
+        return QSystemLocalePrivate::SNever;
     if (buf[0] == '0')
-        return SContext;
+        return QSystemLocalePrivate::SContext;
     if (buf[0] == '2')
-        return SAlways;
+        return QSystemLocalePrivate::SAlways;
     wchar_t digits[11];
     if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, digits, 11))
-        return SNever;
+        return QSystemLocalePrivate::SNever;
     const wchar_t zero = digits[0];
     if (buf[0] == zero + 2)
-        return SAlways;
-    return SNever;
+        return QSystemLocalePrivate::SAlways;
+    return QSystemLocalePrivate::SNever;
 }
 
-static QString &substituteDigits(LCID lcid, QString &string)
+QString &QSystemLocalePrivate::substituteDigits(QString &string)
 {
     wchar_t buf[11];
-    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, buf, 11))
+    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, buf, 11)) // ###
         return string;
     ushort zero = (ushort)buf[0];
     ushort *qch = (ushort *)string.data();
@@ -188,117 +189,63 @@ static QString &substituteDigits(LCID lcid, QString &string)
     return string;
 }
 
-static QString winToQtFormat(const QString &sys_fmt)
+QChar QSystemLocalePrivate::zeroDigit()
 {
-    QString result;
-    int i = 0;
-
-    while (i < sys_fmt.size()) {
-        if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
-            QString text = readEscapedFormatString(sys_fmt, &i);
-            if (text == QLatin1String("'"))
-                result += QLatin1String("''");
-            else
-                result += QString(QLatin1Char('\'') + text + QLatin1Char('\''));
-            continue;
-        }
-
-        QChar c = sys_fmt.at(i);
-        int repeat = repeatCount(sys_fmt, i);
-
-        switch (c.unicode()) {
-            // Date
-            case 'y':
-                if (repeat > 5)
-                    repeat = 5;
-                else if (repeat == 3)
-                    repeat = 2;
-                switch (repeat) {
-                    case 1:
-                        result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
-                        break;
-                    case 5:
-                        result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
-                        break;
-                    default:
-                        result += QString(repeat, QLatin1Char('y'));
-                        break;
-                }
-                break;
-            case 'g':
-                if (repeat > 2)
-                    repeat = 2;
-                switch (repeat) {
-                    case 2:
-                        break; // no equivalent of "gg" in Qt
-                    default:
-                        result += QLatin1Char('g');
-                        break;
-                }
-                break;
-            case 't':
-                if (repeat > 2)
-                    repeat = 2;
-                result += QLatin1String("AP"); // "t" unsupported, use "AP"
-                break;
-            default:
-                result += QString(repeat, c);
-                break;
-        }
+    return getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
+}
 
-        i += repeat;
-    }
+QChar QSystemLocalePrivate::decimalPoint()
+{
+    return getLocaleInfo_qchar(LOCALE_SDECIMAL);
+}
 
-    return result;
+QChar QSystemLocalePrivate::groupSeparator()
+{
+    return getLocaleInfo_qchar(LOCALE_STHOUSAND);
 }
 
-static QString winDateToString(const QDate &date, DWORD flags)
+QChar QSystemLocalePrivate::negativeSign()
 {
-    SYSTEMTIME st;
-    memset(&st, 0, sizeof(SYSTEMTIME));
-    st.wYear = date.year();
-    st.wMonth = date.month();
-    st.wDay = date.day();
+    return getLocaleInfo_qchar(LOCALE_SNEGATIVESIGN);
+}
 
-    LCID id = GetUserDefaultLCID();
+QChar QSystemLocalePrivate::positiveSign()
+{
+    return getLocaleInfo_qchar(LOCALE_SPOSITIVESIGN);
+}
 
-    wchar_t buf[255];
-    if (GetDateFormat(id, flags, &st, NULL, buf, 255)) {
-        QString format = QString::fromWCharArray(buf);
-        if (substitution(id) == SAlways)
-            substituteDigits(id, format);
-        return format;
+QVariant QSystemLocalePrivate::dateFormat(QLocale::FormatType type)
+{
+    switch (type) {
+    case QLocale::ShortFormat:
+        return winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE));
+    case QLocale::LongFormat:
+        return winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE));
+    case QLocale::NarrowFormat:
+        break;
     }
-    return QString();
+    return QVariant();
 }
 
-static QString winTimeToString(const QTime &time, bool longFormat)
+QVariant QSystemLocalePrivate::timeFormat(QLocale::FormatType type)
 {
-    SYSTEMTIME st;
-    memset(&st, 0, sizeof(SYSTEMTIME));
-    st.wHour = time.hour();
-    st.wMinute = time.minute();
-    st.wSecond = time.second();
-    st.wMilliseconds = 0;
-
-    DWORD flags = 0;
-    if (!longFormat && QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7)
-        flags = 2; // TIME_NOSECONDS
-
-    LCID id = GetUserDefaultLCID();
-
-    wchar_t buf[255];
-    if (GetTimeFormat(id, flags, &st, NULL, buf, 255)) {
-        QString format = QString::fromWCharArray(buf);
-        if (substitution(id) == SAlways)
-            substituteDigits(id, format);
-        return format;
+    switch (type) {
+    case QLocale::ShortFormat:
+        return winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT)); //###
+    case QLocale::LongFormat:
+        return winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT));
+    case QLocale::NarrowFormat:
+        break;
     }
+    return QVariant();
+}
 
-    return QString();
+QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
+{
+    return QString(dateFormat(type).toString() + QLatin1Char(' ') + timeFormat(type).toString());
 }
 
-static QString winDayName(int day, bool short_format)
+QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
 {
     static const LCTYPE short_day_map[]
         = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
@@ -312,12 +259,12 @@ static QString winDayName(int day, bool short_format)
 
     day -= 1;
 
-    LCTYPE type = short_format
+    LCTYPE lctype = (type == QLocale::ShortFormat || type == QLocale::NarrowFormat)
                     ? short_day_map[day] : long_day_map[day];
-    return getWinLocaleInfo(type);
+    return getLocaleInfo(lctype);
 }
 
-static QString winMonthName(int month, bool short_format)
+QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
 {
     static const LCTYPE short_month_map[]
         = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
@@ -335,16 +282,63 @@ static QString winMonthName(int month, bool short_format)
     if (month < 0 || month > 11)
     return QString();
 
-    LCTYPE type = short_format ? short_month_map[month] : long_month_map[month];
-    return getWinLocaleInfo(type);
+    LCTYPE lctype = (type == QLocale::ShortFormat || type == QLocale::NarrowFormat)
+            ? short_month_map[month] : long_month_map[month];
+    return getLocaleInfo(lctype);
 }
 
-static QLocale::MeasurementSystem winSystemMeasurementSystem()
+QVariant QSystemLocalePrivate::toString(const QDate &date, QLocale::FormatType type)
+{
+    SYSTEMTIME st;
+    memset(&st, 0, sizeof(SYSTEMTIME));
+    st.wYear = date.year();
+    st.wMonth = date.month();
+    st.wDay = date.day();
+
+    DWORD flags = (type == QLocale::LongFormat ? DATE_LONGDATE : DATE_SHORTDATE);
+    wchar_t buf[255];
+    if (GetDateFormat(lcid, flags, &st, NULL, buf, 255)) {
+        QString format = QString::fromWCharArray(buf);
+        if (substitution() == SAlways)
+            substituteDigits(format);
+        return format;
+    }
+    return QString();
+}
+
+QVariant QSystemLocalePrivate::toString(const QTime &time, QLocale::FormatType type)
+{
+    SYSTEMTIME st;
+    memset(&st, 0, sizeof(SYSTEMTIME));
+    st.wHour = time.hour();
+    st.wMinute = time.minute();
+    st.wSecond = time.second();
+    st.wMilliseconds = 0;
+
+    DWORD flags = 0;
+    if (type != QLocale::LongFormat && QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7)
+        flags = 2; // TIME_NOSECONDS
+
+    wchar_t buf[255];
+    if (GetTimeFormat(lcid, flags, &st, NULL, buf, 255)) {
+        QString format = QString::fromWCharArray(buf);
+        if (substitution() == SAlways)
+            substituteDigits(format);
+        return format;
+    }
+    return QString();
+}
+
+QVariant QSystemLocalePrivate::toString(const QDateTime &dt, QLocale::FormatType type)
+{
+    return QString(toString(dt.date(), type).toString() + QLatin1Char(' ') + toString(dt.time(), type).toString());
+}
+
+QVariant QSystemLocalePrivate::measurementSystem()
 {
-    LCID id = GetUserDefaultLCID();
     wchar_t output[2];
 
-    if (GetLocaleInfo(id, LOCALE_IMEASURE, output, 2)) {
+    if (GetLocaleInfo(lcid, LOCALE_IMEASURE, output, 2)) {
         QString iMeasure = QString::fromWCharArray(output);
         if (iMeasure == QLatin1String("1")) {
             return QLocale::ImperialSystem;
@@ -354,44 +348,40 @@ static QLocale::MeasurementSystem winSystemMeasurementSystem()
     return QLocale::MetricSystem;
 }
 
-static QString winSystemAMText()
+QVariant QSystemLocalePrivate::amText()
 {
-    LCID id = GetUserDefaultLCID();
     wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
 
-    if (GetLocaleInfo(id, LOCALE_S1159, output, 15)) {
+    if (GetLocaleInfo(lcid, LOCALE_S1159, output, 15)) {
         return QString::fromWCharArray(output);
     }
 
-    return QString();
+    return QVariant();
 }
 
-static QString winSystemPMText()
+QVariant QSystemLocalePrivate::pmText()
 {
-    LCID id = GetUserDefaultLCID();
     wchar_t output[15]; // maximum length including  terminating zero character for Win2003+
 
-    if (GetLocaleInfo(id, LOCALE_S2359, output, 15)) {
+    if (GetLocaleInfo(lcid, LOCALE_S2359, output, 15)) {
         return QString::fromWCharArray(output);
     }
 
-    return QString();
+    return QVariant();
 }
 
-static quint8 winSystemFirstDayOfWeek()
+QVariant QSystemLocalePrivate::firstDayOfWeek()
 {
-    LCID id = GetUserDefaultLCID();
     wchar_t output[4]; // maximum length including  terminating zero character for Win2003+
 
-    if (GetLocaleInfo(id, LOCALE_IFIRSTDAYOFWEEK, output, 4))
+    if (GetLocaleInfo(lcid, LOCALE_IFIRSTDAYOFWEEK, output, 4))
         return QString::fromWCharArray(output).toUInt()+1;
 
     return 1;
 }
 
-QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
+QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat format)
 {
-    LCID lcid = GetUserDefaultLCID();
     wchar_t buf[13];
     switch (format) {
     case QLocale::CurrencySymbol:
@@ -416,11 +406,10 @@ QString winCurrencySymbol(QLocale::CurrencySymbolFormat format)
     default:
         break;
     }
-    return QString();
+    return QVariant();
 }
 
-#ifndef QT_NO_SYSTEMLOCALE
-static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
+QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToStringArgument &arg)
 {
     QString value;
     switch (arg.value.type()) {
@@ -446,25 +435,24 @@ static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
                                                     arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
         break;
     default:
-        return QString();
+        return QVariant();
     }
 
     QVarLengthArray<wchar_t, 64> out(64);
-    LCID lcid = GetUserDefaultLCID();
 
     QString decimalSep;
     QString thousandSep;
     CURRENCYFMT format;
     CURRENCYFMT *pformat = NULL;
     if (!arg.symbol.isEmpty()) {
-        format.NumDigits = qt_getLocaleInfo_int(lcid, LOCALE_ICURRDIGITS);
-        format.LeadingZero = qt_getLocaleInfo_int(lcid, LOCALE_ILZERO);
-        decimalSep = qt_getLocaleInfo(lcid, LOCALE_SMONDECIMALSEP);
+        format.NumDigits = getLocaleInfo_int(lcid, LOCALE_ICURRDIGITS);
+        format.LeadingZero = getLocaleInfo_int(lcid, LOCALE_ILZERO);
+        decimalSep = getLocaleInfo(lcid, LOCALE_SMONDECIMALSEP);
         format.lpDecimalSep = (wchar_t *)decimalSep.utf16();
-        thousandSep = qt_getLocaleInfo(lcid, LOCALE_SMONTHOUSANDSEP);
+        thousandSep = getLocaleInfo(lcid, LOCALE_SMONTHOUSANDSEP);
         format.lpThousandSep = (wchar_t *)thousandSep.utf16();
-        format.NegativeOrder = qt_getLocaleInfo_int(lcid, LOCALE_INEGCURR);
-        format.PositiveOrder = qt_getLocaleInfo_int(lcid, LOCALE_ICURRENCY);
+        format.NegativeOrder = getLocaleInfo_int(lcid, LOCALE_INEGCURR);
+        format.PositiveOrder = getLocaleInfo_int(lcid, LOCALE_ICURRENCY);
         format.lpCurrencySymbol = (wchar_t *)arg.symbol.utf16();
 
         // grouping is complicated and ugly:
@@ -473,7 +461,7 @@ static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
         // int(30) == "123456,789.00"   == string("3;0;0")
         // int(32) == "12,34,56,789.00" == string("3;2;0")
         // int(320)== "1234,56,789.00"  == string("3;2")
-        QString groupingStr = qt_getLocaleInfo(lcid, LOCALE_SMONGROUPING);
+        QString groupingStr = getLocaleInfo(lcid, LOCALE_SMONGROUPING);
         format.Grouping = groupingStr.remove(QLatin1Char(';')).toInt();
         if (format.Grouping % 10 == 0) // magic
             format.Grouping /= 10;
@@ -493,12 +481,12 @@ static QString winFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
     }
 
     value = QString::fromWCharArray(out.data());
-    if (substitution(lcid) == SAlways)
-        substituteDigits(lcid, value);
+    if (substitution() == SAlways)
+        substituteDigits( value);
     return value;
 }
 
-QStringList winUILanguages()
+QVariant QSystemLocalePrivate::uiLanguages()
 {
     if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) {
         typedef BOOL (*GetUserPreferredUILanguagesFunc) (
@@ -543,6 +531,112 @@ QStringList winUILanguages()
     return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
 }
 
+void QSystemLocalePrivate::update()
+{
+    lcid = GetUserDefaultLCID();
+}
+
+
+static QByteArray getWinLocaleName(LCID id)
+{
+    QByteArray result;
+    if (id == LOCALE_USER_DEFAULT) {
+        static QByteArray langEnvVar = qgetenv("LANG");
+        result = langEnvVar;
+        QString lang, script, cntry;
+        if ( result == "C" || (!result.isEmpty()
+                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
+            long id = 0;
+            bool ok = false;
+            id = qstrtoll(result.data(), 0, 0, &ok);
+            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
+                return result;
+            else
+                return winLangCodeToIsoName( (int)id );
+        }
+    }
+
+#if defined(Q_OS_WINCE)
+    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
+#else
+    if (id == LOCALE_USER_DEFAULT)
+        id = GetUserDefaultLCID();
+    QString resultuage = winIso639LangName(id);
+    QString country = winIso3116CtryName(id);
+    result = resultuage.toLatin1();
+    if (!country.isEmpty()) {
+        result += '_';
+        result += country.toLatin1();
+    }
+#endif
+
+    return result;
+}
+
+QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
+{
+    QString result;
+    int i = 0;
+
+    while (i < sys_fmt.size()) {
+        if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
+            QString text = readEscapedFormatString(sys_fmt, &i);
+            if (text == QLatin1String("'"))
+                result += QLatin1String("''");
+            else
+                result += QString(QLatin1Char('\'') + text + QLatin1Char('\''));
+            continue;
+        }
+
+        QChar c = sys_fmt.at(i);
+        int repeat = repeatCount(sys_fmt, i);
+
+        switch (c.unicode()) {
+            // Date
+            case 'y':
+                if (repeat > 5)
+                    repeat = 5;
+                else if (repeat == 3)
+                    repeat = 2;
+                switch (repeat) {
+                    case 1:
+                        result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
+                        break;
+                    case 5:
+                        result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
+                        break;
+                    default:
+                        result += QString(repeat, QLatin1Char('y'));
+                        break;
+                }
+                break;
+            case 'g':
+                if (repeat > 2)
+                    repeat = 2;
+                switch (repeat) {
+                    case 2:
+                        break; // no equivalent of "gg" in Qt
+                    default:
+                        result += QLatin1Char('g');
+                        break;
+                }
+                break;
+            case 't':
+                if (repeat > 2)
+                    repeat = 2;
+                result += QLatin1String("AP"); // "t" unsupported, use "AP"
+                break;
+            default:
+                result += QString(repeat, c);
+                break;
+        }
+
+        i += repeat;
+    }
+
+    return result;
+}
+
 QLocale QSystemLocale::fallbackLocale() const
 {
     return QLocale(QString::fromLatin1(getWinLocaleName()));
@@ -550,64 +644,50 @@ QLocale QSystemLocale::fallbackLocale() const
 
 QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
 {
-    LCTYPE locale_info = 0;
-    bool format_string = false;
-
+    QSystemLocalePrivate *d = systemLocalePrivate();
     switch(type) {
-//     case Name:
-//         return getWinLocaleName();
     case DecimalPoint:
-        locale_info = LOCALE_SDECIMAL;
-        break;
+        return d->decimalPoint();
     case GroupSeparator:
-        locale_info = LOCALE_STHOUSAND;
-        break;
+        return d->groupSeparator();
     case NegativeSign:
-        locale_info = LOCALE_SNEGATIVESIGN;
-        break;
+        return d->negativeSign();
     case PositiveSign:
-        locale_info = LOCALE_SPOSITIVESIGN;
-        break;
+        return d->positiveSign();
     case DateFormatLong:
-        locale_info = LOCALE_SLONGDATE;
-        format_string = true;
-        break;
+        return d->dateFormat(QLocale::LongFormat);
     case DateFormatShort:
-        locale_info = LOCALE_SSHORTDATE;
-        format_string = true;
-        break;
+        return d->dateFormat(QLocale::ShortFormat);
     case TimeFormatLong:
+        return d->timeFormat(QLocale::LongFormat);
     case TimeFormatShort:
-        locale_info = LOCALE_STIMEFORMAT;
-        format_string = true;
-        break;
-
+        return d->timeFormat(QLocale::ShortFormat);
     case DateTimeFormatLong:
+        return d->dateTimeFormat(QLocale::LongFormat);
     case DateTimeFormatShort:
-        return QString(query(type == DateTimeFormatLong ? DateFormatLong : DateFormatShort).toString()
-            + QLatin1Char(' ') + query(type == DateTimeFormatLong ? TimeFormatLong : TimeFormatShort).toString());
+        return d->dateTimeFormat(QLocale::ShortFormat);
     case DayNameLong:
+        return d->dayName(in.toInt(), QLocale::LongFormat);
     case DayNameShort:
-        return winDayName(in.toInt(), (type == DayNameShort));
+        return d->dayName(in.toInt(), QLocale::ShortFormat);
     case MonthNameLong:
+        return d->monthName(in.toInt(), QLocale::LongFormat);
     case MonthNameShort:
-        return winMonthName(in.toInt(), (type == MonthNameShort));
+        return d->monthName(in.toInt(), QLocale::ShortFormat);
     case DateToStringShort:
+        return d->toString(in.toDate(), QLocale::ShortFormat);
     case DateToStringLong:
-        return winDateToString(in.toDate(), type == DateToStringShort ? DATE_SHORTDATE : DATE_LONGDATE);
+        return d->toString(in.toDate(), QLocale::LongFormat);
     case TimeToStringShort:
+        return d->toString(in.toTime(), QLocale::ShortFormat);
     case TimeToStringLong:
-        return winTimeToString(in.toTime(), type == TimeToStringLong);
+        return d->toString(in.toTime(), QLocale::LongFormat);
     case DateTimeToStringShort:
-    case DateTimeToStringLong: {
-        const QDateTime dt = in.toDateTime();
-        return QString(winDateToString(dt.date(), type == DateTimeToStringShort ? DATE_SHORTDATE : DATE_LONGDATE)
-            + QLatin1Char(' ') + winTimeToString(dt.time(), type == DateTimeToStringLong)); }
-
+        return d->toString(in.toDateTime(), QLocale::ShortFormat);
+    case DateTimeToStringLong:
+        return d->toString(in.toDateTime(), QLocale::LongFormat);
     case ZeroDigit:
-        locale_info = LOCALE_SNATIVEDIGITS;
-        break;
-
+        return d->zeroDigit();
     case LanguageId:
     case CountryId: {
         QString locale = QString::fromLatin1(getWinLocaleName());
@@ -623,32 +703,26 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     }
     case ScriptId:
         return QVariant(QLocale::AnyScript);
-
     case MeasurementSystem:
-        return QVariant(static_cast<int>(winSystemMeasurementSystem()));
-
+        return d->measurementSystem();
     case AMText:
-        return QVariant(winSystemAMText());
+        return d->amText();
     case PMText:
-        return QVariant(winSystemPMText());
+        return d->pmText();
     case FirstDayOfWeek:
-        return QVariant(winSystemFirstDayOfWeek());
+        return d->firstDayOfWeek();
     case CurrencySymbol:
-        return QVariant(winCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
+        return d->currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
     case CurrencyToString:
-        return QVariant(winFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>()));
+        return d->toCurrencyString(in.value<QSystemLocale::CurrencyToStringArgument>());
     case UILanguages:
-        return QVariant(winUILanguages());
+        return d->uiLanguages();
+    case LocaleChanged:
+        d->update();
+        break;
     default:
         break;
     }
-    if (locale_info) {
-        QString result = getWinLocaleInfo(locale_info);
-        if (format_string)
-            result = winToQtFormat(result);
-        if (!result.isEmpty())
-            return result;
-    }
     return QVariant();
 }
 #endif // QT_NO_SYSTEMLOCALE
@@ -810,7 +884,7 @@ static QString winIso639LangName(LCID id)
     // the language code
     QString lang_code;
     wchar_t out[256];
-    if (GetLocaleInfo(id, LOCALE_ILANGUAGE, out, 255))
+    if (GetLocaleInfo(id, LOCALE_ILANGUAGE, out, 255)) // ### shouldn't use them according to msdn
         lang_code = QString::fromWCharArray(out);
 
     if (!lang_code.isEmpty()) {
@@ -850,4 +924,9 @@ static QString winIso3116CtryName(LCID id)
     return result;
 }
 
+Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
+{
+    return QLocale(QString::fromLatin1(getWinLocaleName(id)));
+}
+
 QT_END_NAMESPACE
-- 
cgit v0.12


From 5962bd47ba62744f847872f14bfc9f0b09b4a7e6 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 9 Mar 2011 11:51:01 +0100
Subject: Narrow day name on Windows

Added narrow day name support available on Windows Vista and newer.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_win.cpp | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 905ecd9..eae23e0 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -67,6 +67,15 @@ static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
 #ifndef MUI_LANGUAGE_NAME
 #define MUI_LANGUAGE_NAME 0x8
 #endif
+#ifndef LOCALE_SSHORTESTDAYNAME1
+#  define LOCALE_SSHORTESTDAYNAME1 0x0060
+#  define LOCALE_SSHORTESTDAYNAME2 0x0061
+#  define LOCALE_SSHORTESTDAYNAME3 0x0062
+#  define LOCALE_SSHORTESTDAYNAME4 0x0063
+#  define LOCALE_SSHORTESTDAYNAME5 0x0064
+#  define LOCALE_SSHORTESTDAYNAME6 0x0065
+#  define LOCALE_SSHORTESTDAYNAME7 0x0066
+#endif
 
 struct QSystemLocalePrivate
 {
@@ -257,11 +266,19 @@ QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
             LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
             LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
 
+    static const LCTYPE narrow_day_map[]
+        = { LOCALE_SSHORTESTDAYNAME1, LOCALE_SSHORTESTDAYNAME2,
+            LOCALE_SSHORTESTDAYNAME3, LOCALE_SSHORTESTDAYNAME4,
+            LOCALE_SSHORTESTDAYNAME5, LOCALE_SSHORTESTDAYNAME6,
+            LOCALE_SSHORTESTDAYNAME7 };
+
     day -= 1;
 
-    LCTYPE lctype = (type == QLocale::ShortFormat || type == QLocale::NarrowFormat)
-                    ? short_day_map[day] : long_day_map[day];
-    return getLocaleInfo(lctype);
+    if (type == QLocale::LongFormat)
+        return getLocaleInfo(long_day_map[day]);
+    else if (type == QLocale::NarrowFormat && QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
+        return getLocaleInfo(narrow_day_map[day]);
+    return getLocaleInfo(short_day_map[day]);
 }
 
 QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
-- 
cgit v0.12


From 36c8b46571617b5ed098a111da6a34cc7092247b Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 17 Mar 2011 17:25:47 +0100
Subject: Fixed the qlocale manual test app on symbian.

Reviewed-by: trustme
---
 tests/manual/qlocale/main.cpp   | 4 ++++
 tests/manual/qlocale/window.cpp | 7 +++++--
 tests/manual/qlocale/window.h   | 2 +-
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/tests/manual/qlocale/main.cpp b/tests/manual/qlocale/main.cpp
index b14a44f..c85bd19 100644
--- a/tests/manual/qlocale/main.cpp
+++ b/tests/manual/qlocale/main.cpp
@@ -46,6 +46,10 @@ int main(int argv, char *args[])
 {
     QApplication app(argv, args);
     Window window;
+#if !defined(Q_OS_SYMBIAN)
     window.show();
+#else
+    window.showFullScreen();
+#endif
     return app.exec();
 }
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index fae88a3..89e3ec6 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -83,7 +83,8 @@ Window::Window()
     headerLayout->addWidget(localeCombo);
     headerLayout->addWidget(localeName);
 
-    QVBoxLayout *l = new QVBoxLayout(this);
+    QWidget *central = new QWidget;
+    QVBoxLayout *l = new QVBoxLayout(central);
     l->addWidget(w);
     l->addWidget(tabWidget);
 
@@ -96,6 +97,8 @@ Window::Window()
 
     localeCombo->setCurrentIndex(0);
     systemLocaleChanged();
+
+    setCentralWidget(central);
 }
 
 void Window::systemLocaleChanged()
@@ -129,5 +132,5 @@ bool Window::event(QEvent *event)
     default:
         break;
     }
-    return QWidget::event(event);
+    return QMainWindow::event(event);
 }
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
index b75d3b2..dfef895 100644
--- a/tests/manual/qlocale/window.h
+++ b/tests/manual/qlocale/window.h
@@ -50,7 +50,7 @@
 #include "numberformats.h"
 #include "miscellaneous.h"
 
-class Window : public QWidget
+class Window : public QMainWindow
 {
     Q_OBJECT
 public:
-- 
cgit v0.12


From 903a52cd764ba4ace6c4d2d3b692f5b563fb326c Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 17 Mar 2011 17:37:33 +0100
Subject: Cache some values to improve digit substitution on Windows.

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_win.cpp | 69 ++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 27 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index eae23e0..bd55abf 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -107,19 +107,22 @@ struct QSystemLocalePrivate
 private:
     QByteArray langEnvVar;
 
+    enum SubstitutionType {
+        SUnknown,
+        SContext,
+        SAlways,
+        SNever
+    };
+
     // cached values:
     LCID lcid;
+    SubstitutionType substitutionType;
+    QChar zeroDigit;
 
     QString getLocaleInfo(LCTYPE type, int maxlen = 0);
     int getLocaleInfo_int(LCTYPE type, int maxlen = 0);
     QChar getLocaleInfo_qchar(LCTYPE type);
 
-    enum SubstitutionType {
-        SContext,
-        SAlways,
-        SNever
-    };
-
     SubstitutionType substitution();
     QString &substituteDigits(QString &string);
 
@@ -129,6 +132,7 @@ private:
 Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
 
 QSystemLocalePrivate::QSystemLocalePrivate()
+    : substitutionType(SUnknown)
 {
     langEnvVar = qgetenv("LANG");
     lcid = GetUserDefaultLCID();
@@ -166,30 +170,37 @@ QChar QSystemLocalePrivate::getLocaleInfo_qchar(LCTYPE type)
 
 QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
 {
-    wchar_t buf[8];
-    if (!GetLocaleInfo(lcid, LOCALE_IDIGITSUBSTITUTION, buf, 8)) // ###
-        return QSystemLocalePrivate::SNever;
-    if (buf[0] == '1')
-        return QSystemLocalePrivate::SNever;
-    if (buf[0] == '0')
-        return QSystemLocalePrivate::SContext;
-    if (buf[0] == '2')
-        return QSystemLocalePrivate::SAlways;
-    wchar_t digits[11];
-    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, digits, 11))
-        return QSystemLocalePrivate::SNever;
-    const wchar_t zero = digits[0];
-    if (buf[0] == zero + 2)
-        return QSystemLocalePrivate::SAlways;
-    return QSystemLocalePrivate::SNever;
+    if (substitutionType == SUnknown) {
+        wchar_t buf[8];
+        if (!GetLocaleInfo(lcid, LOCALE_IDIGITSUBSTITUTION, buf, 8)) {
+            substitutionType = QSystemLocalePrivate::SNever;
+            return substitutionType;
+        }
+        if (buf[0] == '1')
+            substitutionType = QSystemLocalePrivate::SNever;
+        else if (buf[0] == '0')
+            substitutionType QSystemLocalePrivate::SContext;
+        else if (buf[0] == '2')
+            substitutionType = QSystemLocalePrivate::SAlways;
+        else {
+            wchar_t digits[11];
+            if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, digits, 11)) {
+                substitutionType = QSystemLocalePrivate::SNever;
+                return substitutionType;
+            }
+            const wchar_t zero = digits[0];
+            if (buf[0] == zero + 2)
+                substitutionType = QSystemLocalePrivate::SAlways;
+            else
+                substitutionType = QSystemLocalePrivate::SNever;
+        }
+    }
+    return substitutionType;
 }
 
 QString &QSystemLocalePrivate::substituteDigits(QString &string)
 {
-    wchar_t buf[11];
-    if (!GetLocaleInfo(lcid, LOCALE_SNATIVEDIGITS, buf, 11)) // ###
-        return string;
-    ushort zero = (ushort)buf[0];
+    ushort zero = zeroDigit();
     ushort *qch = (ushort *)string.data();
     for (ushort *end = qch + string.size(); qch != end; ++qch) {
         if (*qch >= '0' && *qch <= '9')
@@ -200,7 +211,9 @@ QString &QSystemLocalePrivate::substituteDigits(QString &string)
 
 QChar QSystemLocalePrivate::zeroDigit()
 {
-    return getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
+    if (zeroDigit.isNull())
+        zeroDigit = getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
+    return zeroDigit;
 }
 
 QChar QSystemLocalePrivate::decimalPoint()
@@ -551,6 +564,8 @@ QVariant QSystemLocalePrivate::uiLanguages()
 void QSystemLocalePrivate::update()
 {
     lcid = GetUserDefaultLCID();
+    substitutionType = SUnknown;
+    zeroDigit = QChar();
 }
 
 
-- 
cgit v0.12


From 42aa4968f6badb8940f5eee6f662ba649c7b4790 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 17 Mar 2011 18:55:01 +0100
Subject: Fixed compilation of QtOpenGL with Q_WS_QPA.

---
 src/opengl/qwindowsurface_gl.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 93e720c..f5edce8 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -405,10 +405,12 @@ QGLWindowSurface::~QGLWindowSurface()
     delete d_ptr->fbo;
     delete d_ptr;
 
+#ifndef Q_WS_QPA
     if (QGLGlobalShareWidget::cleanedUp)
         return;
 
     --(_qt_gl_share_widget()->widgetRefCount);
+#endif
 
 #ifdef QGL_USE_TEXTURE_POOL
     if (_qt_gl_share_widget()->widgetRefCount <= 0) {
@@ -474,8 +476,10 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
 
     ctx->create(qt_gl_share_context());
 
+#ifndef Q_WS_QPA
     if (widget != qt_gl_share_widget())
         ++(_qt_gl_share_widget()->widgetRefCount);
+#endif
 
 #ifndef QT_NO_EGL
     static bool checkedForNOKSwapRegion = false;
-- 
cgit v0.12


From 7b0d9bbbe766e5f2aa7408b35707592d369acb36 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 18 Mar 2011 10:08:16 +0100
Subject: Correctly set QMAKE_CFLAGS_WAYLAND and QMAKE_LIBS_WAYLAND in
 configure.

---
 configure | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index e88373e..9ea68c2 100755
--- a/configure
+++ b/configure
@@ -6190,8 +6190,8 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
         QMAKE_LIBDIR_WAYLAND=`$PKG_CONFIG --variable=libdir wayland-client 2>/dev/null`
 
         if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists xkbcommon 2>/dev/null; then
-            QMAKE_CFLAGS_WAYLAND=$QMAKE_CFLAGS_WAYLAND `$PKG_CONFIG --cflags xkbcommon 2>/dev/null`
-            QMAKE_LIBS_WAYLAND=$QMAKE_LIBS_WAYLAND `$PKG_CONFIG --libs xkbcommon 2>/dev/null`
+            QMAKE_CFLAGS_WAYLAND="$QMAKE_CFLAGS_WAYLAND `$PKG_CONFIG --cflags xkbcommon 2>/dev/null`"
+            QMAKE_LIBS_WAYLAND="$QMAKE_LIBS_WAYLAND `$PKG_CONFIG --libs xkbcommon 2>/dev/null`"
         else
             QMAKE_DEFINES_WAYLAND=QT_NO_WAYLAND_XKB
         fi
-- 
cgit v0.12


From 4234ea4479ca858d058840eec01760a387e4afb1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 18 Mar 2011 10:42:14 +0100
Subject: Lighthouse: Make it possible to compile in default platform plugin

---
 src/gui/kernel/qapplication_qpa.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp
index cb5439c..1d4400a 100644
--- a/src/gui/kernel/qapplication_qpa.cpp
+++ b/src/gui/kernel/qapplication_qpa.cpp
@@ -514,7 +514,14 @@ void qt_init(QApplicationPrivate *priv, int type)
 
     QList<QByteArray> pluginList;
     QString platformPluginPath = QLatin1String(qgetenv("QT_QPA_PLATFORM_PLUGIN_PATH"));
-    QString platformName = QLatin1String(qgetenv("QT_QPA_PLATFORM"));
+    QByteArray platformName;
+#ifdef QT_QPA_DEFAULT_PLATFORM_NAME
+    platformName = QT_QPA_DEFAULT_PLATFORM_NAME;
+#endif
+    QByteArray platformNameEnv = qgetenv("QT_QPA_PLATFORM");
+    if (!platformNameEnv.isEmpty()) {
+        platformName = platformNameEnv;
+    }
 
     // Get command line params
 
@@ -533,7 +540,7 @@ void qt_init(QApplicationPrivate *priv, int type)
                 platformPluginPath = QLatin1String(argv[i]);
         } else if (arg == "-platform") {
             if (++i < argc)
-                platformName = QLatin1String(argv[i]);
+                platformName = argv[i];
         } else if (arg == "-plugin") {
             if (++i < argc)
                 pluginList << argv[i];
@@ -554,7 +561,7 @@ void qt_init(QApplicationPrivate *priv, int type)
     }
 #endif
 
-    init_platform(platformName, platformPluginPath);
+    init_platform(QLatin1String(platformName), platformPluginPath);
     init_plugins(pluginList);
 
     QColormap::initialize();
-- 
cgit v0.12


From b35009bab4d4353aa82830f4f7f8c29700b2bd08 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 18 Mar 2011 11:21:08 +0000
Subject: Fix "wrong lookup id" warning from QAbstractSocket

Symbian host info implementation was using default constructor for
the results, which sets the id to -1, and storing the id seperately.
Changed this to use the constructor that specifies the id, and use the
id inside the results instead of storing it separately (just a change
to the accessor function)

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         |  2 --
 src/network/kernel/qhostinfo_symbian.cpp | 28 +++++++++++++++++++++++-----
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 72175f0..79fad84 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -243,8 +243,6 @@ private:
     void processAddressResults();
 
 private:
-    int iId;
-
     const QString iHostName;
 
     RSocketServ& iSocketServ;
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 2b582bd..ad5f38a 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -217,14 +217,17 @@ QString QHostInfo::localDomainName()
 
 
 QSymbianHostResolver::QSymbianHostResolver(const QString &hostName, int identifier)
-    : CActive(CActive::EPriorityStandard), iId(identifier), iHostName(hostName),
-      iSocketServ(qt_symbianGetSocketServer())
+    : CActive(CActive::EPriorityStandard), iHostName(hostName),
+      iSocketServ(qt_symbianGetSocketServer()), iResults(identifier)
 {
     CActiveScheduler::Add(this);
 }
 
 QSymbianHostResolver::~QSymbianHostResolver()
 {
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::~QSymbianHostResolver" << id();
+#endif
     Cancel();
     iHostResolver.Close();
 }
@@ -234,8 +237,8 @@ QHostInfo QSymbianHostResolver::requestHostLookup()
 {
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug("QHostInfoAgent::fromName(%s) looking up...",
-           hostName.toLatin1().constData());
+    qDebug("QSymbianHostResolver::requestHostLookup(%s) looking up... (id = %d)",
+        iHostName.toLatin1().constData(), id());
 #endif
 
     int err = iHostResolver.Open(iSocketServ, KAfInet, KProtocolInetUdp);
@@ -404,7 +407,7 @@ void QSymbianHostResolver::processAddressResults()
 
 int QSymbianHostResolver::id()
 {
-    return iId;
+    return iResults.lookupId();
 }
 
 QSymbianHostInfoLookupManger::QSymbianHostInfoLookupManger()
@@ -428,6 +431,9 @@ void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
 {
     QMutexLocker locker(&mutex);
 
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::lookupFinished" << r->id() << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+#endif
     // remove finished lookup from array and destroy
     TInt count = iCurrentLookups.Count();
     for (TInt i = 0; i < count; i++) {
@@ -442,6 +448,9 @@ void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
 
 void QSymbianHostInfoLookupManger::runNextLookup()
 {
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::runNextLookup" << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+#endif
     // check to see if there are any scheduled lookups
     if (iScheduledLookups.Count() > 0) {
         // if so, move one to the current lookups and run it
@@ -458,10 +467,16 @@ void QSymbianHostInfoLookupManger::scheduleLookup(QSymbianHostResolver* r)
 {
     QMutexLocker locker(&mutex);
 
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::scheduleLookup" << r->id() << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+#endif
     // Check to see if we have space on the current lookups pool.
     if (iCurrentLookups.Count() >= KMaxConcurrentLookups) {
         // If no, schedule for later.
         iScheduledLookups.Append(r);
+#if defined(QHOSTINFO_DEBUG)
+    qDebug(" - scheduled");
+#endif
         return;
     } else {
         // If yes, add it to the current lookups.
@@ -476,6 +491,9 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
 {
     QMutexLocker locker(&mutex);
 
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::abortLookup" << id << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+#endif
     int i = 0;
     // Find the aborted lookup by ID.
     // First in the current lookups.
-- 
cgit v0.12


From 0679abb6b4f85878cb64fce2089ba926e3b9400c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 18 Mar 2011 11:30:35 +0000
Subject: handle errors in QSymbianHostResolver::requestHostLookup

It was hanging because although the error flags were set, the callback
was not emitted and nothing was done with the return value from the
function.
Now, it sets the state to error, and self completes - so that the
completion through RunL is used as normal. Because the state is error,
the processing of name/address is skipped and the error string is not
rewritten.
Note, error being detected at this point is only common when using an
explicit network session (as RHostResolver::Open can fail if the
RConnection is in the wrong state)

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         |  5 ++-
 src/network/kernel/qhostinfo_symbian.cpp | 64 +++++++++++++++++---------------
 2 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 79fad84..909bd03 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -228,7 +228,7 @@ public:
     QSymbianHostResolver(const QString &hostName, int id);
     ~QSymbianHostResolver();
 
-    QHostInfo requestHostLookup();
+    void requestHostLookup();
     int id();
 
     QHostInfoResult resultEmitter;
@@ -258,7 +258,8 @@ private:
     enum {
         EIdle,
         EGetByName,
-        EGetByAddress
+        EGetByAddress,
+        EError
     } iState;
 };
 
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index ad5f38a..54ec33c 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -233,7 +233,7 @@ QSymbianHostResolver::~QSymbianHostResolver()
 }
 
 // Async equivalent to QHostInfoAgent::fromName()
-QHostInfo QSymbianHostResolver::requestHostLookup()
+void QSymbianHostResolver::requestHostLookup()
 {
 
 #if defined(QHOSTINFO_DEBUG)
@@ -245,45 +245,51 @@ QHostInfo QSymbianHostResolver::requestHostLookup()
     if (err) {
         // What are we doing with iResults??
         iResults.setError(QHostInfo::UnknownError);
-        iResults.setErrorString(QObject::tr("Symbian error code: %1").arg(err));
+        iResults.setErrorString(QSystemError(err, QSystemError::NativeError).toString());
 
-        iHostResolver.Close();
-        return iResults;
-    }
+    } else {
 
-    if (iAddress.setAddress(iHostName)) {
-        // Reverse lookup
+        if (iAddress.setAddress(iHostName)) {
+            // Reverse lookup
 
-        TInetAddr IpAdd;
-        IpAdd.Input(qt_QString2TPtrC(iHostName));
+            TInetAddr IpAdd;
+            IpAdd.Input(qt_QString2TPtrC(iHostName));
 
-        // Asynchronous request.
-        iHostResolver.GetByAddress(IpAdd, iNameResult, iStatus); // <---- ASYNC
-        iState = EGetByAddress;
+            // Asynchronous request.
+            iHostResolver.GetByAddress(IpAdd, iNameResult, iStatus); // <---- ASYNC
+            iState = EGetByAddress;
 
-    } else {
+        } else {
 
-        // IDN support
-        QByteArray aceHostname = QUrl::toAce(iHostName);
-        iResults.setHostName(iHostName);
-        if (aceHostname.isEmpty()) {
-            iResults.setError(QHostInfo::HostNotFound);
-            iResults.setErrorString(iHostName.isEmpty() ?
-                                   QCoreApplication::translate("QHostInfoAgent", "No host name given") :
-                                   QCoreApplication::translate("QHostInfoAgent", "Invalid hostname"));
+            // IDN support
+            QByteArray aceHostname = QUrl::toAce(iHostName);
+            iResults.setHostName(iHostName);
+            if (aceHostname.isEmpty()) {
+                iResults.setError(QHostInfo::HostNotFound);
+                iResults.setErrorString(iHostName.isEmpty() ?
+                                       QCoreApplication::translate("QHostInfoAgent", "No host name given") :
+                                       QCoreApplication::translate("QHostInfoAgent", "Invalid hostname"));
 
-            iHostResolver.Close();
-            return iResults;
-        }
+                err = KErrArgument;
+            } else {
 
-        // Asynchronous request.
-        iHostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), iNameResult, iStatus);
-        iState = EGetByName;
+                // Asynchronous request.
+                iHostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), iNameResult, iStatus);
+                iState = EGetByName;
+            }
+        }
     }
-
     SetActive();
+    if (err) {
+        iHostResolver.Close();
 
-    return iResults;
+        //self complete so that RunL can inform manager without causing recursion
+        iState = EError;
+        iStatus = KRequestPending;
+        SetActive();
+        TRequestStatus* stat = &iStatus;
+        User::RequestComplete(stat, err);
+    }
 }
 
 void QSymbianHostResolver::DoCancel()
-- 
cgit v0.12


From e29e13ff537a92f7d2afe34893d8bae8a6788bed Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 18 Mar 2011 11:45:52 +0000
Subject: Add explicit network session support for async QHostInfo

Pass the shared network session pointer into the QSymbianHostResolver
(which maintains a reference for its lifetime). This is used to open
the RHostResolver handle, in order to get a host resolver which is
associated with a particular session.
The session is obtained from the _q_networksession property of the
QAbstractSocket, as in the symbian socket engine

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo.cpp         | 10 +++++++++-
 src/network/kernel/qhostinfo_p.h         |  3 ++-
 src/network/kernel/qhostinfo_symbian.cpp | 18 +++++++++++++++---
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index 7a15a05..1ae0bbd 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -49,6 +49,7 @@
 #include <qstringlist.h>
 #include <qthread.h>
 #include <qurl.h>
+#include <private/qnetworksession_p.h>
 
 #ifdef Q_OS_UNIX
 #  include <unistd.h>
@@ -219,8 +220,15 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver,
         }
 
         // cache is not enabled or it was not in the cache, do normal lookup
+#ifndef QT_NO_BEARERMANAGEMENT
+        QSharedPointer<QNetworkSession> networkSession;
+        QVariant v(receiver->property("_q_networksession"));
+        if (v.isValid())
+            networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v);
+#endif
+
         QSymbianHostResolver *symbianResolver = 0;
-        QT_TRAP_THROWING(symbianResolver = new QSymbianHostResolver(name, id));
+        QT_TRAP_THROWING(symbianResolver = new QSymbianHostResolver(name, id, networkSession));
         QObject::connect(&symbianResolver->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
         manager->scheduleLookup(symbianResolver);
     }
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 909bd03..e3f7f19 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -225,7 +225,7 @@ private slots:
 class QSymbianHostResolver : public CActive
 {
 public:
-    QSymbianHostResolver(const QString &hostName, int id);
+    QSymbianHostResolver(const QString &hostName, int id, QSharedPointer<QNetworkSession> networkSession);
     ~QSymbianHostResolver();
 
     void requestHostLookup();
@@ -247,6 +247,7 @@ private:
 
     RSocketServ& iSocketServ;
     RHostResolver iHostResolver;
+    QSharedPointer<QNetworkSession> iNetworkSession;
 
     TRequestStatus iStatus;
 
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 54ec33c..12e59c6 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -51,6 +51,7 @@
 #include "qhostinfo_p.h"
 #include <private/qcore_symbian_p.h>
 #include <private/qsystemerror_p.h>
+#include <private/qnetworksession_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -216,9 +217,9 @@ QString QHostInfo::localDomainName()
 }
 
 
-QSymbianHostResolver::QSymbianHostResolver(const QString &hostName, int identifier)
+QSymbianHostResolver::QSymbianHostResolver(const QString &hostName, int identifier, QSharedPointer<QNetworkSession> networkSession)
     : CActive(CActive::EPriorityStandard), iHostName(hostName),
-      iSocketServ(qt_symbianGetSocketServer()), iResults(identifier)
+      iSocketServ(qt_symbianGetSocketServer()), iNetworkSession(networkSession), iResults(identifier)
 {
     CActiveScheduler::Add(this);
 }
@@ -241,7 +242,18 @@ void QSymbianHostResolver::requestHostLookup()
         iHostName.toLatin1().constData(), id());
 #endif
 
-    int err = iHostResolver.Open(iSocketServ, KAfInet, KProtocolInetUdp);
+    int err;
+    if (iNetworkSession) {
+        err = QNetworkSessionPrivate::nativeOpenHostResolver(*iNetworkSession, iHostResolver, KAfInet, KProtocolInetUdp);
+#if defined(QHOSTINFO_DEBUG)
+        qDebug("using resolver from session (err = %d)", err);
+#endif
+    } else {
+        err = iHostResolver.Open(iSocketServ, KAfInet, KProtocolInetUdp);
+#if defined(QHOSTINFO_DEBUG)
+        qDebug("using default resolver (err = %d)", err);
+#endif
+    }
     if (err) {
         // What are we doing with iResults??
         iResults.setError(QHostInfo::UnknownError);
-- 
cgit v0.12


From 105a4d6d2e7fda3bf0753e78af470b16fa9f0485 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 21 Mar 2011 09:25:23 +0100
Subject: Lighthouse: compile fix for dri2 contexts

---
 src/plugins/platforms/xcb/qdri2context.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qdri2context.cpp b/src/plugins/platforms/xcb/qdri2context.cpp
index 0079f91..dbbfa67 100644
--- a/src/plugins/platforms/xcb/qdri2context.cpp
+++ b/src/plugins/platforms/xcb/qdri2context.cpp
@@ -266,6 +266,6 @@ xcb_dri2_dri2_buffer_t * QDri2Context::backBuffer()
 
 void * QDri2Context::eglContext() const
 {
-    Q_D(QDri2Context);
+    Q_D(const QDri2Context);
     return d->eglContext;
 }
-- 
cgit v0.12


From 209201b7047c605405a83e9c104f8c81f9195feb Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Mon, 21 Mar 2011 09:26:27 +0100
Subject: replaced weekendStart and weekendEnd with weekdays function

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17088
---
 src/corelib/tools/qlocale.cpp      | 37 ++++++++++++++++---------------------
 src/corelib/tools/qlocale.h        |  6 ++----
 src/corelib/tools/qlocale.qdoc     |  3 +--
 src/corelib/tools/qlocale_p.h      |  1 +
 tests/auto/qlocale/tst_qlocale.cpp | 11 +++++++----
 5 files changed, 27 insertions(+), 31 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 3f250ec..5ac0cf0 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2097,35 +2097,30 @@ QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
 /*!
     \since 4.8
 
-    Returns the first day of the weekend according to the current locale.
+    Returns a list of days that are considered weekdays according to the current locale.
 */
-Qt::DayOfWeek QLocale::weekendStart() const
+QList<Qt::DayOfWeek> QLocale::weekdays() const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::WeekendStart, QVariant());
+        QVariant res = systemLocale()->query(QSystemLocale::Weekdays, QVariant());
         if (!res.isNull())
-            return static_cast<Qt::DayOfWeek>(res.toUInt());
+            return static_cast<QList<Qt::DayOfWeek> >(res.value<QList<Qt::DayOfWeek> >());
     }
 #endif
-    return static_cast<Qt::DayOfWeek>(d()->m_weekend_start);
-}
-
-/*!
-    \since 4.8
-
-    Returns the last day of the weekend according to the current locale.
-*/
-Qt::DayOfWeek QLocale::weekendEnd() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
-    if (d() == systemPrivate()) {
-        QVariant res = systemLocale()->query(QSystemLocale::WeekendEnd, QVariant());
-        if (!res.isNull())
-            return static_cast<Qt::DayOfWeek>(res.toUInt());
+    QList<Qt::DayOfWeek> weekdays;
+    quint16 weekendStart = d()->m_weekend_start;
+    quint16 weekendEnd = d()->m_weekend_end;
+    for(int day = Qt::Monday; day <= Qt::Sunday; day++) {
+        if(weekendEnd > weekendStart) {
+            if(day < weekendStart || day > weekendEnd)
+                weekdays << static_cast<Qt::DayOfWeek>(day);
+        } else {
+            if(day > weekendEnd && day < weekendStart)
+                weekdays << static_cast<Qt::DayOfWeek>(day);
+        }
     }
-#endif
-    return static_cast<Qt::DayOfWeek>(d()->m_weekend_end);
+    return weekdays;
 }
 
 /*!
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 4736bfc..71eec47 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -106,8 +106,7 @@ public:
         AMText, // QString
         PMText, // QString
         FirstDayOfWeek, // Qt::DayOfWeek
-        WeekendStart, // Qt::DayOfWeek
-        WeekendEnd, // Qt::DayOfWeek
+        Weekdays, // QList<Qt::DayOfWeek>
         CurrencySymbol, // QString in: CurrencyToStringArgument
         CurrencyToString, // QString in: qlonglong, qulonglong or double
         UILanguages, // QStringList
@@ -712,8 +711,7 @@ public:
     QString standaloneDayName(int, FormatType format = LongFormat) const;
 
     Qt::DayOfWeek firstDayOfWeek() const;
-    Qt::DayOfWeek weekendStart() const;
-    Qt::DayOfWeek weekendEnd() const;
+    QList<Qt::DayOfWeek> weekdays() const;
 
     QString amText() const;
     QString pmText() const;
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 253edb3..ea5ec33 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -762,8 +762,7 @@
   \value UILanguages a list of strings representing locale names that could be used for UI translation.
   \value StringToStandardQuotation a QString containing a quoted version of the string ref stored in the in variant using standard quotes.
   \value StringToAlternateQuotation a QString containing a quoted version of the string ref stored in the in variant using alternate quotes.
-  \value WeekendStart a Qt::DayOfWeek enum specifying the first day of the weekend
-  \value WeekendEnd a Qt::DayOfWeek enum specifying the last day of the weekend
+  \value Weekdays a QList<Qt::DayOfWeek> specifying the regular weekdays
 */
 
 /*!
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index ab7fde6..5326a77 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -275,5 +275,6 @@ int repeatCount(const QString &s, int i);
 QT_END_NAMESPACE
 
 Q_DECLARE_METATYPE(QStringRef)
+Q_DECLARE_METATYPE(QList<Qt::DayOfWeek>)
 
 #endif // QLOCALE_P_H
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index b6c66d5..6f4de91 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -1154,11 +1154,13 @@ void tst_QLocale::macDefaultLocale()
     QCOMPARE(locale.monthName(1), QString("January"));
     QCOMPARE(locale.monthName(12), QString("December"));
     QCOMPARE(locale.firstDayOfWeek(), Qt::Sunday);
-    QCOMPARE(locale.weekendStart(), Qt::Saturday);
-    QCOMPARE(locale.weekendEnd(), Qt::Sunday);
     QCOMPARE(locale.quoteString("string"), QString::fromUtf8("\xe2\x80\x9c" "string" "\xe2\x80\x9d"));
     QCOMPARE(locale.quoteString("string", QLocale::AlternateQuotation), QString::fromUtf8("\xe2\x80\x98" "string" "\xe2\x80\x99"));
 
+    QList<Qt::DayOfWeek> days;
+    days << Qt::Monday << Qt::Tuesday << Qt::Wednesday << Qt::Thursday << Qt::Friday;
+    QCOMPARE(locale.weekdays(), days);
+
 }
 
 #ifdef Q_OS_WIN
@@ -2233,8 +2235,9 @@ void tst_QLocale::uiLanguages()
 void tst_QLocale::weekendDays()
 {
     const QLocale c(QLocale::C);
-    QCOMPARE(c.weekendStart(), Qt::Saturday);
-    QCOMPARE(c.weekendEnd(), Qt::Sunday);
+    QList<Qt::DayOfWeek> days;
+    days << Qt::Monday << Qt::Tuesday << Qt::Wednesday << Qt::Thursday << Qt::Friday;
+    QCOMPARE(c.weekdays(), days);
 }
 
 void tst_QLocale::listPatterns()
-- 
cgit v0.12


From 792305ed03bdff6d2aa5d7bf31a139d9ae453f4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 21 Mar 2011 09:33:19 +0100
Subject: Lighthouse: Fixing broken pattern in configure script

---
 configure | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 9ea68c2..83c836c 100755
--- a/configure
+++ b/configure
@@ -6140,12 +6140,13 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
             QMAKE_INCDIR_OPENGL_ES2=`$PKG_CONFIG --variable=includedir glesv2 2>/dev/null`
             QMAKE_LIBDIR_OPENGL_ES2=`$PKG_CONFIG --variable=libdir glesv2 2>/dev/null`
             QMAKE_LIBS_OPENGL_ES2=`$PKG_CONFIG --libs glesv2 2>/dev/null`
+            QMAKE_CFLAGS_OPENGL_ES2=`$PKG_CONFIG --cflags glesv2 2>/dev/null`
             QMakeVar set QMAKE_INCDIR_OPENGL_ES2 "$QMAKE_INCDIR_OPENGL_ES2"
             QMakeVar set QMAKE_LIBDIR_OPENGL_ES2 "$QMAKE_LIBDIR_OPENGL_ES2"
             QMakeVar set QMAKE_LIBS_OPENGL_ES2 "$QMAKE_LIBS_OPENGL_ES2"
         fi
 
-        "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS -I$QMAKE_INCDIR_OPENGL_ES2 $QMAKE_LIBS_OPENGL_ES2 -L$QMAKE_LIBDIR_OPENGL_ES2
+        "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_LIBS_OPENGL_ES2 $QMAKE_CFLAGS_OPENGL_ES2
         if [ $? != "0" ]; then
             echo "The OpenGL ES 2.0 functionality test failed!"
             echo " You might need to modify the include and library search paths by editing"
@@ -6206,7 +6207,7 @@ if [ "$PLATFORM_QPA" = "yes" ]; then
         QMakeVar set QMAKE_DEFINES_WAYLAND " $QMAKE_DEFINES_WAYLAND"
     fi
 
-    if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/wayland "Wayland" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_WAYLAND -I$QMAKE_INCDIR_WAYLAND $QMAKE_LIBS_WAYLAND; then
+    if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/wayland "Wayland" $L_FLAGS $I_FLAGS $l_FLAGS $QMAKE_CFLAGS_WAYLAND $QMAKE_LIBS_WAYLAND; then
         QT_CONFIG="$QT_CONFIG wayland"
     fi
 
-- 
cgit v0.12


From a9b5cc1b3d6d5fb9569ad3bca9b5584b6415bfd6 Mon Sep 17 00:00:00 2001
From: Paul Olav Tvete <paul.tvete@nokia.com>
Date: Mon, 21 Mar 2011 10:07:49 +0100
Subject: Compile fix for QPA

---
 src/opengl/qwindowsurface_gl.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index f5edce8..cfccda5 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -426,7 +426,8 @@ QGLWindowSurface::~QGLWindowSurface()
         if (!qt_gl_share_widget()->context()->isSharing())
             qt_destroy_gl_share_widget();
     }
-#endif
+#endif // QGL_USE_TEXTURE_POOL
+#endif // Q_WS_QPA
 }
 
 void QGLWindowSurface::deleted(QObject *object)
-- 
cgit v0.12


From d8aef5788774f5450b48354fe8d436ee0f8f5417 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 21 Mar 2011 10:33:23 +0100
Subject: Lighthouse: fixup from cherry-pick

a9b5cc1b3d6d5fb9569ad3bca9b5584b6415bfd6
---
 src/opengl/qwindowsurface_gl.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index cfccda5..681ab69 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -410,7 +410,6 @@ QGLWindowSurface::~QGLWindowSurface()
         return;
 
     --(_qt_gl_share_widget()->widgetRefCount);
-#endif
 
 #ifdef QGL_USE_TEXTURE_POOL
     if (_qt_gl_share_widget()->widgetRefCount <= 0) {
-- 
cgit v0.12


From 67c6737c6702506b5b09fd84389e20ba539cc000 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 17:12:56 +0000
Subject: Fix bugs where = used instead of ==

Reviewed-by: Aaron Tunney
---
 src/network/kernel/qhostinfo_symbian.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 12e59c6..347bf67 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -101,7 +101,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
         hostResolver.GetByAddress(IpAdd, nameResult);
         if (err) {
             // TODO - Could there be other errors? Symbian docs don't say.
-            if (err = KErrNotFound) {
+            if (err == KErrNotFound) {
                 results.setError(QHostInfo::HostNotFound);
                 results.setErrorString(tr("Host not found"));
             } else {
@@ -136,7 +136,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     err = hostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), nameResult);
     if (err) {
         // TODO - Could there be other errors? Symbian docs don't say.
-        if (err = KErrNotFound) {
+        if (err == KErrNotFound) {
             results.setError(QHostInfo::HostNotFound);
             results.setErrorString(tr("Host not found"));
         } else {
@@ -358,7 +358,7 @@ void QSymbianHostResolver::processNameResults()
     TInt err = iStatus.Int();
     if (err < 0) {
         // TODO - Could there be other errors? Symbian docs don't say.
-        if (err = KErrNotFound) {
+        if (err == KErrNotFound) {
             iResults.setError(QHostInfo::HostNotFound);
             iResults.setErrorString(QObject::tr("Host not found"));
         } else {
@@ -407,7 +407,7 @@ void QSymbianHostResolver::processAddressResults()
 
     if (err < 0) {
         // TODO - Could there be other errors? Symbian docs don't say.
-        if (err = KErrNotFound) {
+        if (err == KErrNotFound) {
             iResults.setError(QHostInfo::HostNotFound);
             iResults.setErrorString(QObject::tr("Host not found"));
         } else {
@@ -516,7 +516,7 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
     // Find the aborted lookup by ID.
     // First in the current lookups.
     for (i = 0; i < iCurrentLookups.Count(); i++) {
-        if (id = iCurrentLookups[i]->id()) {
+        if (id == iCurrentLookups[i]->id()) {
             QSymbianHostResolver* r = iCurrentLookups[i];
             iCurrentLookups.Remove(i);
             r->Cancel();
@@ -526,7 +526,7 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
     }
     // Then in the scheduled lookups.
     for (i = 0; i < iScheduledLookups.Count(); i++) {
-        if (id = iScheduledLookups[i]->id()) {
+        if (id == iScheduledLookups[i]->id()) {
             QSymbianHostResolver* r = iScheduledLookups[i];
             iScheduledLookups.Remove(i);
             delete r;
-- 
cgit v0.12


From 4f19dc5b35ded10cb1ed74b91c47c1bc6a744845 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Tue, 22 Mar 2011 08:41:49 +0100
Subject: Lighthouse: Remove drm hack in pro file

---
 src/plugins/platforms/wayland/wayland.pro | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index face860..f78e4b3 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -47,11 +47,6 @@ contains(QT_CONFIG, opengles2) {
     DEFINES += QT_WAYLAND_GL_SUPPORT
 }
 
-unix:isEmpty(QMAKE_INCDIR_WAYLAND) {
-	CONFIG += link_pkgconfig
-	PKGCONFIG += libdrm
-}
-
 include (../fontdatabases/genericunix/genericunix.pri)
 
 target.path += $$[QT_INSTALL_PLUGINS]/platforms
-- 
cgit v0.12


From 0122202baae21a19aab808eab39e15551953825c Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Mon, 21 Mar 2011 17:56:16 +0100
Subject: Bugfixing QLocale::weekdays and updating manual test

Reviewed-by: Denis Dzyubenko
---
 src/corelib/tools/qlocale.cpp     | 10 +++-------
 tests/manual/qlocale/calendar.cpp | 10 ++--------
 2 files changed, 5 insertions(+), 15 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 5ac0cf0..2a5522a 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2111,14 +2111,10 @@ QList<Qt::DayOfWeek> QLocale::weekdays() const
     QList<Qt::DayOfWeek> weekdays;
     quint16 weekendStart = d()->m_weekend_start;
     quint16 weekendEnd = d()->m_weekend_end;
-    for(int day = Qt::Monday; day <= Qt::Sunday; day++) {
-        if(weekendEnd > weekendStart) {
-            if(day < weekendStart || day > weekendEnd)
+    for (int day = Qt::Monday; day <= Qt::Sunday; day++) {
+        if ((weekendEnd >= weekendStart && (day < weekendStart || day > weekendEnd)) ||
+            (weekendEnd < weekendStart && (day > weekendEnd && day < weekendStart)))
                 weekdays << static_cast<Qt::DayOfWeek>(day);
-        } else {
-            if(day > weekendEnd && day < weekendStart)
-                weekdays << static_cast<Qt::DayOfWeek>(day);
-        }
     }
     return weekdays;
 }
diff --git a/tests/manual/qlocale/calendar.cpp b/tests/manual/qlocale/calendar.cpp
index 615e44e..bd4756e 100644
--- a/tests/manual/qlocale/calendar.cpp
+++ b/tests/manual/qlocale/calendar.cpp
@@ -112,14 +112,8 @@ void CalendarWidget::maximumDateChanged(const QDate &date)
 }
 
 bool CalendarWidget::isWeekendDay(Qt::DayOfWeek day) {
-    Qt::DayOfWeek start = calendar->locale().weekendStart();
-    Qt::DayOfWeek end = calendar->locale().weekendEnd();
-
-    if (start <= day && day <= end)
-        return true;
-    if (start > end && (day >= start || day <= end))
-        return true;
-    return false;
+    QList<Qt::DayOfWeek> week = calendar->locale().weekdays();
+    return !week.contains(day);
 }
 
 void CalendarWidget::updateWeekendDays() {
-- 
cgit v0.12


From dc1f979b7d2d13efd852fd3fa41930f115a9edd1 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 22 Mar 2011 09:58:11 +0100
Subject: Fix QT_NO_NETWORKPROXY.

Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com>
---
 src/network/access/qhttpthreaddelegate.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index 81410a4..0b4459a 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -131,6 +131,8 @@ static QByteArray makeCacheKey(QUrl &url, QNetworkProxy *proxy)
             result = key.toEncoded();
         }
     }
+#else
+    Q_UNUSED(proxy)
 #endif
 
     return "http-connection:" + result;
@@ -226,11 +228,13 @@ void QHttpThreadDelegate::startRequest()
     QUrl urlCopy = httpRequest.url();
     urlCopy.setPort(urlCopy.port(ssl ? 443 : 80));
 
+#ifndef QT_NO_NETWORKPROXY
     if (transparentProxy.type() != QNetworkProxy::NoProxy)
         cacheKey = makeCacheKey(urlCopy, &transparentProxy);
     else if (cacheProxy.type() != QNetworkProxy::NoProxy)
         cacheKey = makeCacheKey(urlCopy, &cacheProxy);
     else
+#endif
         cacheKey = makeCacheKey(urlCopy, 0);
 
 
-- 
cgit v0.12


From 07b5eac8a85088a928d04b84be9cc082e4500978 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 22 Mar 2011 11:07:00 +0100
Subject: Use the new QT_QPA_DEFAULT_PLATFORM_NAME define.

---
 mkspecs/qws/macx-iphonedevice-g++/qplatformdefs.h    |  2 ++
 mkspecs/qws/macx-iphonesimulator-g++/qplatformdefs.h |  2 ++
 src/plugins/platforms/uikit/examples/qmltest/main.mm | 16 +++-------------
 3 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/mkspecs/qws/macx-iphonedevice-g++/qplatformdefs.h b/mkspecs/qws/macx-iphonedevice-g++/qplatformdefs.h
index 425fda3..0468935 100644
--- a/mkspecs/qws/macx-iphonedevice-g++/qplatformdefs.h
+++ b/mkspecs/qws/macx-iphonedevice-g++/qplatformdefs.h
@@ -94,4 +94,6 @@
 #define QT_SNPRINTF		::snprintf
 #define QT_VSNPRINTF		::vsnprintf
 
+#define QT_QPA_DEFAULT_PLATFORM_NAME "uikit"
+
 #endif // QPLATFORMDEFS_H
diff --git a/mkspecs/qws/macx-iphonesimulator-g++/qplatformdefs.h b/mkspecs/qws/macx-iphonesimulator-g++/qplatformdefs.h
index 425fda3..0468935 100644
--- a/mkspecs/qws/macx-iphonesimulator-g++/qplatformdefs.h
+++ b/mkspecs/qws/macx-iphonesimulator-g++/qplatformdefs.h
@@ -94,4 +94,6 @@
 #define QT_SNPRINTF		::snprintf
 #define QT_VSNPRINTF		::vsnprintf
 
+#define QT_QPA_DEFAULT_PLATFORM_NAME "uikit"
+
 #endif // QPLATFORMDEFS_H
diff --git a/src/plugins/platforms/uikit/examples/qmltest/main.mm b/src/plugins/platforms/uikit/examples/qmltest/main.mm
index 6fd5629..2b5f024 100644
--- a/src/plugins/platforms/uikit/examples/qmltest/main.mm
+++ b/src/plugins/platforms/uikit/examples/qmltest/main.mm
@@ -39,14 +39,6 @@
 **
 ****************************************************************************/
 
-//
-//  main.m
-//  qmltest
-//
-//  Created by Eike Troll on 18.02.11.
-//  Copyright 2011 __MyCompanyName__. All rights reserved.
-//
-
 #import <UIKit/UIKit.h>
 
 #include "qmlapplicationviewer/qmlapplicationviewer.h"
@@ -60,15 +52,13 @@ int main(int argc, char *argv[]) {
 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
-	setenv("QT_QPA_PLATFORM","uikit",1);
-
-	QApplication app(argc, argv);
+    QApplication app(argc, argv);
     QmlApplicationViewer viewer;
     viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
-	NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
+    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
     viewer.setMainQmlFile(QString::fromUtf8([[resourcePath stringByAppendingPathComponent:@"qml/main.qml"] UTF8String]));
     viewer.showMaximized();
-	int retVal = app.exec();
+    int retVal = app.exec();
     [pool release];
     return retVal;
 }
-- 
cgit v0.12


From 40fc1a3ca3b7050f317513cf69dd89a01479e098 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 18:53:42 +0000
Subject: Implement network session support for synchronous QHostInfo

Private API, QHostInfoPrivate::fromName, which is called from
QAbstractSocket when the network session property is set.

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo.cpp         | 14 ++++++++++++++
 src/network/kernel/qhostinfo_p.h         |  5 +++++
 src/network/kernel/qhostinfo_symbian.cpp | 15 +++++----------
 src/network/socket/qabstractsocket.cpp   |  9 +++++++++
 4 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index 1ae0bbd..aff55d9 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -272,6 +272,20 @@ QHostInfo QHostInfo::fromName(const QString &name)
     return hostInfo;
 }
 
+#ifndef QT_NO_BEARERMANAGEMENT
+QHostInfo QHostInfoPrivate::fromName(const QString &name, QSharedPointer<QNetworkSession> session)
+{
+#if defined QHOSTINFO_DEBUG
+    qDebug("QHostInfoPrivate::fromName(\"%s\") with session %p",name.toLatin1().constData(), session.data());
+#endif
+
+    QHostInfo hostInfo = QHostInfoAgent::fromName(name, session);
+    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    manager->cache.put(name, hostInfo);
+    return hostInfo;
+}
+#endif
+
 /*!
     \enum QHostInfo::HostInfoError
 
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index e3f7f19..a40104a 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -70,6 +70,7 @@
 #include <QCache>
 
 #include <QNetworkSession>
+#include <QSharedPointer>
 
 #ifdef Q_OS_SYMBIAN
 // Symbian Headers
@@ -117,6 +118,10 @@ public:
           lookupId(0)
     {
     }
+#ifndef QT_NO_BEARERMANAGEMENT
+    //not a public API yet
+    static QHostInfo fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession);
+#endif
 
     QHostInfo::HostInfoError err;
     QString errorStr;
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 347bf67..65c3d62 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -66,16 +66,11 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     RHostResolver hostResolver;
 
 
-    // TODO - check if networkSession is null
-    // RConnection connection = magicalApi(networkSession);
-    // int err = connection.Open(blah, blah);
-    // if (err) {
-    //          do something;
-    // }
-
-    // Will return both IPv4 and IPv6
-    // TODO: Pass RHostResolver.Open() the global RConnection
-    int err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
+    int err;
+    if (networkSession)
+        err = QNetworkSessionPrivate::nativeOpenHostResolver(*networkSession, hostResolver, KAfInet, KProtocolInetUdp);
+    else
+        err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
     if (err) {
         results.setError(QHostInfo::UnknownError);
         results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 020de42..801556e 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -367,6 +367,7 @@
 #include "qabstractsocket_p.h"
 
 #include "private/qhostinfo_p.h"
+#include "private/qnetworksession_p.h"
 
 #include <qabstracteventdispatcher.h>
 #include <qhostaddress.h>
@@ -1786,6 +1787,14 @@ bool QAbstractSocket::waitForConnected(int msecs)
 #endif
         QHostInfo::abortHostLookup(d->hostLookupId);
         d->hostLookupId = -1;
+#ifndef QT_NO_BEARERMANAGEMENT
+        QSharedPointer<QNetworkSession> networkSession;
+        QVariant v(property("_q_networksession"));
+        if (v.isValid()) {
+            networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v);
+            d->_q_startConnecting(QHostInfoPrivate::fromName(d->hostName, networkSession));
+        } else
+#endif
         d->_q_startConnecting(QHostInfo::fromName(d->hostName));
     }
     if (state() == UnconnectedState)
-- 
cgit v0.12


From c9edb126e6f01e54dfbb1e952b253b2490d26e88 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 18:56:13 +0000
Subject: Fix SetActive being called twice

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 65c3d62..ca76b12 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -292,8 +292,6 @@ void QSymbianHostResolver::requestHostLookup()
 
         //self complete so that RunL can inform manager without causing recursion
         iState = EError;
-        iStatus = KRequestPending;
-        SetActive();
         TRequestStatus* stat = &iStatus;
         User::RequestComplete(stat, err);
     }
-- 
cgit v0.12


From 919e282ff62171654dd60875fe1c058f36a14584 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 18:57:16 +0000
Subject: Fix a deadlock in symbian QHostInfo when aborting

DoCancel was calling lookupFinished, which tries to acquire a mutex again
that was already acquired in abortLookup (causing a deadlock).
This call is un-necessary, as Cancel was only called from the destructor
and from abortLookup - in neither case is this wanted.

The run and RunError functions explicitly call lookupFinished.

This fixes hang in autotests when attempting to lookup a bad host name.

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index ca76b12..c969748 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -299,8 +299,6 @@ void QSymbianHostResolver::requestHostLookup()
 
 void QSymbianHostResolver::DoCancel()
 {
-    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
-    manager->lookupFinished(this);
     iHostResolver.Cancel();
 }
 
@@ -512,7 +510,7 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
         if (id == iCurrentLookups[i]->id()) {
             QSymbianHostResolver* r = iCurrentLookups[i];
             iCurrentLookups.Remove(i);
-            r->Cancel();
+            delete r; //cancels via destructor
             runNextLookup();
             return;
         }
-- 
cgit v0.12


From 32a43ac64aee529c55af77edbbe34c54cb8f5e52 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 19:03:56 +0000
Subject: Report correct error from QSymbianSocketEngine::nativeSelect

Sometimes the error is in the return code from the ioctl, other times
it is in the select last error getopt. Treat both error sources the
same way and call setError. Return code has higher priority.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 07b2e5a..58e8d9f 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1137,14 +1137,14 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
 #ifdef QNATIVESOCKETENGINE_DEBUG
     qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select status" << selectStat.Int() << (int)selectFlags();
 #endif
-    if (selectStat != KErrNone)
-        return selectStat.Int();
-    if (selectFlags() & KSockSelectExcept) {
-        TInt err;
+    TInt err = selectStat.Int();
+    if (!err && (selectFlags() & KSockSelectExcept)) {
         nativeSocket.GetOpt(KSOSelectLastError, KSOLSocket, err);
 #ifdef QNATIVESOCKETENGINE_DEBUG
         qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select last error" <<  err;
 #endif
+    }
+    if (err) {
         //TODO: avoidable cast?
         //set the error here, because read won't always return the same error again as select.
         const_cast<QSymbianSocketEnginePrivate*>(this)->setError(err);
-- 
cgit v0.12


From 3441c288be67c79c960e8386668731e55db60f0c Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Tue, 22 Mar 2011 10:54:46 +0100
Subject: SSL: send SNI extension only if not connecting to an IP

otherwise the host name and the name we send in the SNI header (the IP)
would not match.

Reviewed-by: Thiago Macieira
Reviewed-by: Richard J. Moore
Task-number: QTBUG-18258
---
 src/network/ssl/qsslsocket_openssl.cpp   | 3 ++-
 tests/auto/qsslsocket/tst_qsslsocket.cpp | 6 ++++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index c1b1712..d6967fe 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -418,7 +418,8 @@ init_context:
         if (tlsHostName.isEmpty())
             tlsHostName = hostName;
         QByteArray ace = QUrl::toAce(tlsHostName);
-        if (!ace.isEmpty()) {
+        // only send the SNI header if the URL is valid and not an IP
+        if (!ace.isEmpty() && !QHostAddress().setAddress(tlsHostName)) {
             if (!q_SSL_ctrl(ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, ace.constData()))
                 qWarning("could not set SSL_CTRL_SET_TLSEXT_HOSTNAME, Server Name Indication disabled");
         }
diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index ef5833ef..472be69 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -918,13 +918,15 @@ void tst_QSslSocket::protocolServerSide_data()
     QTest::newRow("ssl3-tls1") << QSsl::SslV3 << QSsl::TlsV1 << false;
     QTest::newRow("ssl3-tls1ssl3") << QSsl::SslV3 << QSsl::TlsV1SslV3 << true;
     QTest::newRow("ssl3-secure") << QSsl::SslV3 << QSsl::SecureProtocols << true;
-    QTest::newRow("ssl3-any") << QSsl::SslV3 << QSsl::AnyProtocol << true;
+    QTest::newRow("ssl3-any") << QSsl::SslV3 << QSsl::AnyProtocol << false; // we wont set a SNI header here because we connect to a
+                                                                            // numerical IP, so OpenSSL will send a SSL 2 handshake
 
     QTest::newRow("tls1-ssl2") << QSsl::TlsV1 << QSsl::SslV2 << false;
     QTest::newRow("tls1-ssl3") << QSsl::TlsV1 << QSsl::SslV3 << false;
     QTest::newRow("tls1-tls1ssl3") << QSsl::TlsV1 << QSsl::TlsV1SslV3 << true;
     QTest::newRow("tls1-secure") << QSsl::TlsV1 << QSsl::SecureProtocols << true;
-    QTest::newRow("tls1-any") << QSsl::TlsV1 << QSsl::AnyProtocol << true;
+    QTest::newRow("tls1-any") << QSsl::TlsV1 << QSsl::AnyProtocol << false; // we wont set a SNI header here because we connect to a
+                                                                            // numerical IP, so OpenSSL will send a SSL 2 handshake
 
     QTest::newRow("tls1ssl3-ssl2") << QSsl::TlsV1SslV3 << QSsl::SslV2 << false;
     QTest::newRow("tls1ssl3-ssl3") << QSsl::TlsV1SslV3 << QSsl::SslV3 << true;
-- 
cgit v0.12


From 3c94f70a2e2c8e9f6a6cfc952837f18568c9bc4c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 21 Mar 2011 20:07:32 +0000
Subject: Fix crashing debug message

When testing the socks5 socket engine, it closes the socket from
within _q_controlSocketError. Frequently a data abort occurs after this
when printing the debug message.
Moved the debug message before emitting the signal to avoid this.

Reviewed-by: Markus Goetz
---
 src/network/socket/qabstractsocket.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 801556e..9c96e1c 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -752,11 +752,11 @@ bool QAbstractSocketPrivate::flush()
     if (written < 0) {
         socketError = socketEngine->error();
         q->setErrorString(socketEngine->errorString());
-        emit q->error(socketError);
-        // an unexpected error so close the socket.
 #if defined (QABSTRACTSOCKET_DEBUG)
         qDebug() << "QAbstractSocketPrivate::flush() write error, aborting." << socketEngine->errorString();
 #endif
+        emit q->error(socketError);
+        // an unexpected error so close the socket.
         q->abort();
         return false;
     }
-- 
cgit v0.12


From 9f6eb99448d3ee8cbdd1c5b41903176759b1664f Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 22 Mar 2011 11:45:05 +0100
Subject: We need the xml libs for QML also for the simulator.

---
 .../uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj      | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
index fc4f1df..84f0d3a 100755
--- a/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
@@ -10,6 +10,8 @@
 		1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
 		288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
+		D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659431338B21000760B02 /* libQtXml_debug.a */; };
+		D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */; };
 		D3CAA7C813264AAD008BB877 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7C713264AAD008BB877 /* main.mm */; };
 		D3CAA7E613264EA6008BB877 /* moc_qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */; };
 		D3CAA7E713264EA6008BB877 /* qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */; };
@@ -50,6 +52,8 @@
 		288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
 		32CA4F630368D1EE00C91783 /* qmltest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qmltest_Prefix.pch; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* qmltest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "qmltest-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+		D31659431338B21000760B02 /* libQtXml_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXml_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXml_debug.a"; sourceTree = SOURCE_ROOT; };
+		D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXmlPatterns_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXmlPatterns_debug.a"; sourceTree = SOURCE_ROOT; };
 		D3CAA7C713264AAD008BB877 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
 		D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = moc_qmlapplicationviewer.cpp; path = qmlapplicationviewer/moc_qmlapplicationviewer.cpp; sourceTree = "<group>"; };
 		D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qmlapplicationviewer.cpp; path = qmlapplicationviewer/qmlapplicationviewer.cpp; sourceTree = "<group>"; };
@@ -92,6 +96,8 @@
 				D3CAA81F13265056008BB877 /* libQtSql_debug.a in Frameworks */,
 				D3CAA8211326507D008BB877 /* libquikit_debug.a in Frameworks */,
 				D3CAA82813265220008BB877 /* libQtNetwork_debug.a in Frameworks */,
+				D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */,
+				D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -207,6 +213,8 @@
 				D3CAA82713265220008BB877 /* libQtNetwork_debug.a */,
 				D3CAA81913265056008BB877 /* libQtScript_debug.a */,
 				D3CAA81A13265056008BB877 /* libQtSql_debug.a */,
+				D31659431338B21000760B02 /* libQtXml_debug.a */,
+				D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */,
 			);
 			name = Simulator;
 			sourceTree = "<group>";
-- 
cgit v0.12


From 747d43b89c9230d12a81e77e390f4f422f5255db Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 22 Mar 2011 12:17:05 +0100
Subject: QHostInfo: Fix compilation with non-symbian

Reviewed-by: Shane Kearns
---
 src/network/kernel/qhostinfo.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index aff55d9..3413c9b 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -286,6 +286,15 @@ QHostInfo QHostInfoPrivate::fromName(const QString &name, QSharedPointer<QNetwor
 }
 #endif
 
+#ifndef Q_OS_SYMBIAN
+// This function has a special implementation for symbian right now in qhostinfo_symbian.cpp but not on other OS.
+QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession)
+{
+    return QHostInfoAgent::fromName(hostName);
+}
+#endif
+
+
 /*!
     \enum QHostInfo::HostInfoError
 
-- 
cgit v0.12


From 82a1b2570fee1174e3198b06c992c9593103a1db Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 22 Mar 2011 14:24:12 +0100
Subject: QLocale: Compile fix for windows

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_win.cpp | 87 +++++++++++++++++++--------------------
 1 file changed, 43 insertions(+), 44 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index bd55abf..b1b1962 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -117,7 +117,7 @@ private:
     // cached values:
     LCID lcid;
     SubstitutionType substitutionType;
-    QChar zeroDigit;
+    QChar zero;
 
     QString getLocaleInfo(LCTYPE type, int maxlen = 0);
     int getLocaleInfo_int(LCTYPE type, int maxlen = 0);
@@ -179,7 +179,7 @@ QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
         if (buf[0] == '1')
             substitutionType = QSystemLocalePrivate::SNever;
         else if (buf[0] == '0')
-            substitutionType QSystemLocalePrivate::SContext;
+            substitutionType = QSystemLocalePrivate::SContext;
         else if (buf[0] == '2')
             substitutionType = QSystemLocalePrivate::SAlways;
         else {
@@ -200,7 +200,7 @@ QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
 
 QString &QSystemLocalePrivate::substituteDigits(QString &string)
 {
-    ushort zero = zeroDigit();
+    ushort zero = zeroDigit().unicode();
     ushort *qch = (ushort *)string.data();
     for (ushort *end = qch + string.size(); qch != end; ++qch) {
         if (*qch >= '0' && *qch <= '9')
@@ -211,9 +211,9 @@ QString &QSystemLocalePrivate::substituteDigits(QString &string)
 
 QChar QSystemLocalePrivate::zeroDigit()
 {
-    if (zeroDigit.isNull())
-        zeroDigit = getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
-    return zeroDigit;
+    if (zero.isNull())
+        zero = getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
+    return zero;
 }
 
 QChar QSystemLocalePrivate::decimalPoint()
@@ -565,44 +565,7 @@ void QSystemLocalePrivate::update()
 {
     lcid = GetUserDefaultLCID();
     substitutionType = SUnknown;
-    zeroDigit = QChar();
-}
-
-
-static QByteArray getWinLocaleName(LCID id)
-{
-    QByteArray result;
-    if (id == LOCALE_USER_DEFAULT) {
-        static QByteArray langEnvVar = qgetenv("LANG");
-        result = langEnvVar;
-        QString lang, script, cntry;
-        if ( result == "C" || (!result.isEmpty()
-                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
-            long id = 0;
-            bool ok = false;
-            id = qstrtoll(result.data(), 0, 0, &ok);
-            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
-                return result;
-            else
-                return winLangCodeToIsoName( (int)id );
-        }
-    }
-
-#if defined(Q_OS_WINCE)
-    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
-#else
-    if (id == LOCALE_USER_DEFAULT)
-        id = GetUserDefaultLCID();
-    QString resultuage = winIso639LangName(id);
-    QString country = winIso3116CtryName(id);
-    result = resultuage.toLatin1();
-    if (!country.isEmpty()) {
-        result += '_';
-        result += country.toLatin1();
-    }
-#endif
-
-    return result;
+    zero = QChar();
 }
 
 QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
@@ -956,6 +919,42 @@ static QString winIso3116CtryName(LCID id)
     return result;
 }
 
+static QByteArray getWinLocaleName(LCID id)
+{
+    QByteArray result;
+    if (id == LOCALE_USER_DEFAULT) {
+        static QByteArray langEnvVar = qgetenv("LANG");
+        result = langEnvVar;
+        QString lang, script, cntry;
+        if ( result == "C" || (!result.isEmpty()
+                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
+            long id = 0;
+            bool ok = false;
+            id = qstrtoll(result.data(), 0, 0, &ok);
+            if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
+                return result;
+            else
+                return winLangCodeToIsoName( (int)id );
+        }
+    }
+
+#if defined(Q_OS_WINCE)
+    result = winLangCodeToIsoName(id != LOCALE_USER_DEFAULT ? id : GetUserDefaultLCID());
+#else
+    if (id == LOCALE_USER_DEFAULT)
+        id = GetUserDefaultLCID();
+    QString resultuage = winIso639LangName(id);
+    QString country = winIso3116CtryName(id);
+    result = resultuage.toLatin1();
+    if (!country.isEmpty()) {
+        result += '_';
+        result += country.toLatin1();
+    }
+#endif
+
+    return result;
+}
+
 Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
 {
     return QLocale(QString::fromLatin1(getWinLocaleName(id)));
-- 
cgit v0.12


From e3df83e8735124dbd15107b0c083d75d99b98ea9 Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Tue, 22 Mar 2011 14:54:33 +0100
Subject: QNAM HTTP: Fix bug with explicitly zero-length compressed responses.

In the case of a response with e.g content-encoding "gzip" and
content-length "0", the HTTP backend would incorrectly fall back to
the "unspecified length" code path and wait for readyRead() forever.

Task-number: QTBUG-18232
Reviewed-by: Markus Goetz
---
 src/network/access/qhttpnetworkreply.cpp       |  8 +++++++-
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 21 +++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp
index 704cf3a..cb6c09f 100644
--- a/src/network/access/qhttpnetworkreply.cpp
+++ b/src/network/access/qhttpnetworkreply.cpp
@@ -886,8 +886,14 @@ bool QHttpNetworkReplyPrivate::expectContent()
         return false;
     if (request.operation() == QHttpNetworkRequest::Head)
         return !shouldEmitSignals();
-    if (contentLength() == 0)
+    qint64 expectedContentLength = contentLength();
+    if (expectedContentLength == 0)
         return false;
+    if (expectedContentLength == -1 && bodyLength == 0) {
+        // The content-length header was stripped, but its value was 0.
+        // This would be the case for an explicitly zero-length compressed response.
+        return false;
+    }
     return true;
 }
 
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 2c79951..48b3ecc 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -337,6 +337,8 @@ private Q_SLOTS:
 
     void qtbug15311doubleContentLength();
 
+    void qtbug18232gzipContentLengthZero();
+
     void synchronousRequest_data();
     void synchronousRequest();
 #ifndef QT_NO_OPENSSL
@@ -5532,6 +5534,25 @@ void tst_QNetworkReply::qtbug15311doubleContentLength()
     QCOMPARE(reply->readAll(), QByteArray("ABC"));
 }
 
+void tst_QNetworkReply::qtbug18232gzipContentLengthZero()
+{
+    QByteArray response("HTTP/1.0 200 OK\r\nContent-Encoding: gzip\r\nContent-Length: 0\r\n\r\n");
+    MiniHttpServer server(response);
+    server.doClose = true;
+
+    QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
+    QNetworkReplyPtr reply = manager.get(request);
+
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+    QVERIFY(reply->isFinished());
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+    QCOMPARE(reply->size(), qint64(0));
+    QCOMPARE(reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(), qint64(0));
+    QCOMPARE(reply->readAll(), QByteArray());
+}
+
 void tst_QNetworkReply::synchronousRequest_data()
 {
     QTest::addColumn<QUrl>("url");
-- 
cgit v0.12


From 3f4dca824126a2d5e7d31e122a16118b79ef78d8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 11:55:15 +0000
Subject: Fixes to QSystemError

1. KErrNotReady message changed to have one file and one network example
2. Format error for the generic error code was generating a QWARN

Reviewed-by: Markus Goetz
---
 src/corelib/kernel/qsystemerror.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp
index 953ed95..5cf8fc6 100644
--- a/src/corelib/kernel/qsystemerror.cpp
+++ b/src/corelib/kernel/qsystemerror.cpp
@@ -154,7 +154,7 @@ static QString symbianErrorString(int errorCode)
     case KErrInUse:
         return QLatin1String("in use");
     case KErrNotReady:
-        return QLatin1String("not ready (e.g. FS dismounted, no memory card)");
+        return QLatin1String("not ready (e.g. FS dismounted, network down)");
     case KErrCorrupt:
         return QLatin1String("corrupt");
     case KErrAccessDenied:
@@ -190,7 +190,7 @@ static QString symbianErrorString(int errorCode)
     case KErrPermissionDenied:
         return QLatin1String("permission denied");
     default:
-        return QString(QLatin1String("symbian error %d")).arg(errorCode);
+        return QString(QLatin1String("symbian error %1")).arg(errorCode);
     }    
 }
 #endif
-- 
cgit v0.12


From 8ad504b31a53ea2a7993f5217c68d0c4aa203b2d Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Fri, 4 Dec 2009 17:07:49 +0100
Subject: network API: add support for HTTP multipart messages

This commit adds two new classes, QHttpPart and QHttpMultiPart, and
two new overloads to QNetworkAccessManager:
post(const QNetworkRequest &request, QHttpMultiPart *multiPart) and
put(const QNetworkRequest &request, QHttpMultiPart *multiPart).

With those classes, it is possible to do a HTTP POST with a multipart
message in a memory-saving way: The data from the parts is not copied
when read from a file or another QIODevice.

Reviewed-by: Markus Goetz
Task-number: QTBUG-6222
---
 .../code/src_network_access_qhttpmultipart.cpp     |  67 +++
 .../snippets/code/src_network_access_qhttppart.cpp |  65 +++
 src/network/access/access.pri                      |   7 +-
 src/network/access/qhttpmultipart.cpp              | 548 +++++++++++++++++++++
 src/network/access/qhttpmultipart.h                | 119 +++++
 src/network/access/qhttpmultipart_p.h              | 182 +++++++
 src/network/access/qnetworkaccessmanager.cpp       |  93 +++-
 src/network/access/qnetworkaccessmanager.h         |   3 +
 src/network/access/qnetworkaccessmanager_p.h       |   2 +
 src/network/access/qnetworkrequest.cpp             |   9 +
 src/network/access/qnetworkrequest.h               |   3 +-
 src/network/access/qnetworkrequest_p.h             |   3 +-
 tests/auto/qnetworkreply/image1.jpg                | Bin 0 -> 1045459 bytes
 tests/auto/qnetworkreply/image2.jpg                | Bin 0 -> 879218 bytes
 tests/auto/qnetworkreply/image3.jpg                | Bin 0 -> 887729 bytes
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp     | 343 +++++++++++++
 16 files changed, 1439 insertions(+), 5 deletions(-)
 create mode 100644 doc/src/snippets/code/src_network_access_qhttpmultipart.cpp
 create mode 100644 doc/src/snippets/code/src_network_access_qhttppart.cpp
 create mode 100644 src/network/access/qhttpmultipart.cpp
 create mode 100644 src/network/access/qhttpmultipart.h
 create mode 100644 src/network/access/qhttpmultipart_p.h
 create mode 100644 tests/auto/qnetworkreply/image1.jpg
 create mode 100644 tests/auto/qnetworkreply/image2.jpg
 create mode 100644 tests/auto/qnetworkreply/image3.jpg

diff --git a/doc/src/snippets/code/src_network_access_qhttpmultipart.cpp b/doc/src/snippets/code/src_network_access_qhttpmultipart.cpp
new file mode 100644
index 0000000..9ad2222
--- /dev/null
+++ b/doc/src/snippets/code/src_network_access_qhttpmultipart.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
+
+QHttpPart textPart;
+textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
+textPart.setBody("my text");
+
+QHttpPart imagePart;
+imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\""));
+QFile *file = new QFile("image.jpg");
+file->open(QIODevice::ReadOnly);
+imagePart.setBodyDevice(file);
+file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
+
+multiPart->append(textPart);
+multiPart->append(imagePart);
+
+QUrl url("http://my.server.tld");
+QNetworkRequest request(url);
+
+QNetworkAccessManager manager;
+QNetworkReply *reply = manager.post(request, multiPart);
+multiPart->setParent(reply); // delete the multiPart with the reply
+// here connect signals etc.
+//! [0]
diff --git a/doc/src/snippets/code/src_network_access_qhttppart.cpp b/doc/src/snippets/code/src_network_access_qhttppart.cpp
new file mode 100644
index 0000000..0e2dbea
--- /dev/null
+++ b/doc/src/snippets/code/src_network_access_qhttppart.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+Content-Type: text/plain
+Content-Disposition: form-data; name="text"
+
+here goes the body
+//! [0]
+
+//! [1]
+QHttpPart textPart;
+textPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
+textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
+textPart.setBody("here goes the body");
+//! [1]
+
+//! [2]
+QHttpPart imagePart;
+imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\""));
+imagePart.setRawHeader("Content-ID", "my@content.id"); // add any headers you like via setRawHeader()
+QFile *file = new QFile("image.jpg");
+file->open(QIODevice::ReadOnly);
+imagePart.setBodyDevice(file);
+//! [2]
+
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index 57a79b3..5ead3ad 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -34,7 +34,9 @@ HEADERS += \
     access/qabstractnetworkcache.h \
     access/qnetworkdiskcache_p.h \
     access/qnetworkdiskcache.h \
-    access/qhttpthreaddelegate_p.h
+    access/qhttpthreaddelegate_p.h \
+    access/qhttpmultipart.h \
+    access/qhttpmultipart_p.h
 
 SOURCES += \
     access/qftp.cpp \
@@ -62,6 +64,7 @@ SOURCES += \
     access/qnetworkreplyfileimpl.cpp \
     access/qabstractnetworkcache.cpp \
     access/qnetworkdiskcache.cpp \
-    access/qhttpthreaddelegate.cpp
+    access/qhttpthreaddelegate.cpp \
+    access/qhttpmultipart.cpp
 
 include($$PWD/../../3rdparty/zlib_dependency.pri)
diff --git a/src/network/access/qhttpmultipart.cpp b/src/network/access/qhttpmultipart.cpp
new file mode 100644
index 0000000..d329d5c
--- /dev/null
+++ b/src/network/access/qhttpmultipart.cpp
@@ -0,0 +1,548 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qhttpmultipart.h"
+#include "qhttpmultipart_p.h"
+#include "QtCore/qdatetime.h" // for initializing the random number generator with QTime
+#include "QtCore/qmutex.h"
+#include "QtCore/qthreadstorage.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    \class QHttpPart
+    \brief The QHttpPart class holds a body part to be used inside a
+           HTTP multipart MIME message.
+    \since 4.8
+
+    \ingroup network
+    \inmodule QtNetwork
+
+    The QHttpPart class holds a body part to be used inside a HTTP
+    multipart MIME message (which is represented by the QHttpMultiPart class).
+    A QHttpPart consists of a header block
+    and a data block, which are separated by each other by two
+    consecutive new lines. An example for one part would be:
+
+    \snippet doc/src/snippets/code/src_network_access_qhttppart.cpp 0
+
+    For setting headers, use setHeader() and setRawHeader(), which behave
+    exactly like QNetworkRequest::setHeader() and QNetworkRequest::setRawHeader().
+
+    For reading small pieces of data, use setBody(); for larger data blocks
+    like e.g. images, use setBodyDevice(). The latter method saves memory by
+    not copying the data internally, but reading directly from the device.
+    This means that the device must be opened and readable at the moment when
+    the multipart message containing the body part is sent on the network via
+    QNetworkAccessManager::post().
+
+    To construct a QHttpPart with a small body, consider the following snippet
+    (this produces the data shown in the example above):
+
+    \snippet doc/src/snippets/code/src_network_access_qhttppart.cpp 1
+
+    To construct a QHttpPart reading from a device (e.g. a file), the following
+    can be applied:
+
+    \snippet doc/src/snippets/code/src_network_access_qhttppart.cpp 2
+
+    Be aware that QHttpPart does not take ownership of the device when set, so
+    it is the developer's responsability to destroy it when it is not needed anymore.
+    A good idea might be to set the multipart message as parent object for the device,
+    as documented at the documentation for QHttpMultiPart.
+
+    \sa QHttpMultiPart, QNetworkAccessManager
+*/
+
+
+/*!
+    Constructs an empty QHttpPart object.
+*/
+QHttpPart::QHttpPart() : d(new QHttpPartPrivate)
+{
+}
+
+/*!
+    Creates a copy of \a other.
+*/
+QHttpPart::QHttpPart(const QHttpPart &other) : d(other.d)
+{
+}
+
+/*!
+    Destroys this QHttpPart.
+*/
+QHttpPart::~QHttpPart()
+{
+    d = 0;
+}
+
+/*!
+    Creates a copy of \a other.
+*/
+QHttpPart &QHttpPart::operator=(const QHttpPart &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Returns true if this object is the same as \a other (i.e., if they
+    have the same headers and body).
+
+    \sa operator!=()
+*/
+bool QHttpPart::operator==(const QHttpPart &other) const
+{
+    return d == other.d || *d == *other.d;
+}
+
+/*!
+    \fn bool QHttpPart::operator!=(const QHttpPart &other) const
+
+    Returns true if this object is not the same as \a other.
+
+    \sa operator==()
+*/
+
+/*!
+    Sets the value of the known header \a header to be \a value,
+    overriding any previously set headers.
+
+    \sa QNetworkRequest::KnownHeaders, setRawHeader(), QNetworkRequest::setHeader()
+*/
+void QHttpPart::setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
+{
+    d->setCookedHeader(header, value);
+}
+
+/*!
+    Sets the header \a headerName to be of value \a headerValue. If \a
+    headerName corresponds to a known header (see
+    QNetworkRequest::KnownHeaders), the raw format will be parsed and
+    the corresponding "cooked" header will be set as well.
+
+    Note: setting the same header twice overrides the previous
+    setting. To accomplish the behaviour of multiple HTTP headers of
+    the same name, you should concatenate the two values, separating
+    them with a comma (",") and set one single raw header.
+
+    \sa QNetworkRequest::KnownHeaders, setHeader(), QNetworkRequest::setRawHeader()
+*/
+void QHttpPart::setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)
+{
+    d->setRawHeader(headerName, headerValue);
+}
+
+/*!
+    Sets the body of this MIME part to \a body. The body set with this method
+    will be used unless the device is set via setBodyDevice(). For a large
+    amount of data (e.g. an image), use setBodyDevice(), which will not copy
+    the data internally.
+
+    \sa setBodyDevice()
+*/
+void QHttpPart::setBody(const QByteArray &body)
+{
+    d->setBody(body);
+}
+
+/*!
+  Sets the device to read the content from to \a device. For large amounts of data
+  this method should be preferred over setBody(),
+  because the content is not copied when using this method, but read
+  directly from the device.
+  \a device must be open and readable. QHttpPart does not take ownership
+  of \a device, i.e. the device must be closed and destroyed if necessary.
+  if \a device is sequential (e.g. sockets, but not files),
+  QNetworkAccessManager::post() should be called after \a device has
+  emitted finished().
+  For unsetting the device and using data set via setBody(), use
+  "setBodyDevice(0)".
+
+  \sa setBody(), QNetworkAccessManager::post()
+  */
+void QHttpPart::setBodyDevice(QIODevice *device)
+{
+    d->setBodyDevice(device);
+}
+
+
+
+/*!
+    \class QHttpMultiPart
+    \brief The QHttpMultiPart class resembles a MIME multipart message to be sent over HTTP.
+    \since 4.8
+
+    \ingroup network
+    \inmodule QtNetwork
+
+    The QHttpMultiPart resembles a MIME multipart message, as described in RFC 2046,
+    which is to be sent over HTTP.
+    A multipart message consists of an arbitrary number of body parts (see QHttpPart),
+    which are separated by a unique boundary. The boundary of the QHttpMultiPart is
+    constructed with the string "boundary_.oOo._" followed by random characters,
+    and provides enough uniqueness to make sure it does not occur inside the parts itself.
+    If desired, the boundary can still be set via setBoundary().
+
+    As an example, consider the following code snippet, which constructs a multipart
+    message containing a text part followed by an image part:
+
+    \snippet doc/src/snippets/code/src_network_access_qhttpmultipart.cpp 0
+
+    \sa QHttpPart, QNetworkAccessManager::post()
+*/
+
+/*!
+    \enum QHttpMultiPart::ContentType
+
+    List of known content types for a multipart subtype as described
+    in RFC 2046 and others.
+
+    \value MixedType    corresponds to the "multipart/mixed" subtype,
+    meaning the body parts are independent of each other, as described
+    in RFC 2046.
+
+    \value RelatedType  corresponds to the "multipart/related" subtype,
+    meaning the body parts are related to each other, as described in RFC 2387.
+
+    \value FormDataType       corresponds to the "multipart/form-data"
+    subtype, meaning the body parts contain form elements, as described in RFC 2388.
+
+    \value AlternativeType   corresponds to the "multipart/alternative"
+    subtype, meaning the body parts are alternative representations of
+    the same information, as described in RFC 2046.
+
+    \sa setContentType()
+*/
+
+/*!
+    Constructs a QHttpMultiPart with content type MixedType and sets
+    parent as the parent object.
+
+    \sa QHttpMultiPart::ContentType
+*/
+QHttpMultiPart::QHttpMultiPart(QObject *parent) : QObject(*new QHttpMultiPartPrivate, parent)
+{
+    Q_D(QHttpMultiPart);
+    d->contentType = MixedType;
+}
+
+/*!
+    Constructs a QHttpMultiPart with content type \a contentType and
+    sets parent as the parent object.
+
+    \sa QHttpMultiPart::ContentType
+*/
+QHttpMultiPart::QHttpMultiPart(QHttpMultiPart::ContentType contentType, QObject *parent) : QObject(*new QHttpMultiPartPrivate, parent)
+{
+    Q_D(QHttpMultiPart);
+    d->contentType = contentType;
+}
+
+/*!
+    Destroys the multipart.
+*/
+QHttpMultiPart::~QHttpMultiPart()
+{
+}
+
+/*!
+    Appends \a httpPart to this multipart.
+*/
+void QHttpMultiPart::append(const QHttpPart &httpPart)
+{
+    d_func()->parts.append(httpPart);
+}
+
+/*!
+    Sets the content type to \a contentType. The content type will be used
+    in the HTTP header section when sending the multipart message via
+    QNetworkAccessManager::post().
+    In case you want to use a multipart subtype not contained in
+    QHttpMultiPart::ContentType,
+    you can add the "Content-Type" header field to the QNetworkRequest
+    by hand, and then use this request together with the multipart
+    message for posting.
+
+    \sa QHttpMultiPart::ContentType, QNetworkAccessManager::post()
+*/
+void QHttpMultiPart::setContentType(QHttpMultiPart::ContentType contentType)
+{
+    d_func()->contentType = contentType;
+}
+
+/*!
+    returns the boundary.
+
+    \sa setBoundary()
+*/
+QByteArray QHttpMultiPart::boundary() const
+{
+    return d_func()->boundary;
+}
+
+/*!
+    Sets the boundary to \a boundary.
+
+    Usually, you do not need to generate a boundary yourself; upon construction
+    the boundary is initiated with the string "boundary_.oOo._" followed by random
+    characters, and provides enough uniqueness to make sure it does not occur
+    inside the parts itself.
+
+    \sa boundary()
+*/
+void QHttpMultiPart::setBoundary(const QByteArray &boundary)
+{
+    d_func()->boundary = boundary;
+}
+
+
+
+// ------------------------------------------------------------------
+// ----------- implementations of private classes: ------------------
+// ------------------------------------------------------------------
+
+
+
+qint64 QHttpPartPrivate::bytesAvailable() const
+{
+    checkHeaderCreated();
+    qint64 bytesAvailable = header.count();
+    if (bodyDevice) {
+        bytesAvailable += bodyDevice->bytesAvailable() - readPointer;
+    } else {
+        bytesAvailable += body.count() - readPointer;
+    }
+    // the device might have closed etc., so make sure we do not return a negative value
+    return qMax(bytesAvailable, (qint64) 0);
+}
+
+qint64 QHttpPartPrivate::readData(char *data, qint64 maxSize)
+{
+    checkHeaderCreated();
+    qint64 bytesRead = 0;
+    qint64 headerDataCount = header.count();
+
+    // read header if it has not been read yet
+    if (readPointer < headerDataCount) {
+        bytesRead = qMin(headerDataCount - readPointer, maxSize);
+        const char *headerData = header.constData();
+        memcpy(data, headerData + readPointer, bytesRead);
+        readPointer += bytesRead;
+    }
+    // read content if there is still space
+    if (bytesRead < maxSize) {
+        if (bodyDevice) {
+            qint64 dataBytesRead = bodyDevice->read(data + bytesRead, maxSize - bytesRead);
+            if (dataBytesRead == -1)
+                return -1;
+            bytesRead += dataBytesRead;
+            readPointer += dataBytesRead;
+        } else {
+            qint64 contentBytesRead = qMin(body.count() - readPointer + headerDataCount, maxSize - bytesRead);
+            const char *contentData = body.constData();
+            // if this method is called several times, we need to find the
+            // right offset in the content ourselves:
+            memcpy(data + bytesRead, contentData + readPointer - headerDataCount, contentBytesRead);
+            bytesRead += contentBytesRead;
+            readPointer += contentBytesRead;
+        }
+    }
+    return bytesRead;
+}
+
+qint64 QHttpPartPrivate::size() const
+{
+    checkHeaderCreated();
+    qint64 size = header.count();
+    if (bodyDevice) {
+        size += bodyDevice->size();
+    } else {
+        size += body.count();
+    }
+    return size;
+}
+
+bool QHttpPartPrivate::reset()
+{
+    bool ret = true;
+    if (bodyDevice)
+        if (!bodyDevice->reset())
+            ret = false;
+    readPointer = 0;
+    return ret;
+}
+void QHttpPartPrivate::checkHeaderCreated() const
+{
+    if (!headerCreated) {
+        // copied from QHttpNetworkRequestPrivate::header() and adapted
+        QList<QPair<QByteArray, QByteArray> > fields = allRawHeaders();
+        QList<QPair<QByteArray, QByteArray> >::const_iterator it = fields.constBegin();
+        for (; it != fields.constEnd(); ++it)
+            header += it->first + ": " + it->second + "\r\n";
+        header += "\r\n";
+        headerCreated = true;
+    }
+}
+
+Q_GLOBAL_STATIC(QThreadStorage<bool *>, seedCreatedStorage);
+
+QHttpMultiPartPrivate::QHttpMultiPartPrivate() : contentType(QHttpMultiPart::MixedType), device(new QHttpMultiPartIODevice(this))
+{
+    if (!seedCreatedStorage()->hasLocalData()) {
+        qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) ^ reinterpret_cast<quintptr>(this));
+        seedCreatedStorage()->setLocalData(new bool(true));
+    }
+
+    boundary = QByteArray("boundary_.oOo._")
+               + QByteArray::number(qrand()).toBase64()
+               + QByteArray::number(qrand()).toBase64()
+               + QByteArray::number(qrand()).toBase64();
+
+    // boundary must not be longer than 70 characters, see RFC 2046, section 5.1.1
+    if (boundary.count() > 70)
+        boundary = boundary.left(70);
+}
+
+qint64 QHttpMultiPartIODevice::size() const
+{
+    // if not done yet, we calculate the size and the offsets of each part,
+    // including boundary (needed later in readData)
+    if (deviceSize == -1) {
+        qint64 currentSize = 0;
+        qint64 boundaryCount = multiPart->boundary.count();
+        for (int a = 0; a < multiPart->parts.count(); a++) {
+            partOffsets.append(currentSize);
+            // 4 additional bytes for the "--" before and the "\r\n" after the boundary,
+            // and 2 bytes for the "\r\n" after the content
+            currentSize += boundaryCount + 4 + multiPart->parts.at(a).d->size() + 2;
+        }
+        currentSize += boundaryCount + 4; // size for ending boundary and 2 beginning and ending dashes
+        deviceSize = currentSize;
+    }
+    return deviceSize;
+}
+
+bool QHttpMultiPartIODevice::isSequential() const
+{
+    for (int a = 0; a < multiPart->parts.count(); a++) {
+        QIODevice *device = multiPart->parts.at(a).d->bodyDevice;
+        // we are sequential if any of the bodyDevices of our parts are sequential;
+        // when reading from a byte array, we are not sequential
+        if (device && device->isSequential())
+            return true;
+    }
+    return false;
+}
+
+bool QHttpMultiPartIODevice::reset()
+{
+    for (int a = 0; a < multiPart->parts.count(); a++)
+        if (!multiPart->parts[a].d->reset())
+            return false;
+    return true;
+}
+qint64 QHttpMultiPartIODevice::readData(char *data, qint64 maxSize)
+{
+    qint64 bytesRead = 0, index = 0;
+
+    // skip the parts we have already read
+    while (index < multiPart->parts.count() &&
+           readPointer >= partOffsets.at(index) + multiPart->parts.at(index).d->size())
+        index++;
+
+    // read the data
+    while (bytesRead < maxSize && index < multiPart->parts.count()) {
+
+        // check whether we need to read the boundary of the current part
+        QByteArray boundaryData = "--" + multiPart->boundary + "\r\n";
+        qint64 boundaryCount = boundaryData.count();
+        qint64 partIndex = readPointer - partOffsets.at(index);
+        if (partIndex < boundaryCount) {
+            qint64 boundaryBytesRead = qMin(boundaryCount - partIndex, maxSize - bytesRead);
+            memcpy(data + bytesRead, boundaryData.constData() + partIndex, boundaryBytesRead);
+            bytesRead += boundaryBytesRead;
+            readPointer += boundaryBytesRead;
+            partIndex += boundaryBytesRead;
+        }
+
+        // check whether we need to read the data of the current part
+        if (bytesRead < maxSize && partIndex >= boundaryCount && partIndex < boundaryCount + multiPart->parts.at(index).d->size()) {
+            qint64 dataBytesRead = multiPart->parts[index].d->readData(data + bytesRead, maxSize - bytesRead);
+            if (dataBytesRead == -1)
+                return -1;
+            bytesRead += dataBytesRead;
+            readPointer += dataBytesRead;
+            partIndex += dataBytesRead;
+        }
+
+        // check whether we need to read the ending CRLF of the current part
+        if (bytesRead < maxSize && partIndex >= boundaryCount + multiPart->parts.at(index).d->size()) {
+            if (bytesRead == maxSize - 1)
+                return bytesRead;
+            memcpy(data + bytesRead, "\r\n", 2);
+            bytesRead += 2;
+            readPointer += 2;
+            index++;
+        }
+    }
+    // check whether we need to return the final boundary
+    if (bytesRead < maxSize && index == multiPart->parts.count()) {
+        QByteArray finalBoundary = "--" + multiPart->boundary + "--";
+        qint64 boundaryIndex = readPointer + finalBoundary.count() - size();
+        qint64 lastBoundaryBytesRead = qMin(finalBoundary.count() - boundaryIndex, maxSize - bytesRead);
+        memcpy(data + bytesRead, finalBoundary.constData() + boundaryIndex, lastBoundaryBytesRead);
+        bytesRead += lastBoundaryBytesRead;
+        readPointer += lastBoundaryBytesRead;
+    }
+    return bytesRead;
+}
+
+qint64 QHttpMultiPartIODevice::writeData(const char *data, qint64 maxSize)
+{
+    Q_UNUSED(data);
+    Q_UNUSED(maxSize);
+    return -1;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/network/access/qhttpmultipart.h b/src/network/access/qhttpmultipart.h
new file mode 100644
index 0000000..0a3342c
--- /dev/null
+++ b/src/network/access/qhttpmultipart.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QHTTPMULTIPART_H
+#define QHTTPMULTIPART_H
+
+#include <QtCore/QSharedDataPointer>
+#include <QtCore/QByteArray>
+#include <QtNetwork/QNetworkRequest>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Network)
+
+class QHttpPartPrivate;
+class QHttpMultiPart;
+
+class Q_NETWORK_EXPORT QHttpPart
+{
+public:
+    QHttpPart();
+    QHttpPart(const QHttpPart &other);
+    ~QHttpPart();
+    QHttpPart &operator=(const QHttpPart &other);
+    bool operator==(const QHttpPart &other) const;
+    inline bool operator!=(const QHttpPart &other) const
+    { return !operator==(other); }
+
+    void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value);
+    void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue);
+
+    void setBody(const QByteArray &body);
+    void setBodyDevice(QIODevice *device);
+
+private:
+    QSharedDataPointer<QHttpPartPrivate> d;
+
+    friend class QHttpMultiPartIODevice;
+};
+
+class QHttpMultiPartPrivate;
+
+class Q_NETWORK_EXPORT QHttpMultiPart : public QObject
+{
+    Q_OBJECT
+
+public:
+
+    enum ContentType {
+        MixedType,
+        RelatedType,
+        FormDataType,
+        AlternativeType
+    };
+
+    QHttpMultiPart(QObject *parent = 0);
+    QHttpMultiPart(ContentType contentType, QObject *parent = 0);
+    ~QHttpMultiPart();
+
+    void append(const QHttpPart &httpPart);
+
+    void setContentType(ContentType contentType);
+
+    QByteArray boundary() const;
+    void setBoundary(const QByteArray &boundary);
+
+private:
+    Q_DECLARE_PRIVATE(QHttpMultiPart)
+    Q_DISABLE_COPY(QHttpMultiPart)
+
+    friend class QNetworkAccessManager;
+    friend class QNetworkAccessManagerPrivate;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QHTTPMULTIPART_H
diff --git a/src/network/access/qhttpmultipart_p.h b/src/network/access/qhttpmultipart_p.h
new file mode 100644
index 0000000..7dc13e9
--- /dev/null
+++ b/src/network/access/qhttpmultipart_p.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QHTTPMULTIPART_P_H
+#define QHTTPMULTIPART_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of the Network Access API.  This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "QtCore/qshareddata.h"
+#include "qnetworkrequest_p.h" // for deriving QHttpPartPrivate from QNetworkHeadersPrivate
+#include "private/qobject_p.h"
+
+QT_BEGIN_NAMESPACE
+
+
+class QHttpPartPrivate: public QSharedData, public QNetworkHeadersPrivate
+{
+public:
+    inline QHttpPartPrivate() : bodyDevice(0), headerCreated(false), readPointer(0)
+    {
+    }
+    ~QHttpPartPrivate()
+    {
+    }
+
+
+    QHttpPartPrivate(const QHttpPartPrivate &other)
+        : QSharedData(other), QNetworkHeadersPrivate(other), body(other.body),
+        header(other.header), headerCreated(other.headerCreated), readPointer(other.readPointer)
+    {
+        bodyDevice = other.bodyDevice;
+    }
+
+    inline bool operator==(const QHttpPartPrivate &other) const
+    {
+        return rawHeaders == other.rawHeaders && body == other.body &&
+                bodyDevice == other.bodyDevice && readPointer == other.readPointer;
+    }
+
+    void setBodyDevice(QIODevice *device) {
+        bodyDevice = device;
+        readPointer = 0;
+    }
+    void setBody(const QByteArray &newBody) {
+        body = newBody;
+        readPointer = 0;
+    }
+
+    // QIODevice-style methods called by QHttpMultiPartIODevice (but this class is
+    // not a QIODevice):
+    qint64 bytesAvailable() const;
+    qint64 readData(char *data, qint64 maxSize);
+    qint64 size() const;
+    bool reset();
+
+    QByteArray body;
+    QIODevice *bodyDevice;
+
+private:
+    void checkHeaderCreated() const;
+
+    mutable QByteArray header;
+    mutable bool headerCreated;
+    qint64 readPointer;
+};
+
+
+
+class QHttpMultiPartPrivate;
+
+class Q_AUTOTEST_EXPORT QHttpMultiPartIODevice : public QIODevice
+{
+public:
+    QHttpMultiPartIODevice(QHttpMultiPartPrivate *parentMultiPart) :
+            QIODevice(), multiPart(parentMultiPart), readPointer(0), deviceSize(-1) {
+    }
+
+    ~QHttpMultiPartIODevice() {
+    }
+
+    virtual bool atEnd() const {
+        return readPointer == size();
+    }
+
+    virtual qint64 bytesAvailable() const {
+        return size() - readPointer;
+    }
+
+    virtual void close() {
+        readPointer = 0;
+        partOffsets.clear();
+        deviceSize = -1;
+        QIODevice::close();
+    }
+
+    virtual qint64 bytesToWrite() const {
+        return 0;
+    }
+
+    virtual qint64 size() const;
+    virtual bool isSequential() const;
+    virtual bool reset();
+    virtual qint64 readData(char *data, qint64 maxSize);
+    virtual qint64 writeData(const char *data, qint64 maxSize);
+
+    QHttpMultiPartPrivate *multiPart;
+    qint64 readPointer;
+    mutable QList<qint64> partOffsets;
+    mutable qint64 deviceSize;
+};
+
+
+
+class QHttpMultiPartPrivate: public QObjectPrivate
+{
+public:
+
+    QHttpMultiPartPrivate();
+
+    ~QHttpMultiPartPrivate()
+    {
+        delete device;
+    }
+
+    QList<QHttpPart> parts;
+    QByteArray boundary;
+    QHttpMultiPart::ContentType contentType;
+    QHttpMultiPartIODevice *device;
+
+};
+
+QT_END_NAMESPACE
+
+
+#endif // QHTTPMULTIPART_P_H
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 7e75045..0337607 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -64,6 +64,8 @@
 #include "QtNetwork/qauthenticator.h"
 #include "QtNetwork/qsslconfiguration.h"
 #include "QtNetwork/qnetworkconfigmanager.h"
+#include "QtNetwork/qhttpmultipart.h"
+#include "qhttpmultipart_p.h"
 
 #include "qthread.h"
 
@@ -629,6 +631,46 @@ QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, const
 }
 
 /*!
+    \since 4.8
+
+    \overload
+
+    Sends the contents of the \a multiPart message to the destination
+    specified by \a request.
+
+    This can be used for sending MIME multipart messages over HTTP.
+
+    \sa QHttpMultiPart, QHttpPart, put()
+*/
+QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QHttpMultiPart *multiPart)
+{
+    QNetworkRequest newRequest = d_func()->prepareMultipart(request, multiPart);
+    QIODevice *device = multiPart->d_func()->device;
+    QNetworkReply *reply = post(newRequest, device);
+    return reply;
+}
+
+/*!
+    \since 4.8
+
+    \overload
+
+    Sends the contents of the \a multiPart message to the destination
+    specified by \a request.
+
+    This can be used for sending MIME multipart messages over HTTP.
+
+    \sa QHttpMultiPart, QHttpPart, post()
+*/
+QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QHttpMultiPart *multiPart)
+{
+    QNetworkRequest newRequest = d_func()->prepareMultipart(request, multiPart);
+    QIODevice *device = multiPart->d_func()->device;
+    QNetworkReply *reply = put(newRequest, device);
+    return reply;
+}
+
+/*!
     Uploads the contents of \a data to the destination \a request and
     returnes a new QNetworkReply object that will be open for reply.
 
@@ -654,7 +696,8 @@ QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QIODev
 
 /*!
     \overload
-    Sends the contents of the \a data byte array to the destination 
+
+    Sends the contents of the \a data byte array to the destination
     specified by \a request.
 */
 QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, const QByteArray &data)
@@ -1177,6 +1220,54 @@ void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession
 }
 #endif // QT_NO_BEARERMANAGEMENT
 
+QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart)
+{
+    // copy the request, we probably need to add some headers
+    QNetworkRequest newRequest(request);
+
+    // add Content-Type header if not there already
+    if (!request.header(QNetworkRequest::ContentTypeHeader).isValid()) {
+        QByteArray contentType;
+        contentType.reserve(34 + multiPart->d_func()->boundary.count());
+        contentType += "multipart/";
+        switch (multiPart->d_func()->contentType) {
+        case QHttpMultiPart::RelatedType:
+            contentType += "related";
+            break;
+        case QHttpMultiPart::FormDataType:
+            contentType += "form-data";
+            break;
+        case QHttpMultiPart::AlternativeType:
+            contentType += "alternative";
+            break;
+        default:
+            contentType += "mixed";
+            break;
+        }
+        // putting the boundary into quotes, recommended in RFC 2046 section 5.1.1
+        contentType += "; boundary=\"" + multiPart->d_func()->boundary + "\"";
+        newRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType));
+    }
+
+    // add MIME-Version header if not there already (we must include the header
+    // if the message conforms to RFC 2045, see section 4 of that RFC)
+    QByteArray mimeHeader("MIME-Version");
+    if (!request.hasRawHeader(mimeHeader))
+        newRequest.setRawHeader(mimeHeader, QByteArray("1.0"));
+
+    QIODevice *device = multiPart->d_func()->device;
+    if (!device->isReadable()) {
+        if (!device->isOpen()) {
+            if (!device->open(QIODevice::ReadOnly))
+                qWarning("could not open device for reading");
+        } else {
+            qWarning("device is not readable");
+        }
+    }
+
+    return newRequest;
+}
+
 QT_END_NAMESPACE
 
 #include "moc_qnetworkaccessmanager.cpp"
diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h
index d67b8ac..47760b2 100644
--- a/src/network/access/qnetworkaccessmanager.h
+++ b/src/network/access/qnetworkaccessmanager.h
@@ -65,6 +65,7 @@ class QSslError;
 #if !defined(QT_NO_BEARERMANAGEMENT) && !defined(QT_MOBILITY_BEARER)
 class QNetworkConfiguration;
 #endif
+class QHttpMultiPart;
 
 class QNetworkReplyImplPrivate;
 class QNetworkAccessManagerPrivate;
@@ -116,8 +117,10 @@ public:
     QNetworkReply *get(const QNetworkRequest &request);
     QNetworkReply *post(const QNetworkRequest &request, QIODevice *data);
     QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data);
+    QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart);
     QNetworkReply *put(const QNetworkRequest &request, QIODevice *data);
     QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data);
+    QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart);
     QNetworkReply *deleteResource(const QNetworkRequest &request);
     QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = 0);
 
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index ee6ad70..0f18221 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -119,6 +119,8 @@ public:
     void _q_networkSessionStateChanged(QNetworkSession::State state);
 #endif
 
+    QNetworkRequest prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart);
+
     // this is the cache for storing downloaded files
     QAbstractNetworkCache *networkCache;
 
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index a48a26f..665ee28 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -639,6 +639,9 @@ static QByteArray headerName(QNetworkRequest::KnownHeaders header)
     case QNetworkRequest::SetCookieHeader:
         return "Set-Cookie";
 
+    case QNetworkRequest::ContentDispositionHeader:
+        return "Content-Disposition";
+
     // no default:
     // if new values are added, this will generate a compiler warning
     }
@@ -651,6 +654,7 @@ static QByteArray headerValue(QNetworkRequest::KnownHeaders header, const QVaria
     switch (header) {
     case QNetworkRequest::ContentTypeHeader:
     case QNetworkRequest::ContentLengthHeader:
+    case QNetworkRequest::ContentDispositionHeader:
         return value.toByteArray();
 
     case QNetworkRequest::LocationHeader:
@@ -812,6 +816,11 @@ QNetworkHeadersPrivate::findRawHeader(const QByteArray &key) const
     return end;                 // not found
 }
 
+QNetworkHeadersPrivate::RawHeadersList QNetworkHeadersPrivate::allRawHeaders() const
+{
+    return rawHeaders;
+}
+
 QList<QByteArray> QNetworkHeadersPrivate::rawHeadersKeys() const
 {
     QList<QByteArray> result;
diff --git a/src/network/access/qnetworkrequest.h b/src/network/access/qnetworkrequest.h
index b5ef109..d3bbba7 100644
--- a/src/network/access/qnetworkrequest.h
+++ b/src/network/access/qnetworkrequest.h
@@ -65,7 +65,8 @@ public:
         LocationHeader,
         LastModifiedHeader,
         CookieHeader,
-        SetCookieHeader
+        SetCookieHeader,
+        ContentDispositionHeader  // added for QMultipartMessage
     };
     enum Attribute {
         HttpStatusCodeAttribute,
diff --git a/src/network/access/qnetworkrequest_p.h b/src/network/access/qnetworkrequest_p.h
index 23705f5..ea8c56f 100644
--- a/src/network/access/qnetworkrequest_p.h
+++ b/src/network/access/qnetworkrequest_p.h
@@ -62,7 +62,7 @@
 
 QT_BEGIN_NAMESPACE
 
-// this is the common part between QNetworkRequestPrivate and QNetworkReplyPrivate
+// this is the common part between QNetworkRequestPrivate, QNetworkReplyPrivate and QHttpPartPrivate
 class QNetworkHeadersPrivate
 {
 public:
@@ -77,6 +77,7 @@ public:
     QWeakPointer<QObject> originatingObject;
 
     RawHeadersList::ConstIterator findRawHeader(const QByteArray &key) const;
+    RawHeadersList allRawHeaders() const;
     QList<QByteArray> rawHeadersKeys() const;
     void setRawHeader(const QByteArray &key, const QByteArray &value);
     void setAllRawHeaders(const RawHeadersList &list);
diff --git a/tests/auto/qnetworkreply/image1.jpg b/tests/auto/qnetworkreply/image1.jpg
new file mode 100644
index 0000000..dba31c1
Binary files /dev/null and b/tests/auto/qnetworkreply/image1.jpg differ
diff --git a/tests/auto/qnetworkreply/image2.jpg b/tests/auto/qnetworkreply/image2.jpg
new file mode 100644
index 0000000..72936e2
Binary files /dev/null and b/tests/auto/qnetworkreply/image2.jpg differ
diff --git a/tests/auto/qnetworkreply/image3.jpg b/tests/auto/qnetworkreply/image3.jpg
new file mode 100644
index 0000000..cede519
Binary files /dev/null and b/tests/auto/qnetworkreply/image3.jpg differ
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 48b3ecc..6ed8f16 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -60,6 +60,8 @@
 #include <QtNetwork/qnetworkrequest.h>
 #include <QtNetwork/qnetworkreply.h>
 #include <QtNetwork/qnetworkcookie.h>
+#include <QtNetwork/QHttpPart>
+#include <QtNetwork/QHttpMultiPart>
 #ifndef QT_NO_OPENSSL
 #include <QtNetwork/qsslerror.h>
 #include <QtNetwork/qsslconfiguration.h>
@@ -83,6 +85,8 @@ Q_DECLARE_METATYPE(QNetworkProxyQuery)
 Q_DECLARE_METATYPE(QList<QNetworkProxy>)
 Q_DECLARE_METATYPE(QNetworkReply::NetworkError)
 Q_DECLARE_METATYPE(QBuffer*)
+Q_DECLARE_METATYPE(QHttpMultiPart *)
+Q_DECLARE_METATYPE(QList<QFile*>) // for multiparts
 
 class QNetworkReplyPtr: public QSharedPointer<QNetworkReply>
 {
@@ -139,6 +143,8 @@ public:
     ~tst_QNetworkReply();
     QString runSimpleRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request,
                              QNetworkReplyPtr &reply, const QByteArray &data = QByteArray());
+    QString runMultipartRequest(const QNetworkRequest &request, QNetworkReplyPtr &reply,
+                                    QHttpMultiPart *multiPart, const QByteArray &verb);
 
     QString runCustomRequest(const QNetworkRequest &request, QNetworkReplyPtr &reply,
                              const QByteArray &verb, QIODevice *data);
@@ -185,10 +191,14 @@ private Q_SLOTS:
     void putToHttp();
     void putToHttpSynchronous_data();
     void putToHttpSynchronous();
+    void putToHttpMultipart_data();
+    void putToHttpMultipart();
     void postToHttp_data();
     void postToHttp();
     void postToHttpSynchronous_data();
     void postToHttpSynchronous();
+    void postToHttpMultipart_data();
+    void postToHttpMultipart();
     void deleteFromHttp_data();
     void deleteFromHttp();
     void putGetDeleteGetFromHttp_data();
@@ -1092,6 +1102,38 @@ void tst_QNetworkReply::storeSslConfiguration()
 }
 #endif
 
+QString tst_QNetworkReply::runMultipartRequest(const QNetworkRequest &request,
+                                                   QNetworkReplyPtr &reply,
+                                                   QHttpMultiPart *multiPart,
+                                                   const QByteArray &verb)
+{
+    if (verb == "POST")
+        reply = manager.post(request, multiPart);
+    else
+        reply = manager.put(request, multiPart);
+
+    // the code below is copied from tst_QNetworkReply::runSimpleRequest, see below
+    reply->setParent(this);
+    connect(reply, SIGNAL(finished()), SLOT(finished()));
+    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+    multiPart->setParent(reply);
+
+    returnCode = Timeout;
+    loop = new QEventLoop;
+    QTimer::singleShot(25000, loop, SLOT(quit()));
+    int code = returnCode == Timeout ? loop->exec() : returnCode;
+    delete loop;
+    loop = 0;
+
+    switch (code) {
+    case Failure:
+        return "Request failed: " + reply->errorString();
+    case Timeout:
+        return "Network timeout";
+    }
+    return QString();
+}
+
 QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op,
                                             const QNetworkRequest &request,
                                             QNetworkReplyPtr &reply,
@@ -1837,6 +1879,307 @@ void tst_QNetworkReply::postToHttpSynchronous()
     QCOMPARE(uploadedData, md5sum.toHex());
 }
 
+void tst_QNetworkReply::postToHttpMultipart_data()
+{
+    QTest::addColumn<QUrl>("url");
+    QTest::addColumn<QHttpMultiPart *>("multiPart");
+    QTest::addColumn<QByteArray>("expectedReplyData");
+    QTest::addColumn<QByteArray>("contentType");
+
+    QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/multipart.cgi");
+    QByteArray expectedData;
+
+
+    // empty parts
+
+    QHttpMultiPart *emptyMultiPart = new QHttpMultiPart;
+    QTest::newRow("empty") << url << emptyMultiPart << expectedData << QByteArray("mixed");
+
+    QHttpMultiPart *emptyRelatedMultiPart = new QHttpMultiPart;
+    emptyRelatedMultiPart->setContentType(QHttpMultiPart::RelatedType);
+    QTest::newRow("empty-related") << url << emptyRelatedMultiPart << expectedData << QByteArray("related");
+
+    QHttpMultiPart *emptyAlternativeMultiPart = new QHttpMultiPart;
+    emptyAlternativeMultiPart->setContentType(QHttpMultiPart::AlternativeType);
+    QTest::newRow("empty-alternative") << url << emptyAlternativeMultiPart << expectedData << QByteArray("alternative");
+
+
+    // text-only parts
+
+    QHttpPart textPart;
+    textPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
+    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
+    textPart.setBody("7 bytes");
+    QHttpMultiPart *multiPart1 = new QHttpMultiPart;
+    multiPart1->setContentType(QHttpMultiPart::FormDataType);
+    multiPart1->append(textPart);
+    expectedData = "key: text, value: 7 bytes\n";
+    QTest::newRow("text") << url << multiPart1 << expectedData << QByteArray("form-data");
+
+    QHttpMultiPart *customMultiPart = new QHttpMultiPart;
+    customMultiPart->append(textPart);
+    expectedData = "header: Content-Type, value: 'text/plain'\n"
+                   "header: Content-Disposition, value: 'form-data; name=\"text\"'\n"
+                   "content: 7 bytes\n"
+                   "\n";
+    QTest::newRow("text-custom") << url << customMultiPart << expectedData << QByteArray("custom");
+
+    QHttpPart textPart2;
+    textPart2.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
+    textPart2.setRawHeader("myRawHeader", "myValue");
+    textPart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text2\""));
+    textPart2.setBody("some more bytes");
+    textPart2.setBodyDevice((QIODevice *) 1); // test whether setting and unsetting of the device works
+    textPart2.setBodyDevice(0);
+    QHttpMultiPart *multiPart2 = new QHttpMultiPart;
+    multiPart2->setContentType(QHttpMultiPart::FormDataType);
+    multiPart2->append(textPart);
+    multiPart2->append(textPart2);
+    expectedData = "key: text2, value: some more bytes\n"
+                   "key: text, value: 7 bytes\n";
+    QTest::newRow("text-text") << url << multiPart2 << expectedData << QByteArray("form-data");
+
+
+    QHttpPart textPart3;
+    textPart3.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
+    textPart3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text3\""));
+    textPart3.setRawHeader("Content-Location", "http://my.test.location.tld");
+    textPart3.setBody("even more bytes");
+    QHttpMultiPart *multiPart3 = new QHttpMultiPart;
+    multiPart3->setContentType(QHttpMultiPart::AlternativeType);
+    multiPart3->append(textPart);
+    multiPart3->append(textPart2);
+    multiPart3->append(textPart3);
+    expectedData = "header: Content-Type, value: 'text/plain'\n"
+                   "header: Content-Disposition, value: 'form-data; name=\"text\"'\n"
+                   "content: 7 bytes\n"
+                   "\n"
+                   "header: Content-Type, value: 'text/plain'\n"
+                   "header: myRawHeader, value: 'myValue'\n"
+                   "header: Content-Disposition, value: 'form-data; name=\"text2\"'\n"
+                   "content: some more bytes\n"
+                   "\n"
+                   "header: Content-Type, value: 'text/plain'\n"
+                   "header: Content-Disposition, value: 'form-data; name=\"text3\"'\n"
+                   "header: Content-Location, value: 'http://my.test.location.tld'\n"
+                   "content: even more bytes\n\n";
+    QTest::newRow("text-text-text") << url << multiPart3 << expectedData << QByteArray("alternative");
+
+
+
+    // text and image parts
+
+    QHttpPart imagePart11;
+    imagePart11.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart11.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage\""));
+    imagePart11.setRawHeader("Content-Location", "http://my.test.location.tld");
+    imagePart11.setRawHeader("Content-ID", "my@id.tld");
+    QFile *file11 = new QFile(SRCDIR "/image1.jpg");
+    file11->open(QIODevice::ReadOnly);
+    imagePart11.setBodyDevice(file11);
+    QHttpMultiPart *imageMultiPart1 = new QHttpMultiPart(QHttpMultiPart::FormDataType);
+    imageMultiPart1->append(imagePart11);
+    file11->setParent(imageMultiPart1);
+    expectedData = "key: testImage, value: 87ef3bb319b004ba9e5e9c9fa713776e\n"; // md5 sum of file
+    QTest::newRow("image") << url << imageMultiPart1 << expectedData << QByteArray("form-data");
+
+    QHttpPart imagePart21;
+    imagePart21.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart21.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage1\""));
+    imagePart21.setRawHeader("Content-Location", "http://my.test.location.tld");
+    imagePart21.setRawHeader("Content-ID", "my@id.tld");
+    QFile *file21 = new QFile(SRCDIR "/image1.jpg");
+    file21->open(QIODevice::ReadOnly);
+    imagePart21.setBodyDevice(file21);
+    QHttpMultiPart *imageMultiPart2 = new QHttpMultiPart();
+    imageMultiPart2->setContentType(QHttpMultiPart::FormDataType);
+    imageMultiPart2->append(textPart);
+    imageMultiPart2->append(imagePart21);
+    file21->setParent(imageMultiPart2);
+    QHttpPart imagePart22;
+    imagePart22.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart22.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage2\""));
+    QFile *file22 = new QFile(SRCDIR "/image2.jpg");
+    file22->open(QIODevice::ReadOnly);
+    imagePart22.setBodyDevice(file22);
+    imageMultiPart2->append(imagePart22);
+    file22->setParent(imageMultiPart2);
+    expectedData = "key: testImage1, value: 87ef3bb319b004ba9e5e9c9fa713776e\n"
+                   "key: text, value: 7 bytes\n"
+                   "key: testImage2, value: 483761b893f7fb1bd2414344cd1f3dfb\n";
+    QTest::newRow("text-image-image") << url << imageMultiPart2 << expectedData << QByteArray("form-data");
+
+
+    QHttpPart imagePart31;
+    imagePart31.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart31.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage1\""));
+    imagePart31.setRawHeader("Content-Location", "http://my.test.location.tld");
+    imagePart31.setRawHeader("Content-ID", "my@id.tld");
+    QFile *file31 = new QFile(SRCDIR "/image1.jpg");
+    file31->open(QIODevice::ReadOnly);
+    imagePart31.setBodyDevice(file31);
+    QHttpMultiPart *imageMultiPart3 = new QHttpMultiPart(QHttpMultiPart::FormDataType);
+    imageMultiPart3->append(imagePart31);
+    file31->setParent(imageMultiPart3);
+    QHttpPart imagePart32;
+    imagePart32.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart32.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage2\""));
+    QFile *file32 = new QFile(SRCDIR "/image2.jpg");
+    file32->open(QIODevice::ReadOnly);
+    imagePart32.setBodyDevice(file31); // check that resetting works
+    imagePart32.setBodyDevice(file32);
+    imageMultiPart3->append(imagePart32);
+    file32->setParent(imageMultiPart3);
+    QHttpPart imagePart33;
+    imagePart33.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart33.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage3\""));
+    QFile *file33 = new QFile(SRCDIR "/image3.jpg");
+    file33->open(QIODevice::ReadOnly);
+    imagePart33.setBodyDevice(file33);
+    imageMultiPart3->append(imagePart33);
+    file33->setParent(imageMultiPart3);
+    expectedData = "key: testImage1, value: 87ef3bb319b004ba9e5e9c9fa713776e\n"
+                   "key: testImage2, value: 483761b893f7fb1bd2414344cd1f3dfb\n"
+                   "key: testImage3, value: ab0eb6fd4fcf8b4436254870b4513033\n";
+    QTest::newRow("3-images") << url << imageMultiPart3 << expectedData << QByteArray("form-data");
+
+
+    // note: nesting multiparts is not working currently; for that, the outputDevice would need to be public
+
+//    QHttpPart imagePart41;
+//    imagePart41.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+//    QFile *file41 = new QFile(SRCDIR "/image1.jpg");
+//    file41->open(QIODevice::ReadOnly);
+//    imagePart41.setBodyDevice(file41);
+//
+//    QHttpMultiPart *innerMultiPart = new QHttpMultiPart();
+//    innerMultiPart->setContentType(QHttpMultiPart::FormDataType);
+//    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant());
+//    innerMultiPart->append(textPart);
+//    innerMultiPart->append(imagePart41);
+//    textPart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant());
+//    innerMultiPart->append(textPart2);
+//
+//    QHttpPart nestedPart;
+//    nestedPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"nestedMessage"));
+//    nestedPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/alternative; boundary=\"" + innerMultiPart->boundary() + "\""));
+//    innerMultiPart->outputDevice()->open(QIODevice::ReadOnly);
+//    nestedPart.setBodyDevice(innerMultiPart->outputDevice());
+//
+//    QHttpMultiPart *outerMultiPart = new QHttpMultiPart;
+//    outerMultiPart->setContentType(QHttpMultiPart::FormDataType);
+//    outerMultiPart->append(textPart);
+//    outerMultiPart->append(nestedPart);
+//    outerMultiPart->append(textPart2);
+//    expectedData = "nothing"; // the CGI.pm module running on the test server does not understand nested multiparts
+//    openFiles.clear();
+//    openFiles << file41;
+//    QTest::newRow("nested") << url << outerMultiPart << expectedData << openFiles;
+
+
+    // test setting large chunks of content with a byte array instead of a device (DISCOURAGED because of high memory consumption,
+    // but we need to test that the behavior is correct)
+    QHttpPart imagePart51;
+    imagePart51.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
+    imagePart51.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage\""));
+    QFile *file51 = new QFile(SRCDIR "/image1.jpg");
+    file51->open(QIODevice::ReadOnly);
+    QByteArray imageData = file51->readAll();
+    file51->close();
+    delete file51;
+    imagePart51.setBody("7 bytes"); // check that resetting works
+    imagePart51.setBody(imageData);
+    QHttpMultiPart *imageMultiPart5 = new QHttpMultiPart;
+    imageMultiPart5->setContentType(QHttpMultiPart::FormDataType);
+    imageMultiPart5->append(imagePart51);
+    expectedData = "key: testImage, value: 87ef3bb319b004ba9e5e9c9fa713776e\n"; // md5 sum of file
+    QTest::newRow("image-as-content") << url << imageMultiPart5 << expectedData << QByteArray("form-data");
+}
+
+void tst_QNetworkReply::postToHttpMultipart()
+{
+    QFETCH(QUrl, url);
+
+    static QSet<QByteArray> boundaries;
+
+    QNetworkRequest request(url);
+    QNetworkReplyPtr reply;
+
+    QFETCH(QHttpMultiPart *, multiPart);
+    QFETCH(QByteArray, expectedReplyData);
+    QFETCH(QByteArray, contentType);
+
+    // hack for testing the setting of the content-type header by hand:
+    if (contentType == "custom") {
+        QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + "\"");
+        request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
+    }
+
+    QVERIFY2(! boundaries.contains(multiPart->boundary()), "boundary '" + multiPart->boundary() + "' has been created twice");
+    boundaries.insert(multiPart->boundary());
+
+    RUN_REQUEST(runMultipartRequest(request, reply, multiPart, "POST"));
+    multiPart->deleteLater();
+
+    QCOMPARE(reply->url(), url);
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+    QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok
+
+    QVERIFY(multiPart->boundary().count() > 20); // check that there is randomness after the "boundary_.oOo._" string
+    QVERIFY(multiPart->boundary().count() < 70);
+    QByteArray replyData = reply->readAll();
+
+    expectedReplyData.prepend("content type: multipart/" + contentType + "; boundary=\"" + multiPart->boundary() + "\"\n");
+//    QEXPECT_FAIL("nested", "the server does not understand nested multipart messages", Continue); // see above
+    QCOMPARE(replyData, expectedReplyData);
+}
+
+void tst_QNetworkReply::putToHttpMultipart_data()
+{
+    postToHttpMultipart_data();
+}
+
+void tst_QNetworkReply::putToHttpMultipart()
+{
+    QSKIP("test server script cannot handle PUT data yet", SkipAll);
+    QFETCH(QUrl, url);
+
+    static QSet<QByteArray> boundaries;
+
+    QNetworkRequest request(url);
+    QNetworkReplyPtr reply;
+
+    QFETCH(QHttpMultiPart *, multiPart);
+    QFETCH(QByteArray, expectedReplyData);
+    QFETCH(QByteArray, contentType);
+
+    // hack for testing the setting of the content-type header by hand:
+    if (contentType == "custom") {
+        QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + "\"");
+        request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
+    }
+
+    QVERIFY2(! boundaries.contains(multiPart->boundary()), "boundary '" + multiPart->boundary() + "' has been created twice");
+    boundaries.insert(multiPart->boundary());
+
+    RUN_REQUEST(runMultipartRequest(request, reply, multiPart, "PUT"));
+    multiPart->deleteLater();
+
+    QCOMPARE(reply->url(), url);
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+    QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok
+
+    QVERIFY(multiPart->boundary().count() > 20); // check that there is randomness after the "boundary_.oOo._" string
+    QVERIFY(multiPart->boundary().count() < 70);
+    QByteArray replyData = reply->readAll();
+
+    expectedReplyData.prepend("content type: multipart/" + contentType + "; boundary=\"" + multiPart->boundary() + "\"\n");
+//    QEXPECT_FAIL("nested", "the server does not understand nested multipart messages", Continue); // see above
+    QCOMPARE(replyData, expectedReplyData);
+}
+
 void tst_QNetworkReply::deleteFromHttp_data()
 {
     QTest::addColumn<QUrl>("url");
-- 
cgit v0.12


From 7627d9d5316430e01a7ecb1d20d3a56b4b4c740a Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Tue, 22 Mar 2011 17:36:29 +0100
Subject: qmake vcxproj generator: fix non flat projects for VS2010

The filters for files in the non flat projects will start with the
base filter name and then the path to the file. So the detection of
the filter needs to be done by the start of the filter namse so that
we correctly add the compile commands for the added files.

Task-number: QTBUG-13928
Reviewed-by: Joerg Bornemann
---
 qmake/generators/win32/msbuild_objectmodel.cpp | 34 +++++++++++++-------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index 9fd5fa9..d4d2400 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -1670,21 +1670,21 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
     for (int i = 0; i < project.SingleProjects.count(); ++i) {
         VCFilter filter;
         const VCProjectSingleConfig &singleCfg = project.SingleProjects.at(i);
-        if (filtername == "Root Files") {
+        if (filtername.startsWith("Root Files")) {
             filter = singleCfg.RootFiles;
-        } else if (filtername == "Source Files") {
+        } else if (filtername.startsWith("Source Files")) {
             filter = singleCfg.SourceFiles;
-        } else if (filtername == "Header Files") {
+        } else if (filtername.startsWith("Header Files")) {
             filter = singleCfg.HeaderFiles;
-        } else if (filtername == "Generated Files") {
+        } else if (filtername.startsWith("Generated Files")) {
             filter = singleCfg.GeneratedFiles;
-        } else if (filtername == "LexYacc Files") {
+        } else if (filtername.startsWith("LexYacc Files")) {
             filter = singleCfg.LexYaccFiles;
-        } else if (filtername == "Translation Files") {
+        } else if (filtername.startsWith("Translation Files")) {
             filter = singleCfg.TranslationFiles;
-        } else if (filtername == "Form Files") {
+        } else if (filtername.startsWith("Form Files")) {
             filter = singleCfg.FormFiles;
-        } else if (filtername == "Resource Files") {
+        } else if (filtername.startsWith("Resource Files")) {
             filter = singleCfg.ResourceFiles;
         } else {
             // ExtraCompilers
@@ -1698,7 +1698,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
 
     if ( !fileAdded )
     {
-        if (filtername == "Source Files") {
+        if (filtername.startsWith("Source Files")) {
 
             xmlFilter << tag("ClCompile")
                       << attrTag("Include",Option::fixPathToLocalOS(info.file))
@@ -1707,7 +1707,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
             xml << tag("ClCompile")
                 << attrTag("Include",Option::fixPathToLocalOS(info.file));
 
-        } else if(filtername == "Header Files") {
+        } else if(filtername.startsWith("Header Files")) {
 
             xmlFilter << tag("ClInclude")
                 << attrTag("Include",Option::fixPathToLocalOS(info.file))
@@ -1715,7 +1715,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
 
             xml << tag("ClInclude")
                 << attrTag("Include",Option::fixPathToLocalOS(info.file));
-        } else if(filtername == "Generated Files" || filtername == "Form Files") {
+        } else if(filtername.startsWith("Generated Files") || filtername.startsWith("Form Files")) {
 
             if (info.file.endsWith(".h")) {
 
@@ -1751,7 +1751,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
                     << attrTag("Include",Option::fixPathToLocalOS(info.file));
             }
 
-        } else if(filtername == "Root Files") {
+        } else if(filtername.startsWith("Root Files")) {
 
             if (info.file.endsWith(".rc")) {
 
@@ -1831,7 +1831,7 @@ bool VCXProjectWriter::outputFileConfig(VCFilter &filter, XmlOutput &xml, XmlOut
                 xml << tag("CustomBuild")
                     << attrTag("Include",Option::fixPathToLocalOS(filename));
 
-                if ( filtername == "Form Files" || filtername == "Generated Files" || filtername == "Resource Files" )
+                if ( filtername.startsWith("Form Files") || filtername.startsWith("Generated Files") || filtername.startsWith("Resource Files") )
                     xml << attrTagS("FileType", "Document");
             }
 
@@ -1842,7 +1842,7 @@ bool VCXProjectWriter::outputFileConfig(VCFilter &filter, XmlOutput &xml, XmlOut
         {
             fileAdded = true;
 
-            if (filtername == "Source Files") {
+            if (filtername.startsWith("Source Files")) {
 
                 xmlFilter << tag("ClCompile")
                           << attrTag("Include",Option::fixPathToLocalOS(filename))
@@ -1851,7 +1851,7 @@ bool VCXProjectWriter::outputFileConfig(VCFilter &filter, XmlOutput &xml, XmlOut
                 xml << tag("ClCompile")
                     << attrTag("Include",Option::fixPathToLocalOS(filename));
 
-            } else if(filtername == "Header Files") {
+            } else if(filtername.startsWith("Header Files")) {
 
                 xmlFilter << tag("ClInclude")
                     << attrTag("Include",Option::fixPathToLocalOS(filename))
@@ -1859,7 +1859,7 @@ bool VCXProjectWriter::outputFileConfig(VCFilter &filter, XmlOutput &xml, XmlOut
 
                 xml << tag("ClInclude")
                     << attrTag("Include",Option::fixPathToLocalOS(filename));
-            } else if(filtername == "Generated Files" || filtername == "Form Files") {
+            } else if(filtername.startsWith("Generated Files") || filtername.startsWith("Form Files")) {
 
                 if (filename.endsWith(".h")) {
 
@@ -1894,7 +1894,7 @@ bool VCXProjectWriter::outputFileConfig(VCFilter &filter, XmlOutput &xml, XmlOut
                     xml << tag("CustomBuild")
                         << attrTag("Include",Option::fixPathToLocalOS(filename));
                 }
-            } else if(filtername == "Root Files") {
+            } else if(filtername.startsWith("Root Files")) {
 
                 if (filename.endsWith(".rc")) {
 
-- 
cgit v0.12


From e5a6de534226ac0829384f9a232abb44149bcb68 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 23 Mar 2011 09:27:11 +0100
Subject: Remove the qdeclarativewebview autotest.

This does not belongs inside Qt, but inside the webkit repository.

Acknowledged-by: Alan Alpert and Andreas Kling
---
 tests/auto/declarative/declarative.pro             |   5 -
 .../qdeclarativewebview/data/basic.html            |  17 -
 .../declarative/qdeclarativewebview/data/basic.ico | Bin 318 -> 0 bytes
 .../declarative/qdeclarativewebview/data/basic.png | Bin 3961 -> 0 bytes
 .../declarative/qdeclarativewebview/data/basic.qml |   6 -
 .../qdeclarativewebview/data/elements.html         |  14 -
 .../qdeclarativewebview/data/elements.qml          |   8 -
 .../qdeclarativewebview/data/forward.html          |  12 -
 .../qdeclarativewebview/data/forward.png           | Bin 2377 -> 0 bytes
 .../qdeclarativewebview/data/javaScript.html       |  11 -
 .../qdeclarativewebview/data/javaScript.qml        |  12 -
 .../qdeclarativewebview/data/loadError.qml         |   6 -
 .../qdeclarativewebview/data/newwindows.html       |  16 -
 .../qdeclarativewebview/data/newwindows.qml        |  34 --
 .../qdeclarativewebview/data/pixelCache.html       |  10 -
 .../qdeclarativewebview/data/pixelCache.qml        |   6 -
 .../qdeclarativewebview/data/propertychanges.qml   |  34 --
 .../qdeclarativewebview/data/sethtml.qml           |   6 -
 .../qdeclarativewebview/qdeclarativewebview.pro    |  16 -
 .../tst_qdeclarativewebview.cpp                    | 520 ---------------------
 20 files changed, 733 deletions(-)
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/basic.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/basic.ico
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/basic.png
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/basic.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/elements.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/elements.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/forward.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/forward.png
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/javaScript.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/javaScript.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/loadError.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/newwindows.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/newwindows.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/pixelCache.html
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/pixelCache.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/propertychanges.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/data/sethtml.qml
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
 delete mode 100644 tests/auto/declarative/qdeclarativewebview/tst_qdeclarativewebview.cpp

diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index 08f0b9e..98e15e8 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -76,11 +76,6 @@ contains(QT_CONFIG, private_tests) {
            qdeclarativeworkerscript \
            qdeclarativexmllistmodel \
            qpacketprotocol
-
-contains(QT_CONFIG, webkit) {
-    SUBDIRS += \
-           qdeclarativewebview
-}
 }
 
 # Tests which should run in Pulse
diff --git a/tests/auto/declarative/qdeclarativewebview/data/basic.html b/tests/auto/declarative/qdeclarativewebview/data/basic.html
deleted file mode 100644
index 22e3e24..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/basic.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-<head><title>Basic</title>
-<link rel="icon" sizes="48x48" href="basic.png">
-<script type="text/javascript">
-<!--
-window.onload = function(){ window.status = "status here"; }
-// -->
-</script>
-</head>
-<body leftmargin="0" marginwidth="0">
-<table width="123">
-<tbody>
-<tr><td>This is a basic test.</td></tr>
-</tbody>
-</table>
-</body>
-</html>
diff --git a/tests/auto/declarative/qdeclarativewebview/data/basic.ico b/tests/auto/declarative/qdeclarativewebview/data/basic.ico
deleted file mode 100644
index 8f3d05e..0000000
Binary files a/tests/auto/declarative/qdeclarativewebview/data/basic.ico and /dev/null differ
diff --git a/tests/auto/declarative/qdeclarativewebview/data/basic.png b/tests/auto/declarative/qdeclarativewebview/data/basic.png
deleted file mode 100644
index 35717cc..0000000
Binary files a/tests/auto/declarative/qdeclarativewebview/data/basic.png and /dev/null differ
diff --git a/tests/auto/declarative/qdeclarativewebview/data/basic.qml b/tests/auto/declarative/qdeclarativewebview/data/basic.qml
deleted file mode 100644
index 73330cd..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/basic.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-WebView {
-    url: "basic.html"
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/elements.html b/tests/auto/declarative/qdeclarativewebview/data/elements.html
deleted file mode 100644
index 9236867..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/elements.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<body leftmargin=0 topmargin=0>
-<table width="300px" border=1 cellpadding=0 cellspacing=0>
-<tr>
-<td align=center width=25%%><p>A</p></td>
-<td width=75% height=50px>
-    <table width=100% border=1 cellpadding=0 cellspacing=0>
-    <tr>
-    <td align=center width=50% height=50px><p>B</p></td>
-    <td align=center width=50% height=50px><p>C</p></td>
-    </tr>
-    </table>
-</td>
-</tr>
-</table>
diff --git a/tests/auto/declarative/qdeclarativewebview/data/elements.qml b/tests/auto/declarative/qdeclarativewebview/data/elements.qml
deleted file mode 100644
index b86dd9d..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/elements.qml
+++ /dev/null
@@ -1,8 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-WebView {
-    url: "elements.html"
-    width: 310
-    height: 100
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/forward.html b/tests/auto/declarative/qdeclarativewebview/data/forward.html
deleted file mode 100644
index 62ab62d..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/forward.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<html>
-<head><title>Forward</title>
-<link rel="icon" sizes="32x32" href="forward.png">
-</head>
-<body leftmargin="0" marginwidth="0">
-<table width="123">
-<tbody>
-<tr><td>This is more.</td></tr>
-</tbody>
-</table>
-</body>
-</html>
diff --git a/tests/auto/declarative/qdeclarativewebview/data/forward.png b/tests/auto/declarative/qdeclarativewebview/data/forward.png
deleted file mode 100644
index a82533e..0000000
Binary files a/tests/auto/declarative/qdeclarativewebview/data/forward.png and /dev/null differ
diff --git a/tests/auto/declarative/qdeclarativewebview/data/javaScript.html b/tests/auto/declarative/qdeclarativewebview/data/javaScript.html
deleted file mode 100644
index 35270bc..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/javaScript.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<html>
-<head><title>JavaScript</title>
-<link rel="icon" sizes="48x48" href="basic.png">
-<script type="text/javascript">
-<!--
-window.onload = function(){ window.status = "status here"; }
-// -->
-</script>
-</head>
-<body>
-This is a JS test.
diff --git a/tests/auto/declarative/qdeclarativewebview/data/javaScript.qml b/tests/auto/declarative/qdeclarativewebview/data/javaScript.qml
deleted file mode 100644
index 527e3b9..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/javaScript.qml
+++ /dev/null
@@ -1,12 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-WebView {
-    url: "javaScript.html"
-    javaScriptWindowObjects: [
-        QtObject {
-            property string qmlprop: "qmlvalue"
-            WebView.windowObjectName: "myjsname"
-        }
-    ]
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/loadError.qml b/tests/auto/declarative/qdeclarativewebview/data/loadError.qml
deleted file mode 100644
index baab1a0..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/loadError.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-WebView {
-    url: "does-not-exist.html"
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/newwindows.html b/tests/auto/declarative/qdeclarativewebview/data/newwindows.html
deleted file mode 100644
index dd541f9..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/newwindows.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<html>
-<head>
-<script type="text/javascript">
-<!--
-function clickTheLink()
-{
-    var ev = document.createEvent('MouseEvents');
-    ev.initEvent( "click", true, false );
-    document.getElementById('thelink').dispatchEvent(ev);
-}
-// -->
-</script>
-</head>
-<h1>Multiple windows...</h1>
-
-<a id=thelink target="_blank" href="newwindows.html">Popup!</a>
diff --git a/tests/auto/declarative/qdeclarativewebview/data/newwindows.qml b/tests/auto/declarative/qdeclarativewebview/data/newwindows.qml
deleted file mode 100644
index e66631d..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/newwindows.qml
+++ /dev/null
@@ -1,34 +0,0 @@
-// Demonstrates opening new WebViews from HTML
-
-import QtQuick 1.0
-import QtWebKit 1.0
-
-Grid {
-    columns: 3
-    id: pages
-    height: 300; width: 600
-    property int total: 0
-
-    Component {
-        id: webViewPage
-        Rectangle {
-            width: webView.width
-            height: webView.height
-            border.color: "gray"
-
-            WebView {
-                id: webView
-                width: 150 // force predictable for test
-                newWindowComponent: webViewPage
-                newWindowParent: pages
-                url: "newwindows.html"
-                Timer {
-                    interval: 10; running: total<4; repeat: false;
-                    onTriggered: { if (webView.status==WebView.Ready) { total++; webView.evaluateJavaScript("clickTheLink()") } }
-                }
-            }
-        }
-    }
-
-    Loader { sourceComponent: webViewPage }
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/pixelCache.html b/tests/auto/declarative/qdeclarativewebview/data/pixelCache.html
deleted file mode 100644
index 9412674..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/pixelCache.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
-<body topmargin=0 leftmargin=0>
-<table width=120 cellpadding=0 cellspacing=0>
-<tr><td>
-<h1>Pixel Cache</h1>
-This test is for the pixel cache. Because this is a long document,
-as it scrolls, more of the document will need to be rendered.
-If the pixelCacheSize is small, the first parts of the document will
-no longer be in the cache when it returns.
-</table>
diff --git a/tests/auto/declarative/qdeclarativewebview/data/pixelCache.qml b/tests/auto/declarative/qdeclarativewebview/data/pixelCache.qml
deleted file mode 100644
index 08e4d65..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/pixelCache.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import Test 1.0
-
-MyWebView {
-    anchors.fill: parent
-    url: "pixelCache.html"
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/propertychanges.qml b/tests/auto/declarative/qdeclarativewebview/data/propertychanges.qml
deleted file mode 100644
index db06887..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/propertychanges.qml
+++ /dev/null
@@ -1,34 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-Item {
-    width: 240
-    height: 160
-    Grid {
-        anchors.fill: parent
-        objectName: "newWindowParent"
-        id: newWindowParent
-    }
-
-    Row {
-        anchors.fill: parent
-        id: oldWindowParent
-        objectName: "oldWindowParent"
-    }
-
-    Loader {
-        sourceComponent: webViewComponent
-    }
-    Component {
-            id: webViewComponent
-            WebView {
-                id: webView
-                objectName: "webView"
-                newWindowComponent: webViewComponent
-                newWindowParent: oldWindowParent         
-                url: "basic.html"
-                renderingEnabled: true
-                pressGrabTime: 200
-            }
-    }
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/data/sethtml.qml b/tests/auto/declarative/qdeclarativewebview/data/sethtml.qml
deleted file mode 100644
index 7889704..0000000
--- a/tests/auto/declarative/qdeclarativewebview/data/sethtml.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import QtQuick 1.0
-import QtWebKit 1.0
-
-WebView {
-    html: "<p>This is a <b>string</b> set on the WebView"
-}
diff --git a/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro b/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
deleted file mode 100644
index af13d33..0000000
--- a/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-load(qttest_p4)
-contains(QT_CONFIG,declarative): QT += declarative
-contains(QT_CONFIG,webkit): QT += webkit
-macx:CONFIG -= app_bundle
-
-SOURCES += tst_qdeclarativewebview.cpp
-
-symbian: {
-    importFiles.files = data
-    importFiles.path = .
-    DEPLOYMENT += importFiles
-} else {
-    DEFINES += SRCDIR=\\\"$$PWD\\\"
-}
-
-CONFIG += parallel_test
diff --git a/tests/auto/declarative/qdeclarativewebview/tst_qdeclarativewebview.cpp b/tests/auto/declarative/qdeclarativewebview/tst_qdeclarativewebview.cpp
deleted file mode 100644
index 9f99e83..0000000
--- a/tests/auto/declarative/qdeclarativewebview/tst_qdeclarativewebview.cpp
+++ /dev/null
@@ -1,520 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <qtest.h>
-#include <QtTest/QSignalSpy>
-#include "../../../shared/util.h"
-#include <QtDeclarative/qdeclarativeengine.h>
-#include <QtDeclarative/qdeclarativecomponent.h>
-#include <private/qdeclarativepositioners_p.h>
-#include <QtWebKit/qwebpage.h>
-#include <QtWebKit/qwebframe.h>
-#include <QtCore/qdir.h>
-#include <QtCore/qfile.h>
-#include <QtGui/qpainter.h>
-
-#ifdef Q_OS_SYMBIAN
-// In Symbian OS test data is located in applications private dir
-#define SRCDIR "."
-#endif
-
-class tst_qdeclarativewebview : public QObject
-{
-    Q_OBJECT
-public:
-    tst_qdeclarativewebview() {}
-
-private slots:
-    void initTestCase();
-    void basicProperties();
-    void settings();
-    void historyNav();
-    void multipleWindows();
-    void elementAreaAt();
-    void loadError();
-    void setHtml();
-    void javaScript();
-    void cleanupTestCase();
-    //void pixelCache();
-    void newWindowParent();
-    void newWindowComponent();
-    void renderingEnabled();
-    void pressGrabTime();
-
-private:
-    void checkNoErrors(const QDeclarativeComponent& component);
-    QDeclarativeEngine engine;
-    QString tmpDir() const
-    {
-        static QString tmpd = QDir::tempPath()+"/tst_qdeclarativewebview-"
-            + QDateTime::currentDateTime().toString(QLatin1String("yyyyMMddhhmmss"));
-        return tmpd;
-    }
-};
-
-void tst_qdeclarativewebview::initTestCase()
-{
-}
-
-static QString strippedHtml(QString html)
-{
-    html.replace(QRegExp("\\s+"),"");
-    return html;
-}
-
-static QString fileContents(const QString& filename)
-{
-    QFile file(filename);
-    file.open(QIODevice::ReadOnly);
-    return QString::fromUtf8(file.readAll());
-}
-
-
-static void removeRecursive(const QString& dirname)
-{
-    QDir dir(dirname);
-    QFileInfoList entries(dir.entryInfoList(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot));
-    for (int i = 0; i < entries.count(); ++i)
-        if (entries[i].isDir())
-            removeRecursive(entries[i].filePath());
-        else
-            dir.remove(entries[i].fileName());
-    QDir().rmdir(dirname);
-}
-
-void tst_qdeclarativewebview::cleanupTestCase()
-{
-    removeRecursive(tmpDir());
-}
-
-void tst_qdeclarativewebview::checkNoErrors(const QDeclarativeComponent& component)
-{
-    // Wait until the component is ready
-    QTRY_VERIFY(component.isReady() || component.isError());
-
-    if (component.isError()) {
-        QList<QDeclarativeError> errors = component.errors();
-        for (int ii = 0; ii < errors.count(); ++ii) {
-            const QDeclarativeError &error = errors.at(ii);
-            QByteArray errorStr = QByteArray::number(error.line()) + ":" +
-                                  QByteArray::number(error.column()) + ":" +
-                                  error.description().toUtf8();
-            qWarning() << errorStr;
-        }
-    }
-    QVERIFY(!component.isError());
-}
-
-void tst_qdeclarativewebview::basicProperties()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/basic.qml"));
-    checkNoErrors(component);
-    QWebSettings::enablePersistentStorage(tmpDir());
-
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-    QCOMPARE(wv->property("title").toString(),QString("Basic"));
-    QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 48);
-    QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")),QPixmap(SRCDIR "/data/basic.png"));
-    QCOMPARE(wv->property("statusText").toString(),QString("status here"));
-    QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/basic.html")), strippedHtml(wv->property("html").toString()));
-    QCOMPARE(wv->property("preferredWidth").toInt(), 0);
-    QCOMPARE(wv->property("preferredHeight").toInt(), 0);
-    QCOMPARE(wv->property("url").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/basic.html"));
-    QCOMPARE(wv->property("status").toInt(), 1 /*QDeclarativeWebView::Ready*/);
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload")));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("back")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("back"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("forward")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("forward"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("stop")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("stop"))->isEnabled());
-
-    wv->setProperty("pixelCacheSize", 0); // mainly testing that it doesn't crash or anything!
-    QCOMPARE(wv->property("pixelCacheSize").toInt(),0);
-    qvariant_cast<QAction*>(wv->property("reload"))->trigger();
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-}
-
-void tst_qdeclarativewebview::settings()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/basic.qml"));
-    checkNoErrors(component);
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-
-    QObject *s = QDeclarativeProperty(wv,"settings").object();
-    QVERIFY(s != 0);
-
-    // merely tests that setting gets stored (in QWebSettings)
-    // behavioural tests are in WebKit.
-    for (int b=0; b<=1; ++b) {
-        bool on = !!b;
-
-        s->setProperty("autoLoadImages", on);
-        s->setProperty("developerExtrasEnabled", on);
-        s->setProperty("javaEnabled", on);
-        s->setProperty("javascriptCanAccessClipboard", on);
-        s->setProperty("javascriptCanOpenWindows", on);
-        s->setProperty("javascriptEnabled", on);
-        s->setProperty("linksIncludedInFocusChain", on);
-        s->setProperty("localContentCanAccessRemoteUrls", on);
-        s->setProperty("localStorageDatabaseEnabled", on);
-        s->setProperty("offlineStorageDatabaseEnabled", on);
-        s->setProperty("offlineWebApplicationCacheEnabled", on);
-        s->setProperty("pluginsEnabled", on);
-        s->setProperty("printElementBackgrounds", on);
-        s->setProperty("privateBrowsingEnabled", on);
-        s->setProperty("zoomTextOnly", on);
-
-        QVERIFY(s->property("autoLoadImages") == on);
-        QVERIFY(s->property("developerExtrasEnabled") == on);
-        QVERIFY(s->property("javaEnabled") == on);
-        QVERIFY(s->property("javascriptCanAccessClipboard") == on);
-        QVERIFY(s->property("javascriptCanOpenWindows") == on);
-        QVERIFY(s->property("javascriptEnabled") == on);
-        QVERIFY(s->property("linksIncludedInFocusChain") == on);
-        QVERIFY(s->property("localContentCanAccessRemoteUrls") == on);
-        QVERIFY(s->property("localStorageDatabaseEnabled") == on);
-        QVERIFY(s->property("offlineStorageDatabaseEnabled") == on);
-        QVERIFY(s->property("offlineWebApplicationCacheEnabled") == on);
-        QVERIFY(s->property("pluginsEnabled") == on);
-        QVERIFY(s->property("printElementBackgrounds") == on);
-        QVERIFY(s->property("privateBrowsingEnabled") == on);
-        QVERIFY(s->property("zoomTextOnly") == on);
-
-        QVERIFY(s->property("autoLoadImages") == on);
-        QVERIFY(s->property("developerExtrasEnabled") == on);
-        QVERIFY(s->property("javaEnabled") == on);
-        QVERIFY(s->property("javascriptCanAccessClipboard") == on);
-        QVERIFY(s->property("javascriptCanOpenWindows") == on);
-        QVERIFY(s->property("javascriptEnabled") == on);
-        QVERIFY(s->property("linksIncludedInFocusChain") == on);
-        QVERIFY(s->property("localContentCanAccessRemoteUrls") == on);
-        QVERIFY(s->property("localStorageDatabaseEnabled") == on);
-        QVERIFY(s->property("offlineStorageDatabaseEnabled") == on);
-        QVERIFY(s->property("offlineWebApplicationCacheEnabled") == on);
-        QVERIFY(s->property("pluginsEnabled") == on);
-        QVERIFY(s->property("printElementBackgrounds") == on);
-        QVERIFY(s->property("privateBrowsingEnabled") == on);
-        QVERIFY(s->property("zoomTextOnly") == on);
-    }
-}
-
-void tst_qdeclarativewebview::historyNav()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/basic.qml"));
-    checkNoErrors(component);
-    QWebSettings::enablePersistentStorage(tmpDir());
-
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    for (int i=1; i<=2; ++i) {
-        QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-        QCOMPARE(wv->property("title").toString(),QString("Basic"));
-        QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 48);
-        QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")),QPixmap(SRCDIR "/data/basic.png"));
-        QCOMPARE(wv->property("statusText").toString(),QString("status here"));
-        QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/basic.html")), strippedHtml(wv->property("html").toString()));
-        QCOMPARE(wv->property("preferredWidth").toDouble(), 0.0);
-        QCOMPARE(wv->property("url").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/basic.html"));
-        QCOMPARE(wv->property("status").toInt(), 1 /*QDeclarativeWebView::Ready*/);
-        QVERIFY(qvariant_cast<QAction*>(wv->property("reload")));
-        QVERIFY(qvariant_cast<QAction*>(wv->property("reload"))->isEnabled());
-        QVERIFY(qvariant_cast<QAction*>(wv->property("back")));
-        QVERIFY(!qvariant_cast<QAction*>(wv->property("back"))->isEnabled());
-        QVERIFY(qvariant_cast<QAction*>(wv->property("forward")));
-        QVERIFY(!qvariant_cast<QAction*>(wv->property("forward"))->isEnabled());
-        QVERIFY(qvariant_cast<QAction*>(wv->property("stop")));
-        QVERIFY(!qvariant_cast<QAction*>(wv->property("stop"))->isEnabled());
-
-        qvariant_cast<QAction*>(wv->property("reload"))->trigger();
-    }
-
-    wv->setProperty("url", QUrl::fromLocalFile(SRCDIR "/data/forward.html"));
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-    QCOMPARE(wv->property("title").toString(),QString("Forward"));
-    QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 32);
-    QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")),QPixmap(SRCDIR "/data/forward.png"));
-    QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/forward.html")), strippedHtml(wv->property("html").toString()));
-    QCOMPARE(wv->property("url").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/forward.html"));
-    QCOMPARE(wv->property("status").toInt(), 1 /*QDeclarativeWebView::Ready*/);
-    QCOMPARE(wv->property("statusText").toString(),QString(""));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload")));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("back")));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("back"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("forward")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("forward"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("stop")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("stop"))->isEnabled());
-
-    qvariant_cast<QAction*>(wv->property("back"))->trigger();
-
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-    QCOMPARE(wv->property("title").toString(),QString("Basic"));
-    QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/basic.html")), strippedHtml(wv->property("html").toString()));
-    QCOMPARE(wv->property("url").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/basic.html"));
-    QCOMPARE(wv->property("status").toInt(), 1 /*QDeclarativeWebView::Ready*/);
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload")));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("reload"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("back")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("back"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("forward")));
-    QVERIFY(qvariant_cast<QAction*>(wv->property("forward"))->isEnabled());
-    QVERIFY(qvariant_cast<QAction*>(wv->property("stop")));
-    QVERIFY(!qvariant_cast<QAction*>(wv->property("stop"))->isEnabled());
-}
-
-void tst_qdeclarativewebview::multipleWindows()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/newwindows.qml"));
-    checkNoErrors(component);
-
-    QDeclarativeGrid *grid = qobject_cast<QDeclarativeGrid*>(component.create());
-    QVERIFY(grid != 0);
-    QTRY_COMPARE(grid->children().count(), 2+4); // Component, Loader (with 1 WebView), 4 new-window WebViews
-    QDeclarativeItem* popup = qobject_cast<QDeclarativeItem*>(grid->children().at(2)); // first popup after Component and Loader.
-    QVERIFY(popup != 0);
-    QTRY_COMPARE(popup->x(), 150.0);
-}
-
-void tst_qdeclarativewebview::loadError()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/loadError.qml"));
-    checkNoErrors(component);
-    QWebSettings::enablePersistentStorage(tmpDir());
-
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    for (int i=1; i<=2; ++i) {
-        QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-        QCOMPARE(wv->property("title").toString(),QString(""));
-        QCOMPARE(wv->property("statusText").toString(),QString("")); // HTML 'status bar' text, not error message
-        QCOMPARE(wv->property("url").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/does-not-exist.html")); // Unlike QWebPage, which loses url
-        QCOMPARE(wv->property("status").toInt(), 3 /*QDeclarativeWebView::Error*/);
-
-        qvariant_cast<QAction*>(wv->property("reload"))->trigger();
-    }
-}
-
-void tst_qdeclarativewebview::setHtml()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/sethtml.qml"));
-    checkNoErrors(component);
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    QCOMPARE(wv->property("html").toString(),QString("<html><head></head><body><p>This is a <b>string</b> set on the WebView</p></body></html>"));
-
-    QSignalSpy spy(wv, SIGNAL(htmlChanged()));
-    wv->setProperty("html", QString("<html><head><title>Basic</title></head><body><p>text</p></body></html>"));
-    QCOMPARE(spy.count(),1);
-}
-
-void tst_qdeclarativewebview::elementAreaAt()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/elements.qml"));
-    checkNoErrors(component);
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-
-    /* not now it's a plugin...
-    QCOMPARE(wv->elementAreaAt(40,30,100,100),QRect(1,1,75,54)); // Area A in data/elements.html
-    QCOMPARE(wv->elementAreaAt(130,30,200,100),QRect(78,3,110,50)); // Area B
-    QCOMPARE(wv->elementAreaAt(40,30,400,400),QRect(0,0,310,100)); // Whole view
-    QCOMPARE(wv->elementAreaAt(130,30,280,280),QRect(76,1,223,54)); // Area BC
-    QCOMPARE(wv->elementAreaAt(130,30,400,400),QRect(0,0,310,100)); // Whole view
-    */
-}
-
-void tst_qdeclarativewebview::javaScript()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/javaScript.qml"));
-    checkNoErrors(component);
-    QObject *wv = component.create();
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-    /* not now it's a plugin...
-    QCOMPARE(wv->evaluateJavaScript("123").toInt(), 123);
-    QCOMPARE(wv->evaluateJavaScript("window.status").toString(), QString("status here"));
-    QCOMPARE(wv->evaluateJavaScript("window.myjsname.qmlprop").toString(), QString("qmlvalue"));
-    */
-}
-
-/*
-Cannot be done now that webkit is a plugin
-
-void tst_qdeclarativewebview::pixelCache()
-{
-
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/pixelCache.qml"));
-    checkNoErrors(component);
-    MyWebView *wv = qobject_cast<MyWebView*>(component.create());
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress"), 1.0);
-    QPixmap pm(150,150);
-    QPainter p(&pm);
-    wv->paint(&p,0,0);
-    const int expected = 120*(150+128); // 120 = width of HTML page, 150=pixmap height, 128=cache extra area
-    QCOMPARE(wv->property("pixelsPainted"), expected);
-    wv->paint(&p,0,0);
-    QCOMPARE(wv->property("pixelsPainted"), expected); // nothing new needed to be painted
-    wv->setProperty("pixelCacheSize", 0); // clears the cache
-    wv->paint(&p,0,0);
-    QCOMPARE(wv->property("pixelsPainted"), expected*2); // everything needed to be painted
-    // Note that painted things always go into the cache (even if they don't "fit"),
-    // just that they will be removed if anything else needs to be painted.
-    wv->setProperty("pixelCacheSize", expected); // won't clear the cache
-    wv->paint(&p,0,0);
-    QCOMPARE(wv->property("pixelsPainted"), expected*2); // still there
-    wv->setProperty("pixelCacheSize", expected-1); // too small - will clear the cache
-    wv->paint(&p,0,0);
-    QCOMPARE(wv->property("pixelsPainted"), expected*3); // repainted
-}
-*/
-
-void tst_qdeclarativewebview::newWindowParent()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
-    checkNoErrors(component);
-    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(component.create());
-    QObject *wv = rootItem->findChild<QObject*>("webView");
-    QVERIFY(rootItem != 0);
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-
-    QDeclarativeItem* oldWindowParent = rootItem->findChild<QDeclarativeItem*>("oldWindowParent");
-    QCOMPARE(qvariant_cast<QDeclarativeItem*>(wv->property("newWindowParent")), oldWindowParent);
-    QSignalSpy newWindowParentSpy(wv, SIGNAL(newWindowParentChanged()));
-
-    QDeclarativeItem* newWindowParent = rootItem->findChild<QDeclarativeItem*>("newWindowParent");
-    wv->setProperty("newWindowParent", QVariant::fromValue(newWindowParent));
-    QVERIFY(newWindowParent);
-    QVERIFY(oldWindowParent);
-    QVERIFY(oldWindowParent->childItems().count() == 0);
-    QCOMPARE(wv->property("newWindowParent"), QVariant::fromValue(newWindowParent));
-    QCOMPARE(newWindowParentSpy.count(),1);
-
-    wv->setProperty("newWindowParent", QVariant::fromValue(newWindowParent));
-    QCOMPARE(newWindowParentSpy.count(),1);
-
-    wv->setProperty("newWindowParent", QVariant::fromValue((QDeclarativeItem*)0));
-    QCOMPARE(newWindowParentSpy.count(),2);
-}
-
-void tst_qdeclarativewebview::newWindowComponent()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
-    checkNoErrors(component);
-    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(component.create());
-    QObject *wv = rootItem->findChild<QObject*>("webView");
-    QVERIFY(rootItem != 0);
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-
-    QDeclarativeComponent substituteComponent(&engine);
-    substituteComponent.setData("import QtQuick 1.0; WebView { objectName: 'newWebView'; url: 'basic.html'; }", QUrl::fromLocalFile(""));
-    QSignalSpy newWindowComponentSpy(wv, SIGNAL(newWindowComponentChanged()));
-
-    wv->setProperty("newWindowComponent", QVariant::fromValue(&substituteComponent));
-    QCOMPARE(wv->property("newWindowComponent"), QVariant::fromValue(&substituteComponent));
-    QCOMPARE(newWindowComponentSpy.count(),1);
-
-    wv->setProperty("newWindowComponent", QVariant::fromValue(&substituteComponent));
-    QCOMPARE(newWindowComponentSpy.count(),1);
-
-    wv->setProperty("newWindowComponent", QVariant::fromValue((QDeclarativeComponent*)0));
-    QCOMPARE(newWindowComponentSpy.count(),2);
-}
-
-void tst_qdeclarativewebview::renderingEnabled()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
-    checkNoErrors(component);
-    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(component.create());
-    QObject *wv = rootItem->findChild<QObject*>("webView");
-    QVERIFY(rootItem != 0);
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-
-    QVERIFY(wv->property("renderingEnabled").toBool());
-    QSignalSpy renderingEnabledSpy(wv, SIGNAL(renderingEnabledChanged()));
-
-    wv->setProperty("renderingEnabled", false);
-    QVERIFY(!wv->property("renderingEnabled").toBool());
-    QCOMPARE(renderingEnabledSpy.count(),1);
-
-    wv->setProperty("renderingEnabled", false);
-    QCOMPARE(renderingEnabledSpy.count(),1);
-
-    wv->setProperty("renderingEnabled", true);
-    QCOMPARE(renderingEnabledSpy.count(),2);
-}
-
-void tst_qdeclarativewebview::pressGrabTime()
-{
-    QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
-    checkNoErrors(component);
-    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(component.create());
-    QObject *wv = rootItem->findChild<QObject*>("webView");
-    QVERIFY(rootItem != 0);
-    QVERIFY(wv != 0);
-    QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
-    QCOMPARE(wv->property("pressGrabTime").toInt(), 200);
-    QSignalSpy pressGrabTimeSpy(wv, SIGNAL(pressGrabTimeChanged()));
-
-    wv->setProperty("pressGrabTime", 100);
-    QCOMPARE(wv->property("pressGrabTime").toInt(), 100);
-    QCOMPARE(pressGrabTimeSpy.count(),1);
-
-    wv->setProperty("pressGrabTime", 100);
-    QCOMPARE(pressGrabTimeSpy.count(),1);
-
-    wv->setProperty("pressGrabTime", 0);
-    QCOMPARE(pressGrabTimeSpy.count(),2);
-}
-
-QTEST_MAIN(tst_qdeclarativewebview)
-
-#include "tst_qdeclarativewebview.moc"
-- 
cgit v0.12


From 53b85aa13d30b84a69c326617d78b6d3ddeee15c Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Wed, 23 Mar 2011 10:04:57 +0100
Subject: fix spelling error in HTTP multipart documentation

---
 src/network/access/qhttpmultipart.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/access/qhttpmultipart.cpp b/src/network/access/qhttpmultipart.cpp
index d329d5c..640f9ea 100644
--- a/src/network/access/qhttpmultipart.cpp
+++ b/src/network/access/qhttpmultipart.cpp
@@ -85,7 +85,7 @@ QT_BEGIN_NAMESPACE
     \snippet doc/src/snippets/code/src_network_access_qhttppart.cpp 2
 
     Be aware that QHttpPart does not take ownership of the device when set, so
-    it is the developer's responsability to destroy it when it is not needed anymore.
+    it is the developer's responsibility to destroy it when it is not needed anymore.
     A good idea might be to set the multipart message as parent object for the device,
     as documented at the documentation for QHttpMultiPart.
 
-- 
cgit v0.12


From 3a9b2fc482a95416bb5173720cc000cf99851823 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 23 Mar 2011 11:32:21 +0100
Subject: Revert "Added short time format support on Windows."

This reverts commit 96e3f2358ffdeb12c141e8139cdfbc8b24a14700.

Conflicts:

	src/corelib/tools/qlocale_win.cpp
---
 src/corelib/tools/qlocale_win.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index b1b1962..c892e04 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -336,7 +336,7 @@ QVariant QSystemLocalePrivate::toString(const QDate &date, QLocale::FormatType t
     return QString();
 }
 
-QVariant QSystemLocalePrivate::toString(const QTime &time, QLocale::FormatType type)
+QVariant QSystemLocalePrivate::toString(const QTime &time, QLocale::FormatType)
 {
     SYSTEMTIME st;
     memset(&st, 0, sizeof(SYSTEMTIME));
@@ -346,8 +346,6 @@ QVariant QSystemLocalePrivate::toString(const QTime &time, QLocale::FormatType t
     st.wMilliseconds = 0;
 
     DWORD flags = 0;
-    if (type != QLocale::LongFormat && QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7)
-        flags = 2; // TIME_NOSECONDS
 
     wchar_t buf[255];
     if (GetTimeFormat(lcid, flags, &st, NULL, buf, 255)) {
-- 
cgit v0.12


From f31dfc682402396e35dffd8952eb5ced8f6b4030 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 17:46:39 +0000
Subject: Fix event loop hangs caused by async QHostInfo

Declaring iStatus in a derived class hides the iStatus in CActive.
This confuses the active scheduler (which is using CActive::iStatus) and
would in a normal symbian application have caused a stray signal panic.
However as Qt's event loop integration uses CActiveScheduler::RunIfReady
instead of the normal CActiveScheduler::Start the panic does not happen.
Instead the thread semaphore gets messed up and causes problems.

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index a40104a..bff5fc4 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -254,8 +254,6 @@ private:
     RHostResolver iHostResolver;
     QSharedPointer<QNetworkSession> iNetworkSession;
 
-    TRequestStatus iStatus;
-
     TNameEntry iNameResult;
     QHostAddress iAddress;
 
-- 
cgit v0.12


From 1831e7f802d1bdba33f320c21f29df02d647ead8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 17:59:05 +0000
Subject: Ensure parameters of async function calls stay in scope

Calling symbian asynchronous functions with parameters on the stack,
even "in" parameters is unsafe. If the server is blocked on another
operation, then it will not read the parameters until later (at which
time the stack is invalid)

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         | 4 ++++
 src/network/kernel/qhostinfo_symbian.cpp | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index bff5fc4..71c191f 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -249,12 +249,16 @@ private:
 
 private:
     const QString iHostName;
+    QString iEncodedHostName;
+    TPtrC iHostNamePtr;
 
     RSocketServ& iSocketServ;
     RHostResolver iHostResolver;
     QSharedPointer<QNetworkSession> iNetworkSession;
 
     TNameEntry iNameResult;
+    TInetAddr IpAdd;
+
     QHostAddress iAddress;
 
     QHostInfo iResults;
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index c969748..c1457fd 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -259,7 +259,6 @@ void QSymbianHostResolver::requestHostLookup()
         if (iAddress.setAddress(iHostName)) {
             // Reverse lookup
 
-            TInetAddr IpAdd;
             IpAdd.Input(qt_QString2TPtrC(iHostName));
 
             // Asynchronous request.
@@ -279,9 +278,11 @@ void QSymbianHostResolver::requestHostLookup()
 
                 err = KErrArgument;
             } else {
+                iEncodedHostName = QString::fromLatin1(aceHostname);
+                iHostNamePtr.Set(qt_QString2TPtrC(iEncodedHostName));
 
                 // Asynchronous request.
-                iHostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), iNameResult, iStatus);
+                iHostResolver.GetByName(iHostNamePtr, iNameResult, iStatus);
                 iState = EGetByName;
             }
         }
-- 
cgit v0.12


From 4f74076095add88c936e729838c9205abfe04bd0 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 18:09:13 +0000
Subject: Ensure QSymbianHostResolver::DoCancel does correct thing based on
 state

If a host resolver async call in progress, cancel it.
Otherwise don't.

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index c1457fd..fdb0fbc 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -300,7 +300,16 @@ void QSymbianHostResolver::requestHostLookup()
 
 void QSymbianHostResolver::DoCancel()
 {
-    iHostResolver.Cancel();
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostResolver::DoCancel" << QThread::currentThreadId() << id() << (int)iState << this;
+#endif
+    if (iState == EGetByAddress || iState == EGetByName) {
+        //these states have made an async request to host resolver
+        iHostResolver.Cancel();
+    } else {
+        //for the self completing states there is nothing to cancel
+        Q_ASSERT(iState == EError);
+    }
 }
 
 void QSymbianHostResolver::RunL()
-- 
cgit v0.12


From 999f44f06702513747844bcc0809597134be5e78 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 18:16:45 +0000
Subject: use QList instead of RPointerArray

For maintainability, it's better to use Qt's container classes

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         |  5 ++--
 src/network/kernel/qhostinfo_symbian.cpp | 49 ++++++++++++++++----------------
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 71c191f..a7e83da 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -295,9 +295,8 @@ private:
 
     static const int KMaxConcurrentLookups = 5;
 
-    RPointerArray<QSymbianHostResolver> iCurrentLookups;
-    RPointerArray<QSymbianHostResolver> iScheduledLookups;
-    RPointerArray<QSymbianHostResolver> iFinishedLookups;
+    QList<QSymbianHostResolver*> iCurrentLookups;
+    QList<QSymbianHostResolver*> iScheduledLookups;
 
     QMutex mutex;
 };
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index fdb0fbc..5998a72 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -435,15 +435,18 @@ QSymbianHostInfoLookupManger::QSymbianHostInfoLookupManger()
 
 QSymbianHostInfoLookupManger::~QSymbianHostInfoLookupManger()
 {
-    iCurrentLookups.Close();
-    iScheduledLookups.Close();
 }
 
 void QSymbianHostInfoLookupManger::clear()
 {
     QMutexLocker locker(&mutex);
-    iCurrentLookups.ResetAndDestroy();
-    iScheduledLookups.ResetAndDestroy();
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostInfoLookupManger::clear" << QThread::currentThreadId();
+#endif
+    //TODO: these aren't deleted because of thread unsafety, but that is a behaviour difference
+    //qDeleteAll(iCurrentLookups);
+    //qDeleteAll(iScheduledLookups);
+    cache.clear();
 }
 
 void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
@@ -451,13 +454,13 @@ void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::lookupFinished" << r->id() << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+    qDebug() << "QSymbianHostInfoLookupManger::lookupFinished" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // remove finished lookup from array and destroy
-    TInt count = iCurrentLookups.Count();
+    TInt count = iCurrentLookups.count();
     for (TInt i = 0; i < count; i++) {
         if (iCurrentLookups[i]->id() == r->id()) {
-            iCurrentLookups.Remove(i);
+            iCurrentLookups.removeAt(i);
             break;
         }
     }
@@ -468,15 +471,14 @@ void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
 void QSymbianHostInfoLookupManger::runNextLookup()
 {
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::runNextLookup" << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+    qDebug() << "QSymbianHostInfoLookupManger::runNextLookup" << QThread::currentThreadId() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // check to see if there are any scheduled lookups
-    if (iScheduledLookups.Count() > 0) {
+    if (iScheduledLookups.count() > 0) {
         // if so, move one to the current lookups and run it
         // FIFO
-        QSymbianHostResolver* hostResolver = iScheduledLookups[0];
-        iCurrentLookups.Append(hostResolver);
-        iScheduledLookups.Remove(0);
+        QSymbianHostResolver* hostResolver = iScheduledLookups.takeFirst();
+        iCurrentLookups.append(hostResolver);
         hostResolver->requestHostLookup();
     }
 }
@@ -487,19 +489,19 @@ void QSymbianHostInfoLookupManger::scheduleLookup(QSymbianHostResolver* r)
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::scheduleLookup" << r->id() << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+    qDebug() << "QSymbianHostInfoLookupManger::scheduleLookup" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // Check to see if we have space on the current lookups pool.
-    if (iCurrentLookups.Count() >= KMaxConcurrentLookups) {
+    if (iCurrentLookups.count() >= KMaxConcurrentLookups) {
         // If no, schedule for later.
-        iScheduledLookups.Append(r);
+        iScheduledLookups.append(r);
 #if defined(QHOSTINFO_DEBUG)
     qDebug(" - scheduled");
 #endif
         return;
     } else {
         // If yes, add it to the current lookups.
-        iCurrentLookups.Append(r);
+        iCurrentLookups.append(r);
 
         // ... and trigger the async call.
         r->requestHostLookup();
@@ -511,32 +513,31 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::abortLookup" << id << "current" << iCurrentLookups.Count() << "queued" << iScheduledLookups.Count();
+    qDebug() << "QSymbianHostInfoLookupManger::abortLookup" << QThread::currentThreadId() << id << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     int i = 0;
     // Find the aborted lookup by ID.
     // First in the current lookups.
-    for (i = 0; i < iCurrentLookups.Count(); i++) {
+    for (i = 0; i < iCurrentLookups.count(); i++) {
         if (id == iCurrentLookups[i]->id()) {
-            QSymbianHostResolver* r = iCurrentLookups[i];
-            iCurrentLookups.Remove(i);
+            QSymbianHostResolver* r = iCurrentLookups.at(i);
+            iCurrentLookups.removeAt(i);
             delete r; //cancels via destructor
             runNextLookup();
             return;
         }
     }
     // Then in the scheduled lookups.
-    for (i = 0; i < iScheduledLookups.Count(); i++) {
+    for (i = 0; i < iScheduledLookups.count(); i++) {
         if (id == iScheduledLookups[i]->id()) {
-            QSymbianHostResolver* r = iScheduledLookups[i];
-            iScheduledLookups.Remove(i);
+            QSymbianHostResolver* r = iScheduledLookups.at(i);
+            iScheduledLookups.removeAt(i);
             delete r;
             return;
         }
     }
 }
 
-
 QSymbianHostInfoLookupManger* QSymbianHostInfoLookupManger::globalInstance()
 {
     return static_cast<QSymbianHostInfoLookupManger*>
-- 
cgit v0.12


From aacdf24477bbcddd6492c3bac3d903555f09297a Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 22 Mar 2011 18:19:17 +0000
Subject: Fix bugs in tst_qnetworkreply

It used a unix way to delete local servers. Changed this to the cross
platform QLocalServer::removeServer API

It reported XPASS on symbian due to SRCDIR being a relative path not
absolute. (added a check for this, as SRCDIR could be relative on windows)

Also fixed a couple of compiler warnings

Reviewed-by: Martin Petersson
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index ffe7ea4..f8a9530 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -1542,7 +1542,7 @@ void tst_QNetworkReply::getErrors()
     QNetworkRequest request(url);
 
 #if defined(Q_OS_WIN) || defined (Q_OS_SYMBIAN)
-    if (qstrcmp(QTest::currentDataTag(), "empty-scheme-host") == 0)
+    if (qstrcmp(QTest::currentDataTag(), "empty-scheme-host") == 0 && QFileInfo(url).isAbsolute())
         QTest::ignoreMessage(QtWarningMsg, "QNetworkAccessFileBackendFactory: URL has no schema set, use file:// for files");
 #endif
 
@@ -1561,7 +1561,8 @@ void tst_QNetworkReply::getErrors()
 
     QFETCH(int, error);
 #if defined(Q_OS_WIN) || defined (Q_OS_SYMBIAN)
-    QEXPECT_FAIL("empty-scheme-host", "this is expected to fail on Windows and Symbian, QTBUG-17731", Abort);
+    if (QFileInfo(url).isAbsolute())
+        QEXPECT_FAIL("empty-scheme-host", "this is expected to fail on Windows and Symbian, QTBUG-17731", Abort);
 #endif
     QEXPECT_FAIL("ftp-is-dir", "QFtp cannot provide enough detail", Abort);
     // the line below is not necessary
@@ -3210,8 +3211,7 @@ void tst_QNetworkReply::ioPutToFileFromLocalSocket()
     QString socketname = "networkreplytest";
     QLocalServer server;
     if (!server.listen(socketname)) {
-        if (QFile::exists(server.fullServerName()))
-            QFile::remove(server.fullServerName());
+        QLocalServer::removeServer(socketname);
         QVERIFY(server.listen(socketname));
     }
     QLocalSocket active;
@@ -3256,7 +3256,7 @@ void tst_QNetworkReply::ioPutToFileFromProcess()
 {
 #if defined(Q_OS_WINCE) || defined (Q_OS_SYMBIAN)
     QSKIP("Currently no stdin/out supported for Windows CE / Symbian OS", SkipAll);
-#endif
+#else
 
 #ifdef Q_OS_WIN
     if (qstrcmp(QTest::currentDataTag(), "small") == 0)
@@ -3294,6 +3294,7 @@ void tst_QNetworkReply::ioPutToFileFromProcess()
     QByteArray contents = file.readAll();
     QCOMPARE(contents, data);
 #endif
+#endif
 }
 
 void tst_QNetworkReply::ioPutToFtpFromFile_data()
@@ -5088,7 +5089,7 @@ void tst_QNetworkReply::getFromHttpIntoBuffer()
 
 // FIXME we really need to consolidate all those server implementations
 class GetFromHttpIntoBuffer2Server : QObject {
-    Q_OBJECT;
+    Q_OBJECT
     qint64 dataSize;
     qint64 dataSent;
     QTcpServer server;
-- 
cgit v0.12


From 18d9987e4a8f096ac4e4045ebc1a35d93e8fc134 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 23 Mar 2011 11:34:41 +0100
Subject: Fixed a typo in the manual test

Reviewed-by: trustme
---
 tests/manual/qlocale/miscellaneous.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/manual/qlocale/miscellaneous.cpp b/tests/manual/qlocale/miscellaneous.cpp
index a9694bf..89c80dc 100644
--- a/tests/manual/qlocale/miscellaneous.cpp
+++ b/tests/manual/qlocale/miscellaneous.cpp
@@ -49,7 +49,7 @@ MiscWidget::MiscWidget()
     createLineEdit("Alternate quotes:", &alternateQuotedTextLabel, &alternateQuotedText);
     textToQuote->setText("some text");
     createLineEdit("Text direction:", &textDirectionLabel, &textDirection);
-    createLineEdit("List to seperated string:", &listToSeparatedStringLabel, &listToSeparatedStringText);
+    createLineEdit("List to separated string:", &listToSeparatedStringLabel, &listToSeparatedStringText);
 
     l->addWidget(textToQuoteLabel, 0, 0);
     l->addWidget(textToQuote, 0, 1);
-- 
cgit v0.12


From 2905f11e8e8fe7e05d61cec9fcc1d78ff91f0f31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 23 Mar 2011 13:41:28 +0100
Subject: Avoid duplicate calls to eglGetDisplay() in XCB / Xlib platforms.

Just call eglGetDisplay() once, as we also need to call eglInitialize()
before the display can be used validly.
---
 src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp | 4 +---
 src/plugins/platforms/eglconvenience/qxlibeglintegration.h   | 2 +-
 src/plugins/platforms/xcb/qxcbwindow.cpp                     | 7 +++----
 src/plugins/platforms/xlib/qxlibintegration.cpp              | 3 ++-
 src/plugins/platforms/xlib/qxlibscreen.cpp                   | 5 ++++-
 src/plugins/platforms/xlib/qxlibscreen.h                     | 8 ++++++++
 src/plugins/platforms/xlib/qxlibwindow.cpp                   | 6 +++---
 7 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
index 7f296c5..45746e9 100644
--- a/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
@@ -52,13 +52,11 @@ static int countBits(unsigned long mask)
     return count;
 }
 
-VisualID QXlibEglIntegration::getCompatibleVisualId(Display *display, EGLConfig config)
+VisualID QXlibEglIntegration::getCompatibleVisualId(Display *display, EGLDisplay eglDisplay, EGLConfig config)
 {
     VisualID    visualId = 0;
     EGLint      eglValue = 0;
 
-    EGLDisplay eglDisplay = eglGetDisplay(display);
-
     EGLint configRedSize = 0;
     eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &configRedSize);
 
diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.h b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
index 51996da..6c2e266 100644
--- a/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
@@ -47,7 +47,7 @@
 class QXlibEglIntegration
 {
 public:
-    static VisualID getCompatibleVisualId(Display *display, EGLConfig config);
+    static VisualID getCompatibleVisualId(Display *display, EGLDisplay eglDisplay, EGLConfig config);
 };
 
 #endif // QTESTLITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index cbf50f7..017a902 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -114,9 +114,9 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 #if defined(XCB_USE_GLX)
             XVisualInfo *visualInfo = QGLXContext::findVisualInfo(m_screen, tlw->platformWindowFormat());
 #elif defined(XCB_USE_EGL)
-        EGLDisplay eglDisplay = eglGetDisplay(DISPLAY_FROM_XCB(this));
+        EGLDisplay eglDisplay = connection()->egl_display();
         EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,tlw->platformWindowFormat(),true);
-        VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this),eglConfig);
+        VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this), eglDisplay, eglConfig);
 
         XVisualInfo visualInfoTemplate;
         memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
@@ -430,8 +430,7 @@ QPlatformGLContext *QXcbWindow::glContext() const
     }
 #elif defined(XCB_USE_EGL)
     if (!m_context) {
-        EGLDisplay display = eglGetDisplay(DISPLAY_FROM_XCB(this));
-
+        EGLDisplay display = connection()->egl_display();
         EGLConfig config = q_configFromQPlatformWindowFormat(display,widget()->platformWindowFormat(),true);
         QVector<EGLint> eglContextAttrs;
         eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
index 6733ed1..63197b0 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.cpp
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -141,11 +141,12 @@ bool QXlibIntegration::hasOpenGL() const
     static bool wasEglInitialized = false;
     if (!eglHasbeenInitialized) {
         eglHasbeenInitialized = true;
-        const QXlibScreen *screen = static_cast<const QXlibScreen *>(mScreens.at(0));
+        QXlibScreen *screen = static_cast<QXlibScreen *>(mScreens.at(0));
         EGLint major, minor;
         eglBindAPI(EGL_OPENGL_ES_API);
         EGLDisplay disp = eglGetDisplay(screen->display()->nativeDisplay());
         wasEglInitialized = eglInitialize(disp,&major,&minor);
+        screen->setEglDisplay(disp);
     }
     return wasEglInitialized;
 #endif
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp
index 23a2d07..7c8a367 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.cpp
+++ b/src/plugins/platforms/xlib/qxlibscreen.cpp
@@ -191,6 +191,9 @@ qDebug() << "qt_x_errhandler" << err->error_code;
 
 QXlibScreen::QXlibScreen()
         : mFormat(QImage::Format_RGB32)
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+        , mEGLDisplay(0)
+#endif
 {
     char *display_name = getenv("DISPLAY");
     Display *display = XOpenDisplay(display_name);
@@ -467,7 +470,7 @@ int QXlibScreen::xScreenNumber() const
 
 Visual * QXlibScreen::defaultVisual() const
 {
-    DefaultVisual(display()->nativeDisplay(), xScreenNumber());
+    return DefaultVisual(display()->nativeDisplay(), xScreenNumber());
 }
 
 QXlibKeyboard * QXlibScreen::keyboard() const
diff --git a/src/plugins/platforms/xlib/qxlibscreen.h b/src/plugins/platforms/xlib/qxlibscreen.h
index 35c0141..8c04c0f 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.h
+++ b/src/plugins/platforms/xlib/qxlibscreen.h
@@ -82,6 +82,11 @@ public:
 
     QXlibKeyboard *keyboard() const;
 
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+    void *eglDisplay() const { return mEGLDisplay; }
+    void setEglDisplay(void *display) { mEGLDisplay = display; }
+#endif
+
 public slots:
     void eventDispatcher();
 
@@ -96,6 +101,9 @@ private:
     QXlibKeyboard *mKeyboard;
 
     QXlibDisplay * mDisplay;
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+    void *mEGLDisplay;
+#endif
     int mScreen;
 };
 
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index a7bc53c..01d4b8e 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -87,9 +87,9 @@ QXlibWindow::QXlibWindow(QWidget *window)
 #else
         QPlatformWindowFormat windowFormat = correctColorBuffers(window->platformWindowFormat());
 
-        EGLDisplay eglDisplay = eglGetDisplay(mScreen->display()->nativeDisplay());
+        EGLDisplay eglDisplay = mScreen->eglDisplay();
         EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,windowFormat);
-        VisualID id = QXlibEglIntegration::getCompatibleVisualId(mScreen->display()->nativeDisplay(),eglConfig);
+        VisualID id = QXlibEglIntegration::getCompatibleVisualId(mScreen->display()->nativeDisplay(), eglDisplay, eglConfig);
 
         XVisualInfo visualInfoTemplate;
         memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
@@ -663,7 +663,7 @@ QPlatformGLContext *QXlibWindow::glContext() const
 #if !defined(QT_OPENGL_ES_2)
         that->mGLContext = new QGLXContext(x_window, mScreen,widget()->platformWindowFormat());
 #else
-        EGLDisplay display = eglGetDisplay(mScreen->display()->nativeDisplay());
+        EGLDisplay display = mScreen->eglDisplay();
 
         QPlatformWindowFormat windowFormat = correctColorBuffers(widget()->platformWindowFormat());
 
-- 
cgit v0.12


From 263be570b498847e0762831a5e6a29e1056b4b57 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 23 Mar 2011 13:29:25 +0000
Subject: Update Symbian .def files

---
 src/s60installs/bwins/QtCoreu.def    | 28 ++++++++++-
 src/s60installs/bwins/QtGuiu.def     | 26 ++++++++++
 src/s60installs/bwins/QtNetworku.def |  5 ++
 src/s60installs/bwins/QtTestu.def    | 89 ++++++++++++++++++++++++++++++++++
 src/s60installs/eabi/QtCoreu.def     | 30 +++++++++++-
 src/s60installs/eabi/QtGuiu.def      | 20 ++++++++
 src/s60installs/eabi/QtNetworku.def  |  5 ++
 src/s60installs/eabi/QtTestu.def     | 94 ++++++++++++++++++++++++++++++++++++
 8 files changed, 293 insertions(+), 4 deletions(-)

diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index dd7d588..33f22ee 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -1380,7 +1380,7 @@ EXPORTS
 	?create@QAbstractFileEngine@@SAPAV1@ABVQString@@@Z @ 1379 NONAME ; class QAbstractFileEngine * QAbstractFileEngine::create(class QString const &)
 	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@PAVQByteArray@@@Z @ 1380 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QByteArray *)
 	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@PAVQIODevice@@@Z @ 1381 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QIODevice *)
-	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@PAVQRingBuffer@@@Z @ 1382 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QRingBuffer *)
+	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@PAVQRingBuffer@@@Z @ 1382 NONAME ABSENT ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QRingBuffer *)
 	?create@QSharedMemory@@QAE_NHW4AccessMode@1@@Z @ 1383 NONAME ; bool QSharedMemory::create(int, enum QSharedMemory::AccessMode)
 	?create@QTextCodecPlugin@@EAEPAVQTextCodec@@ABVQString@@@Z @ 1384 NONAME ; class QTextCodec * QTextCodecPlugin::create(class QString const &)
 	?create@QVariant@@IAEXHPBX@Z @ 1385 NONAME ; void QVariant::create(int, void const *)
@@ -3572,7 +3572,7 @@ EXPORTS
 	?skipWhiteSpace@QTextStream@@QAEXXZ @ 3571 NONAME ; void QTextStream::skipWhiteSpace(void)
 	?sleep@QThread@@KAXK@Z @ 3572 NONAME ; void QThread::sleep(unsigned long)
 	?socket@QSocketNotifier@@QBEHXZ @ 3573 NONAME ; int QSocketNotifier::socket(void) const
-	?socketFired@QEventDispatcherSymbian@@QAEXPAVQSocketActiveObject@@@Z @ 3574 NONAME ; void QEventDispatcherSymbian::socketFired(class QSocketActiveObject *)
+	?socketFired@QEventDispatcherSymbian@@QAEXPAVQSocketActiveObject@@@Z @ 3574 NONAME ABSENT ; void QEventDispatcherSymbian::socketFired(class QSocketActiveObject *)
 	?sort@QAbstractItemModel@@UAEXHW4SortOrder@Qt@@@Z @ 3575 NONAME ; void QAbstractItemModel::sort(int, enum Qt::SortOrder)
 	?sorting@QDir@@QBE?AV?$QFlags@W4SortFlag@QDir@@@@XZ @ 3576 NONAME ; class QFlags<enum QDir::SortFlag> QDir::sorting(void) const
 	?sourceState@QAbstractTransition@@QBEPAVQState@@XZ @ 3577 NONAME ; class QState * QAbstractTransition::sourceState(void) const
@@ -4605,4 +4605,28 @@ EXPORTS
 	?hasError@QXmlStreamWriter@@QBE_NXZ @ 4604 NONAME ; bool QXmlStreamWriter::hasError(void) const
 	?revision@QMetaProperty@@QBEHXZ @ 4605 NONAME ; int QMetaProperty::revision(void) const
 	?revision@QMetaMethod@@QBEHXZ @ 4606 NONAME ; int QMetaMethod::revision(void) const
+	gzungetc @ 4607 NONAME
+	?addSocket@QSymbianSocketManager@@QAEHABVRSocket@@@Z @ 4608 NONAME ; int QSymbianSocketManager::addSocket(class RSocket const &)
+	??0QActiveObject@@QAE@HPAVQEventDispatcherSymbian@@@Z @ 4609 NONAME ; QActiveObject::QActiveObject(int, class QEventDispatcherSymbian *)
+	?setDefaultConnection@QSymbianSocketManager@@QAEXPAVRConnection@@@Z @ 4610 NONAME ; void QSymbianSocketManager::setDefaultConnection(class RConnection *)
+	?reactivateAndComplete@QActiveObject@@QAEXXZ @ 4611 NONAME ; void QActiveObject::reactivateAndComplete(void)
+	?defaultConnection@QSymbianSocketManager@@QBEPAVRConnection@@XZ @ 4612 NONAME ; class RConnection * QSymbianSocketManager::defaultConnection(void) const
+	?qt_symbianGetSocketServer@@YAAAVRSocketServ@@XZ @ 4613 NONAME ; class RSocketServ & qt_symbianGetSocketServer(void)
+	?maybeQueueForLater@QActiveObject@@QAE_NXZ @ 4614 NONAME ; bool QActiveObject::maybeQueueForLater(void)
+	??_EQActiveObject@@UAE@I@Z @ 4615 NONAME ; QActiveObject::~QActiveObject(unsigned int)
+	?lookupSocket@QSymbianSocketManager@@QBE_NHAAVRSocket@@@Z @ 4616 NONAME ; bool QSymbianSocketManager::lookupSocket(int, class RSocket &) const
+	?wait@QActiveObject@@SA_NPAVCActive@@H@Z @ 4617 NONAME ; bool QActiveObject::wait(class CActive *, int)
+	?instance@QSymbianSocketManager@@SAAAV1@XZ @ 4618 NONAME ; class QSymbianSocketManager & QSymbianSocketManager::instance(void)
+	??0QSymbianSocketManager@@QAE@XZ @ 4619 NONAME ; QSymbianSocketManager::QSymbianSocketManager(void)
+	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@V?$QSharedPointer@VQRingBuffer@@@@@Z @ 4620 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QSharedPointer<class QRingBuffer>)
+	??1QSymbianSocketManager@@QAE@XZ @ 4621 NONAME ; QSymbianSocketManager::~QSymbianSocketManager(void)
+	?isResetDisabled@QNonContiguousByteDevice@@QAE_NXZ @ 4622 NONAME ; bool QNonContiguousByteDevice::isResetDisabled(void)
+	??1QActiveObject@@UAE@XZ @ 4623 NONAME ; QActiveObject::~QActiveObject(void)
+	?wait@QActiveObject@@SA_NV?$QList@PAVCActive@@@@H@Z @ 4624 NONAME ; bool QActiveObject::wait(class QList<class CActive *>, int)
+	?maybeDeferSocketEvent@QActiveObject@@QAE_NXZ @ 4625 NONAME ; bool QActiveObject::maybeDeferSocketEvent(void)
+	?lookupSocket@QSymbianSocketManager@@QBEHABVRSocket@@@Z @ 4626 NONAME ; int QSymbianSocketManager::lookupSocket(class RSocket const &) const
+	?areSocketEventsBlocked@QEventDispatcherSymbian@@QBE_NXZ @ 4627 NONAME ; bool QEventDispatcherSymbian::areSocketEventsBlocked(void) const
+	?addDeferredSocketActiveObject@QEventDispatcherSymbian@@QAEXPAVQActiveObject@@@Z @ 4628 NONAME ; void QEventDispatcherSymbian::addDeferredSocketActiveObject(class QActiveObject *)
+	?getSocketServer@QSymbianSocketManager@@QAEAAVRSocketServ@@XZ @ 4629 NONAME ; class RSocketServ & QSymbianSocketManager::getSocketServer(void)
+	?removeSocket@QSymbianSocketManager@@QAE_NABVRSocket@@@Z @ 4630 NONAME ; bool QSymbianSocketManager::removeSocket(class RSocket const &)
 
diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index 9b4c0f7..f711475 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -13149,3 +13149,29 @@ EXPORTS
 	?ProcessCommandParametersL@QS60MainAppUi@@UAEHW4TApaCommand@@AAV?$TBuf@$0BAA@@@ABVTDesC8@@@Z @ 13148 NONAME ; int QS60MainAppUi::ProcessCommandParametersL(enum TApaCommand, class TBuf<256> &, class TDesC8 const &)
 	?openFile@QFileOpenEvent@@QBE_NAAVQFile@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13149 NONAME ; bool QFileOpenEvent::openFile(class QFile &, class QFlags<enum QIODevice::OpenModeFlag>) const
 	??0QFileOpenEvent@@QAE@ABVRFile@@@Z @ 13150 NONAME ; QFileOpenEvent::QFileOpenEvent(class RFile const &)
+	?tr@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13151 NONAME ; class QString QInternalMimeData::tr(char const *, char const *, int)
+	?assignedInputContext@QWidgetPrivate@@QBEPAVQInputContext@@XZ @ 13152 NONAME ; class QInputContext * QWidgetPrivate::assignedInputContext(void) const
+	?formatsHelper@QInternalMimeData@@SA?AVQStringList@@PBVQMimeData@@@Z @ 13153 NONAME ; class QStringList QInternalMimeData::formatsHelper(class QMimeData const *)
+	??_EQInternalMimeData@@UAE@I@Z @ 13154 NONAME ; QInternalMimeData::~QInternalMimeData(unsigned int)
+	?hasFormatHelper@QInternalMimeData@@SA_NABVQString@@PBVQMimeData@@@Z @ 13155 NONAME ; bool QInternalMimeData::hasFormatHelper(class QString const &, class QMimeData const *)
+	?renderDataHelper@QInternalMimeData@@SA?AVQByteArray@@ABVQString@@PBVQMimeData@@@Z @ 13156 NONAME ; class QByteArray QInternalMimeData::renderDataHelper(class QString const &, class QMimeData const *)
+	?setLineHeight@QTextBlockFormat@@QAEXMH@Z @ 13157 NONAME ; void QTextBlockFormat::setLineHeight(float, int)
+	?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13158 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *, int)
+	?staticMetaObject@QInternalMimeData@@2UQMetaObject@@B @ 13159 NONAME ; struct QMetaObject const QInternalMimeData::staticMetaObject
+	?lineHeight@QTextBlockFormat@@QBEMMM@Z @ 13160 NONAME ; float QTextBlockFormat::lineHeight(float, float) const
+	?qt_metacast@QInternalMimeData@@UAEPAXPBD@Z @ 13161 NONAME ; void * QInternalMimeData::qt_metacast(char const *)
+	?lineHeightType@QTextBlockFormat@@QBEHXZ @ 13162 NONAME ; int QTextBlockFormat::lineHeightType(void) const
+	?qt_metacall@QInternalMimeData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13163 NONAME ; int QInternalMimeData::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?getStaticMetaObject@QInternalMimeData@@SAABUQMetaObject@@XZ @ 13164 NONAME ; struct QMetaObject const & QInternalMimeData::getStaticMetaObject(void)
+	??0QInternalMimeData@@QAE@XZ @ 13165 NONAME ; QInternalMimeData::QInternalMimeData(void)
+	?updateMicroFocus@QLineControl@@IAEXXZ @ 13166 NONAME ; void QLineControl::updateMicroFocus(void)
+	?formats@QInternalMimeData@@UBE?AVQStringList@@XZ @ 13167 NONAME ; class QStringList QInternalMimeData::formats(void) const
+	?lineHeight@QTextBlockFormat@@QBEMXZ @ 13168 NONAME ; float QTextBlockFormat::lineHeight(void) const
+	?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13169 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *)
+	??1QInternalMimeData@@UAE@XZ @ 13170 NONAME ; QInternalMimeData::~QInternalMimeData(void)
+	?hasFormat@QInternalMimeData@@UBE_NABVQString@@@Z @ 13171 NONAME ; bool QInternalMimeData::hasFormat(class QString const &) const
+	?canReadData@QInternalMimeData@@SA_NABVQString@@@Z @ 13172 NONAME ; bool QInternalMimeData::canReadData(class QString const &)
+	?tr@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13173 NONAME ; class QString QInternalMimeData::tr(char const *, char const *)
+	?metaObject@QInternalMimeData@@UBEPBUQMetaObject@@XZ @ 13174 NONAME ; struct QMetaObject const * QInternalMimeData::metaObject(void) const
+	?retrieveData@QInternalMimeData@@MBE?AVQVariant@@ABVQString@@W4Type@2@@Z @ 13175 NONAME ; class QVariant QInternalMimeData::retrieveData(class QString const &, enum QVariant::Type) const
+
diff --git a/src/s60installs/bwins/QtNetworku.def b/src/s60installs/bwins/QtNetworku.def
index b01324c..3f8f6d2 100644
--- a/src/s60installs/bwins/QtNetworku.def
+++ b/src/s60installs/bwins/QtNetworku.def
@@ -1159,4 +1159,9 @@ EXPORTS
 	?engines@QNetworkConfigurationManagerPrivate@@QBE?AV?$QList@PAVQBearerEngine@@@@XZ @ 1158 NONAME ; class QList<class QBearerEngine *> QNetworkConfigurationManagerPrivate::engines(void) const
 	?isOnline@QNetworkConfigurationManagerPrivate@@QBE_NXZ @ 1159 NONAME ; bool QNetworkConfigurationManagerPrivate::isOnline(void) const
 	?startPolling@QNetworkConfigurationManagerPrivate@@AAEXXZ @ 1160 NONAME ; void QNetworkConfigurationManagerPrivate::startPolling(void)
+	?peerVerifyName@QSslSocket@@QBE?AVQString@@XZ @ 1161 NONAME ; class QString QSslSocket::peerVerifyName(void) const
+	?setPeerVerifyName@QSslSocket@@QAEXABVQString@@@Z @ 1162 NONAME ; void QSslSocket::setPeerVerifyName(class QString const &)
+	?nativeSession@QNetworkSessionPrivate@@SAPAVRConnection@@AAVQNetworkSession@@@Z @ 1163 NONAME ; class RConnection * QNetworkSessionPrivate::nativeSession(class QNetworkSession &)
+	?nativeOpenSocket@QNetworkSessionPrivate@@SAHAAVQNetworkSession@@AAVRSocket@@III@Z @ 1164 NONAME ; int QNetworkSessionPrivate::nativeOpenSocket(class QNetworkSession &, class RSocket &, unsigned int, unsigned int, unsigned int)
+	?nativeOpenHostResolver@QNetworkSessionPrivate@@SAHAAVQNetworkSession@@AAVRHostResolver@@II@Z @ 1165 NONAME ; int QNetworkSessionPrivate::nativeOpenHostResolver(class QNetworkSession &, class RHostResolver &, unsigned int, unsigned int)
 
diff --git a/src/s60installs/bwins/QtTestu.def b/src/s60installs/bwins/QtTestu.def
index a7bb9cd..239eb1f 100644
--- a/src/s60installs/bwins/QtTestu.def
+++ b/src/s60installs/bwins/QtTestu.def
@@ -77,4 +77,93 @@ EXPORTS
 	?staticMetaObject@QTestEventLoop@@2UQMetaObject@@B @ 76 NONAME ; struct QMetaObject const QTestEventLoop::staticMetaObject
 	?setBenchmarkResult@QTest@@YAXMW4QBenchmarkMetric@1@@Z @ 77 NONAME ; void QTest::setBenchmarkResult(float, enum QTest::QBenchmarkMetric)
 	?endBenchmarkMeasurement@QTest@@YA_KXZ @ 78 NONAME ; unsigned long long QTest::endBenchmarkMeasurement(void)
+	?addXFail@QTestLog@@SAXPBD0H@Z @ 79 NONAME ; void QTestLog::addXFail(char const *, char const *, int)
+	?leaveTestFunction@QTestLog@@SAXXZ @ 80 NONAME ; void QTestLog::leaveTestFunction(void)
+	?setCurrentTestFunction@QTestResult@@SAXPBD@Z @ 81 NONAME ; void QTestResult::setCurrentTestFunction(char const *)
+	?currentTestObjectName@QTestResult@@SAPBDXZ @ 82 NONAME ; char const * QTestResult::currentTestObjectName(void)
+	?allDataPassed@QTestResult@@SA_NXZ @ 83 NONAME ; bool QTestResult::allDataPassed(void)
+	?redirectOutput@QTestLog@@SAXPBD@Z @ 84 NONAME ; void QTestLog::redirectOutput(char const *)
+	?testData@QTestTable@@QBEPAVQTestData@@H@Z @ 85 NONAME ; class QTestData * QTestTable::testData(int) const
+	?isEmpty@QTestTable@@QBE_NXZ @ 86 NONAME ; bool QTestTable::isEmpty(void) const
+	?logMode@QTestLog@@SA?AW4LogMode@1@XZ @ 87 NONAME ; enum QTestLog::LogMode QTestLog::logMode(void)
+	?dataCount@QTestTable@@QBEHXZ @ 88 NONAME ; int QTestTable::dataCount(void) const
+	?addFailure@QTestResult@@SAXPBD0H@Z @ 89 NONAME ; void QTestResult::addFailure(char const *, char const *, int)
+	?setCurrentTestData@QTestResult@@SAXPAVQTestData@@@Z @ 90 NONAME ; void QTestResult::setCurrentTestData(class QTestData *)
+	?setMode@QBenchmarkGlobalData@@QAEXW4Mode@1@@Z @ 91 NONAME ; void QBenchmarkGlobalData::setMode(enum QBenchmarkGlobalData::Mode)
+	??1QTestTable@@QAE@XZ @ 92 NONAME ; QTestTable::~QTestTable(void)
+	?setLogMode@QTestLog@@SAXW4LogMode@1@@Z @ 93 NONAME ; void QTestLog::setLogMode(enum QTestLog::LogMode)
+	?addBenchmarkResult@QTestLog@@SAXABVQBenchmarkResult@@@Z @ 94 NONAME ; void QTestLog::addBenchmarkResult(class QBenchmarkResult const &)
+	?setVerboseLevel@QTestLog@@SAXH@Z @ 95 NONAME ; void QTestLog::setVerboseLevel(int)
+	??0QBenchmarkGlobalData@@QAE@XZ @ 96 NONAME ; QBenchmarkGlobalData::QBenchmarkGlobalData(void)
+	?stopLogging@QTestLog@@SAXXZ @ 97 NONAME ; void QTestLog::stopLogging(void)
+	?setCurrentGlobalTestData@QTestResult@@SAXPAVQTestData@@@Z @ 98 NONAME ; void QTestResult::setCurrentGlobalTestData(class QTestData *)
+	?currentTestLocation@QTestResult@@SA?AW4TestLocation@1@XZ @ 99 NONAME ; enum QTestResult::TestLocation QTestResult::currentTestLocation(void)
+	?currentTestFunction@QTestResult@@SAPBDXZ @ 100 NONAME ; char const * QTestResult::currentTestFunction(void)
+	?dataTag@QTestTable@@QBEPBDH@Z @ 101 NONAME ; char const * QTestTable::dataTag(int) const
+	?expectFail@QTestResult@@SA_NPBD0W4TestFailMode@QTest@@0H@Z @ 102 NONAME ; bool QTestResult::expectFail(char const *, char const *, enum QTest::TestFailMode, char const *, int)
+	?currentDataTag@QTestResult@@SAPBDXZ @ 103 NONAME ; char const * QTestResult::currentDataTag(void)
+	??0QTestTable@@QAE@XZ @ 104 NONAME ; QTestTable::QTestTable(void)
+	?setFlushMode@QTestLog@@SAXW4FlushMode@1@@Z @ 105 NONAME ; void QTestLog::setFlushMode(enum QTestLog::FlushMode)
+	?setCurrentTestObject@QTestResult@@SAXPBD@Z @ 106 NONAME ; void QTestResult::setCurrentTestObject(char const *)
+	?beginDataRun@QBenchmarkTestMethodData@@QAEXXZ @ 107 NONAME ; void QBenchmarkTestMethodData::beginDataRun(void)
+	?qtest_qParseArgs@QTest@@YAXHQAPAD_N@Z @ 108 NONAME ; void QTest::qtest_qParseArgs(int, char * * const, bool)
+	?enterTestFunction@QTestLog@@SAXPBD@Z @ 109 NONAME ; void QTestLog::enterTestFunction(char const *)
+	?clearGlobalTestTable@QTestTable@@SAXXZ @ 110 NONAME ; void QTestTable::clearGlobalTestTable(void)
+	?addPass@QTestLog@@SAXPBD@Z @ 111 NONAME ; void QTestLog::addPass(char const *)
+	?printUnhandledIgnoreMessages@QTestLog@@SAXXZ @ 112 NONAME ; void QTestLog::printUnhandledIgnoreMessages(void)
+	?addColumn@QTestTable@@QAEXHPBD@Z @ 113 NONAME ; void QTestTable::addColumn(int, char const *)
+	?setSkipCurrentTest@QTestResult@@SAX_N@Z @ 114 NONAME ; void QTestResult::setSkipCurrentTest(bool)
+	?currentTestFailed@QTestResult@@SA_NXZ @ 115 NONAME ; bool QTestResult::currentTestFailed(void)
+	?createMeasurer@QBenchmarkGlobalData@@QAEPAVQBenchmarkMeasurerBase@@XZ @ 116 NONAME ; class QBenchmarkMeasurerBase * QBenchmarkGlobalData::createMeasurer(void)
+	?startLogging@QTestLog@@SAXXZ @ 117 NONAME ; void QTestLog::startLogging(void)
+	?printAvailableFunctions@QTest@@3_NA @ 118 NONAME ; bool QTest::printAvailableFunctions
+	?testFailed@QTestResult@@SA_NXZ @ 119 NONAME ; bool QTestResult::testFailed(void)
+	?current@QBenchmarkTestMethodData@@2PAV1@A @ 120 NONAME ; class QBenchmarkTestMethodData * QBenchmarkTestMethodData::current
+	?currentGlobalDataTag@QTestResult@@SAPBDXZ @ 121 NONAME ; char const * QTestResult::currentGlobalDataTag(void)
+	?adjustIterationCount@QBenchmarkTestMethodData@@QAEHH@Z @ 122 NONAME ; int QBenchmarkTestMethodData::adjustIterationCount(int)
+	?current@QBenchmarkGlobalData@@2PAV1@A @ 123 NONAME ; class QBenchmarkGlobalData * QBenchmarkGlobalData::current
+	?warn@QTestLog@@SAXPBD@Z @ 124 NONAME ; void QTestLog::warn(char const *)
+	?testFunctions@QTest@@3VQStringList@@A @ 125 NONAME ; class QStringList QTest::testFunctions
+	?elementTypeId@QTestTable@@QBEHH@Z @ 126 NONAME ; int QTestTable::elementTypeId(int) const
+	?ignoreMessage@QTestResult@@SAXW4QtMsgType@@PBD@Z @ 127 NONAME ; void QTestResult::ignoreMessage(enum QtMsgType, char const *)
+	?globalTestTable@QTestTable@@SAPAV1@XZ @ 128 NONAME ; class QTestTable * QTestTable::globalTestTable(void)
+	??0QBenchmarkTestMethodData@@QAE@XZ @ 129 NONAME ; QBenchmarkTestMethodData::QBenchmarkTestMethodData(void)
+	?currentTestTable@QTestTable@@SAPAV1@XZ @ 130 NONAME ; class QTestTable * QTestTable::currentTestTable(void)
+	?addFail@QTestLog@@SAXPBD0H@Z @ 131 NONAME ; void QTestLog::addFail(char const *, char const *, int)
+	?endDataRun@QBenchmarkTestMethodData@@QAEXXZ @ 132 NONAME ; void QBenchmarkTestMethodData::endDataRun(void)
+	?resultsAccepted@QBenchmarkTestMethodData@@QBE_NXZ @ 133 NONAME ; bool QBenchmarkTestMethodData::resultsAccepted(void) const
+	?verify@QTestResult@@SA_N_NPBD11H@Z @ 134 NONAME ; bool QTestResult::verify(bool, char const *, char const *, char const *, int)
+	??1QBenchmarkTestMethodData@@QAE@XZ @ 135 NONAME ; QBenchmarkTestMethodData::~QBenchmarkTestMethodData(void)
+	?addIgnoreMessage@QTestLog@@SAXW4QtMsgType@@PBD@Z @ 136 NONAME ; void QTestLog::addIgnoreMessage(enum QtMsgType, char const *)
+	?newData@QTestTable@@QAEPAVQTestData@@PBD@Z @ 137 NONAME ; class QTestData * QTestTable::newData(char const *)
+	?reset@QTestResult@@SAXXZ @ 138 NONAME ; void QTestResult::reset(void)
+	?currentTestData@QTestResult@@SAPAVQTestData@@XZ @ 139 NONAME ; class QTestData * QTestResult::currentTestData(void)
+	?skipCurrentTest@QTestResult@@SA_NXZ @ 140 NONAME ; bool QTestResult::skipCurrentTest(void)
+	?outputFileName@QTestLog@@SAPBDXZ @ 141 NONAME ; char const * QTestLog::outputFileName(void)
+	?adjustMedianIterationCount@QBenchmarkGlobalData@@QAEHXZ @ 142 NONAME ; int QBenchmarkGlobalData::adjustMedianIterationCount(void)
+	??0QTestLog@@AAE@XZ @ 143 NONAME ; QTestLog::QTestLog(void)
+	?compare@QTestResult@@SA_N_NPBDPAD2111H@Z @ 144 NONAME ; bool QTestResult::compare(bool, char const *, char *, char *, char const *, char const *, char const *, int)
+	?elementCount@QTestTable@@QBEHXZ @ 145 NONAME ; int QTestTable::elementCount(void) const
+	?setResult@QBenchmarkTestMethodData@@QAEXMW4QBenchmarkMetric@QTest@@_N@Z @ 146 NONAME ; void QBenchmarkTestMethodData::setResult(float, enum QTest::QBenchmarkMetric, bool)
+	?finishedCurrentTestFunction@QTestResult@@SAXXZ @ 147 NONAME ; void QTestResult::finishedCurrentTestFunction(void)
+	?setCurrentTestLocation@QTestResult@@SAXW4TestLocation@1@@Z @ 148 NONAME ; void QTestResult::setCurrentTestLocation(enum QTestResult::TestLocation)
+	?currentGlobalTestData@QTestResult@@SAPAVQTestData@@XZ @ 149 NONAME ; class QTestData * QTestResult::currentGlobalTestData(void)
+	?mode@QBenchmarkGlobalData@@QBE?AW4Mode@1@XZ @ 150 NONAME ; enum QBenchmarkGlobalData::Mode QBenchmarkGlobalData::mode(void) const
+	?setMaxWarnings@QTestLog@@SAXH@Z @ 151 NONAME ; void QTestLog::setMaxWarnings(int)
+	?failCount@QTestResult@@SAHXZ @ 152 NONAME ; int QTestResult::failCount(void)
+	?verboseLevel@QTestLog@@SAHXZ @ 153 NONAME ; int QTestLog::verboseLevel(void)
+	?passCount@QTestResult@@SAHXZ @ 154 NONAME ; int QTestResult::passCount(void)
+	?indexOf@QTestTable@@QBEHPBD@Z @ 155 NONAME ; int QTestTable::indexOf(char const *) const
+	?compare@QTestResult@@SA_N_NPBD1H@Z @ 156 NONAME ; bool QTestResult::compare(bool, char const *, char const *, int)
+	?startLogging@QTestLog@@SAXI@Z @ 157 NONAME ; void QTestLog::startLogging(unsigned int)
+	?addSkip@QTestLog@@SAXPBDW4SkipMode@QTest@@0H@Z @ 158 NONAME ; void QTestLog::addSkip(char const *, enum QTest::SkipMode, char const *, int)
+	?testTags@QTest@@3VQStringList@@A @ 159 NONAME ; class QStringList QTest::testTags
+	??1QTestLog@@AAE@XZ @ 160 NONAME ; QTestLog::~QTestLog(void)
+	?unhandledIgnoreMessages@QTestLog@@SAHXZ @ 161 NONAME ; int QTestLog::unhandledIgnoreMessages(void)
+	?info@QTestLog@@SAXPBD0H@Z @ 162 NONAME ; void QTestLog::info(char const *, char const *, int)
+	??1QBenchmarkGlobalData@@QAE@XZ @ 163 NONAME ; QBenchmarkGlobalData::~QBenchmarkGlobalData(void)
+	?isBenchmark@QBenchmarkTestMethodData@@QBE_NXZ @ 164 NONAME ; bool QBenchmarkTestMethodData::isBenchmark(void) const
+	?addSkip@QTestResult@@SAXPBDW4SkipMode@QTest@@0H@Z @ 165 NONAME ; void QTestResult::addSkip(char const *, enum QTest::SkipMode, char const *, int)
+	?skipCount@QTestResult@@SAHXZ @ 166 NONAME ; int QTestResult::skipCount(void)
+	?addXPass@QTestLog@@SAXPBD0H@Z @ 167 NONAME ; void QTestLog::addXPass(char const *, char const *, int)
 
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index 207447f..c514fbd 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -1282,7 +1282,7 @@ EXPORTS
 	_ZN23QEventDispatcherSymbian10startingUpEv @ 1281 NONAME
 	_ZN23QEventDispatcherSymbian10timerFiredEi @ 1282 NONAME
 	_ZN23QEventDispatcherSymbian11closingDownEv @ 1283 NONAME
-	_ZN23QEventDispatcherSymbian11socketFiredEP19QSocketActiveObject @ 1284 NONAME
+	_ZN23QEventDispatcherSymbian11socketFiredEP19QSocketActiveObject @ 1284 NONAME ABSENT
 	_ZN23QEventDispatcherSymbian13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 1285 NONAME
 	_ZN23QEventDispatcherSymbian13registerTimerEiiP7QObject @ 1286 NONAME
 	_ZN23QEventDispatcherSymbian15unregisterTimerEi @ 1287 NONAME
@@ -1439,7 +1439,7 @@ EXPORTS
 	_ZN31QAbstractEventDispatcherPrivate4initEv @ 1438 NONAME
 	_ZN31QNonContiguousByteDeviceFactory4wrapEP24QNonContiguousByteDevice @ 1439 NONAME
 	_ZN31QNonContiguousByteDeviceFactory6createEP10QByteArray @ 1440 NONAME
-	_ZN31QNonContiguousByteDeviceFactory6createEP11QRingBuffer @ 1441 NONAME
+	_ZN31QNonContiguousByteDeviceFactory6createEP11QRingBuffer @ 1441 NONAME ABSENT
 	_ZN31QNonContiguousByteDeviceFactory6createEP9QIODevice @ 1442 NONAME
 	_ZN4QDir10setCurrentERK7QString @ 1443 NONAME
 	_ZN4QDir10setSortingE6QFlagsINS_8SortFlagEE @ 1444 NONAME
@@ -3806,4 +3806,30 @@ EXPORTS
 	_ZNK13QElapsedTimer12nsecsElapsedEv @ 3805 NONAME
 	_ZNK11QMetaMethod8revisionEv @ 3806 NONAME
 	_ZNK13QMetaProperty8revisionEv @ 3807 NONAME
+	_Z25qt_symbianGetSocketServerv @ 3808 NONAME
+	_ZN13QActiveObject18maybeQueueForLaterEv @ 3809 NONAME
+	_ZN13QActiveObject21maybeDeferSocketEventEv @ 3810 NONAME
+	_ZN13QActiveObject21reactivateAndCompleteEv @ 3811 NONAME
+	_ZN13QActiveObject4waitE5QListIP7CActiveEi @ 3812 NONAME
+	_ZN13QActiveObject4waitEP7CActivei @ 3813 NONAME
+	_ZN13QActiveObjectC2EiP23QEventDispatcherSymbian @ 3814 NONAME
+	_ZN13QActiveObjectD0Ev @ 3815 NONAME
+	_ZN13QActiveObjectD1Ev @ 3816 NONAME
+	_ZN13QActiveObjectD2Ev @ 3817 NONAME
+	_ZN21QSymbianSocketManager12removeSocketERK7RSocket @ 3818 NONAME
+	_ZN21QSymbianSocketManager15getSocketServerEv @ 3819 NONAME
+	_ZN21QSymbianSocketManager20setDefaultConnectionEP11RConnection @ 3820 NONAME
+	_ZN21QSymbianSocketManager8instanceEv @ 3821 NONAME
+	_ZN21QSymbianSocketManager9addSocketERK7RSocket @ 3822 NONAME
+	_ZN21QSymbianSocketManagerC1Ev @ 3823 NONAME
+	_ZN21QSymbianSocketManagerC2Ev @ 3824 NONAME
+	_ZN21QSymbianSocketManagerD1Ev @ 3825 NONAME
+	_ZN21QSymbianSocketManagerD2Ev @ 3826 NONAME
+	_ZN31QNonContiguousByteDeviceFactory6createE14QSharedPointerI11QRingBufferE @ 3827 NONAME
+	_ZNK21QSymbianSocketManager12lookupSocketERK7RSocket @ 3828 NONAME
+	_ZNK21QSymbianSocketManager12lookupSocketEiR7RSocket @ 3829 NONAME
+	_ZNK21QSymbianSocketManager17defaultConnectionEv @ 3830 NONAME
+	_ZTI13QActiveObject @ 3831 NONAME
+	_ZTV13QActiveObject @ 3832 NONAME
+	gzungetc @ 3833 NONAME
 
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 722dee8..c28bfb5 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12337,4 +12337,24 @@ EXPORTS
 	_ZN12QTextControl23setWordSelectionEnabledEb @ 12336 NONAME
 	_ZNK12QTextControl13isDragEnabledEv @ 12337 NONAME
 	_ZNK12QTextControl22isWordSelectionEnabledEv @ 12338 NONAME
+	_ZN12QLineControl16updateMicroFocusEv @ 12339 NONAME
+	_ZN17QInternalMimeData11canReadDataERK7QString @ 12340 NONAME
+	_ZN17QInternalMimeData11qt_metacallEN11QMetaObject4CallEiPPv @ 12341 NONAME
+	_ZN17QInternalMimeData11qt_metacastEPKc @ 12342 NONAME
+	_ZN17QInternalMimeData13formatsHelperEPK9QMimeData @ 12343 NONAME
+	_ZN17QInternalMimeData15hasFormatHelperERK7QStringPK9QMimeData @ 12344 NONAME
+	_ZN17QInternalMimeData16renderDataHelperERK7QStringPK9QMimeData @ 12345 NONAME
+	_ZN17QInternalMimeData16staticMetaObjectE @ 12346 NONAME DATA 16
+	_ZN17QInternalMimeData19getStaticMetaObjectEv @ 12347 NONAME
+	_ZN17QInternalMimeDataC2Ev @ 12348 NONAME
+	_ZN17QInternalMimeDataD0Ev @ 12349 NONAME
+	_ZN17QInternalMimeDataD1Ev @ 12350 NONAME
+	_ZN17QInternalMimeDataD2Ev @ 12351 NONAME
+	_ZNK14QWidgetPrivate20assignedInputContextEv @ 12352 NONAME
+	_ZNK17QInternalMimeData10metaObjectEv @ 12353 NONAME
+	_ZNK17QInternalMimeData12retrieveDataERK7QStringN8QVariant4TypeE @ 12354 NONAME
+	_ZNK17QInternalMimeData7formatsEv @ 12355 NONAME
+	_ZNK17QInternalMimeData9hasFormatERK7QString @ 12356 NONAME
+	_ZTI17QInternalMimeData @ 12357 NONAME
+	_ZTV17QInternalMimeData @ 12358 NONAME
 
diff --git a/src/s60installs/eabi/QtNetworku.def b/src/s60installs/eabi/QtNetworku.def
index 9b989a7..672ae84 100644
--- a/src/s60installs/eabi/QtNetworku.def
+++ b/src/s60installs/eabi/QtNetworku.def
@@ -1181,4 +1181,9 @@ EXPORTS
 	_ZNK35QNetworkConfigurationManagerPrivate27configurationFromIdentifierERK7QString @ 1180 NONAME
 	_ZNK35QNetworkConfigurationManagerPrivate7enginesEv @ 1181 NONAME
 	_ZNK35QNetworkConfigurationManagerPrivate8isOnlineEv @ 1182 NONAME
+	_ZN10QSslSocket17setPeerVerifyNameERK7QString @ 1183 NONAME
+	_ZN22QNetworkSessionPrivate13nativeSessionER15QNetworkSession @ 1184 NONAME
+	_ZN22QNetworkSessionPrivate16nativeOpenSocketER15QNetworkSessionR7RSocketjjj @ 1185 NONAME
+	_ZN22QNetworkSessionPrivate22nativeOpenHostResolverER15QNetworkSessionR13RHostResolverjj @ 1186 NONAME
+	_ZNK10QSslSocket14peerVerifyNameEv @ 1187 NONAME
 
diff --git a/src/s60installs/eabi/QtTestu.def b/src/s60installs/eabi/QtTestu.def
index 5cb95ba..370466b 100644
--- a/src/s60installs/eabi/QtTestu.def
+++ b/src/s60installs/eabi/QtTestu.def
@@ -70,4 +70,98 @@ EXPORTS
 	_ZTI14QTestEventLoop @ 69 NONAME
 	_ZTV14QTestEventLoop @ 70 NONAME
 	_ZN5QTest18setBenchmarkResultEfNS_16QBenchmarkMetricE @ 71 NONAME
+	_ZN10QTestTable15globalTestTableEv @ 72 NONAME
+	_ZN10QTestTable16currentTestTableEv @ 73 NONAME
+	_ZN10QTestTable20clearGlobalTestTableEv @ 74 NONAME
+	_ZN10QTestTable7newDataEPKc @ 75 NONAME
+	_ZN10QTestTable9addColumnEiPKc @ 76 NONAME
+	_ZN10QTestTableC1Ev @ 77 NONAME
+	_ZN10QTestTableC2Ev @ 78 NONAME
+	_ZN10QTestTableD1Ev @ 79 NONAME
+	_ZN10QTestTableD2Ev @ 80 NONAME
+	_ZN11QTestResult10addFailureEPKcS1_i @ 81 NONAME
+	_ZN11QTestResult10expectFailEPKcS1_N5QTest12TestFailModeES1_i @ 82 NONAME
+	_ZN11QTestResult10testFailedEv @ 83 NONAME
+	_ZN11QTestResult13allDataPassedEv @ 84 NONAME
+	_ZN11QTestResult13ignoreMessageE9QtMsgTypePKc @ 85 NONAME
+	_ZN11QTestResult14currentDataTagEv @ 86 NONAME
+	_ZN11QTestResult15currentTestDataEv @ 87 NONAME
+	_ZN11QTestResult15skipCurrentTestEv @ 88 NONAME
+	_ZN11QTestResult17currentTestFailedEv @ 89 NONAME
+	_ZN11QTestResult18setCurrentTestDataEP9QTestData @ 90 NONAME
+	_ZN11QTestResult18setSkipCurrentTestEb @ 91 NONAME
+	_ZN11QTestResult19currentTestFunctionEv @ 92 NONAME
+	_ZN11QTestResult19currentTestLocationEv @ 93 NONAME
+	_ZN11QTestResult20currentGlobalDataTagEv @ 94 NONAME
+	_ZN11QTestResult20setCurrentTestObjectEPKc @ 95 NONAME
+	_ZN11QTestResult21currentGlobalTestDataEv @ 96 NONAME
+	_ZN11QTestResult21currentTestObjectNameEv @ 97 NONAME
+	_ZN11QTestResult22setCurrentTestFunctionEPKc @ 98 NONAME
+	_ZN11QTestResult22setCurrentTestLocationENS_12TestLocationE @ 99 NONAME
+	_ZN11QTestResult24setCurrentGlobalTestDataEP9QTestData @ 100 NONAME
+	_ZN11QTestResult27finishedCurrentTestFunctionEv @ 101 NONAME
+	_ZN11QTestResult5resetEv @ 102 NONAME
+	_ZN11QTestResult6verifyEbPKcS1_S1_i @ 103 NONAME
+	_ZN11QTestResult7addSkipEPKcN5QTest8SkipModeES1_i @ 104 NONAME
+	_ZN11QTestResult7compareEbPKcPcS2_S1_S1_S1_i @ 105 NONAME
+	_ZN11QTestResult7compareEbPKcS1_i @ 106 NONAME
+	_ZN11QTestResult9failCountEv @ 107 NONAME
+	_ZN11QTestResult9passCountEv @ 108 NONAME
+	_ZN11QTestResult9skipCountEv @ 109 NONAME
+	_ZN20QBenchmarkGlobalData14createMeasurerEv @ 110 NONAME
+	_ZN20QBenchmarkGlobalData26adjustMedianIterationCountEv @ 111 NONAME
+	_ZN20QBenchmarkGlobalData7currentE @ 112 NONAME DATA 4
+	_ZN20QBenchmarkGlobalData7setModeENS_4ModeE @ 113 NONAME
+	_ZN20QBenchmarkGlobalDataC1Ev @ 114 NONAME
+	_ZN20QBenchmarkGlobalDataC2Ev @ 115 NONAME
+	_ZN20QBenchmarkGlobalDataD1Ev @ 116 NONAME
+	_ZN20QBenchmarkGlobalDataD2Ev @ 117 NONAME
+	_ZN24QBenchmarkTestMethodData10endDataRunEv @ 118 NONAME
+	_ZN24QBenchmarkTestMethodData12beginDataRunEv @ 119 NONAME
+	_ZN24QBenchmarkTestMethodData20adjustIterationCountEi @ 120 NONAME
+	_ZN24QBenchmarkTestMethodData7currentE @ 121 NONAME DATA 4
+	_ZN24QBenchmarkTestMethodData9setResultEfN5QTest16QBenchmarkMetricEb @ 122 NONAME
+	_ZN24QBenchmarkTestMethodDataC1Ev @ 123 NONAME
+	_ZN24QBenchmarkTestMethodDataC2Ev @ 124 NONAME
+	_ZN24QBenchmarkTestMethodDataD1Ev @ 125 NONAME
+	_ZN24QBenchmarkTestMethodDataD2Ev @ 126 NONAME
+	_ZN5QTest13testFunctionsE @ 127 NONAME DATA 4
+	_ZN5QTest16qtest_qParseArgsEiPPcb @ 128 NONAME
+	_ZN5QTest23printAvailableFunctionsE @ 129 NONAME DATA 1
+	_ZN5QTest8testTagsE @ 130 NONAME DATA 4
+	_ZN8QTestLog10setLogModeENS_7LogModeE @ 131 NONAME
+	_ZN8QTestLog11stopLoggingEv @ 132 NONAME
+	_ZN8QTestLog12setFlushModeENS_9FlushModeE @ 133 NONAME
+	_ZN8QTestLog12startLoggingEj @ 134 NONAME
+	_ZN8QTestLog12startLoggingEv @ 135 NONAME
+	_ZN8QTestLog12verboseLevelEv @ 136 NONAME
+	_ZN8QTestLog14outputFileNameEv @ 137 NONAME
+	_ZN8QTestLog14redirectOutputEPKc @ 138 NONAME
+	_ZN8QTestLog14setMaxWarningsEi @ 139 NONAME
+	_ZN8QTestLog15setVerboseLevelEi @ 140 NONAME
+	_ZN8QTestLog16addIgnoreMessageE9QtMsgTypePKc @ 141 NONAME
+	_ZN8QTestLog17enterTestFunctionEPKc @ 142 NONAME
+	_ZN8QTestLog17leaveTestFunctionEv @ 143 NONAME
+	_ZN8QTestLog18addBenchmarkResultERK16QBenchmarkResult @ 144 NONAME
+	_ZN8QTestLog23unhandledIgnoreMessagesEv @ 145 NONAME
+	_ZN8QTestLog28printUnhandledIgnoreMessagesEv @ 146 NONAME
+	_ZN8QTestLog4infoEPKcS1_i @ 147 NONAME
+	_ZN8QTestLog4warnEPKc @ 148 NONAME
+	_ZN8QTestLog7addFailEPKcS1_i @ 149 NONAME
+	_ZN8QTestLog7addPassEPKc @ 150 NONAME
+	_ZN8QTestLog7addSkipEPKcN5QTest8SkipModeES1_i @ 151 NONAME
+	_ZN8QTestLog7logModeEv @ 152 NONAME
+	_ZN8QTestLog8addXFailEPKcS1_i @ 153 NONAME
+	_ZN8QTestLog8addXPassEPKcS1_i @ 154 NONAME
+	_ZN8QTestLogC1Ev @ 155 NONAME
+	_ZN8QTestLogC2Ev @ 156 NONAME
+	_ZN8QTestLogD1Ev @ 157 NONAME
+	_ZN8QTestLogD2Ev @ 158 NONAME
+	_ZNK10QTestTable12elementCountEv @ 159 NONAME
+	_ZNK10QTestTable13elementTypeIdEi @ 160 NONAME
+	_ZNK10QTestTable7dataTagEi @ 161 NONAME
+	_ZNK10QTestTable7indexOfEPKc @ 162 NONAME
+	_ZNK10QTestTable7isEmptyEv @ 163 NONAME
+	_ZNK10QTestTable8testDataEi @ 164 NONAME
+	_ZNK10QTestTable9dataCountEv @ 165 NONAME
 
-- 
cgit v0.12


From b10199ab328848e954c3701f745043ff697a2c27 Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Tue, 22 Mar 2011 16:22:34 +0100
Subject: ReplaceExtraCompilerCacheKey: Don't recreate "::" QString on each
 call.

Reviewed-by: Marius Storm-Olsen
---
 qmake/generators/makefile.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 7963976..9e2be31 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -1485,18 +1485,20 @@ MakefileGenerator::createObjectList(const QStringList &sources)
 
 ReplaceExtraCompilerCacheKey::ReplaceExtraCompilerCacheKey(const QString &v, const QStringList &i, const QStringList &o)
 {
+    static QString doubleColon = QLatin1String("::");
+
     hash = 0;
     pwd = qmake_getpwd();
     var = v;
     {
         QStringList il = i;
         il.sort();
-        in = il.join("::");
+        in = il.join(doubleColon);
     }
     {
         QStringList ol = o;
         ol.sort();
-        out = ol.join("::");
+        out = ol.join(doubleColon);
     }
 }
 
-- 
cgit v0.12


From cea4ae150bef0f24b0e8385d47b06a9f6b8197c3 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 23 Mar 2011 15:37:41 +0100
Subject: Fix tst_QVariant::qvariant_cast_QObject

qvariant_cast_QObject_data was creating the QVariant wrong,
The QVariant(int, void*) constructor take a pointer to the value
of the type ObjectStar (hence a pointer to a pointer)

Task-number: QTBUG-18257
---
 tests/auto/qvariant/tst_qvariant.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qvariant/tst_qvariant.cpp b/tests/auto/qvariant/tst_qvariant.cpp
index 62babdb..2e57264 100644
--- a/tests/auto/qvariant/tst_qvariant.cpp
+++ b/tests/auto/qvariant/tst_qvariant.cpp
@@ -2660,7 +2660,10 @@ void tst_QVariant::qvariant_cast_QObject_data() {
 
     QTest::addColumn<QVariant>("data");
     QTest::addColumn<bool>("success");
-    QTest::newRow("from QObject") << QVariant(QMetaType::QObjectStar, new QObject(this)) << true;
+    QObject *obj = new QObject(this);
+    obj->setObjectName(QString::fromLatin1("Hello"));
+    QTest::newRow("from QObject") << QVariant(QMetaType::QObjectStar, &obj) << true;
+    QTest::newRow("from QObject2") << QVariant::fromValue(obj) << true;
     QTest::newRow("from String") << QVariant(QLatin1String("1, 2, 3")) << false;
     QTest::newRow("from int") << QVariant((int) 123) << false;
 }
@@ -2672,6 +2675,9 @@ void tst_QVariant::qvariant_cast_QObject() {
 
     QObject *o = qvariant_cast<QObject *>(data);
     QCOMPARE(o != 0, success);
+    if (success) {
+        QCOMPARE(o->objectName(), QString::fromLatin1("Hello"));
+    }
 }
 
 Q_DECLARE_METATYPE(qint8);
-- 
cgit v0.12


From 7d3832891e8229051d7ddc420cd0a323a4f5d17a Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 23 Mar 2011 16:09:31 +0100
Subject: tst_qnetworkreply: Use proper Content-Type

Reviewed-by: Peter Hartmann
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index f8a9530..a5f1577 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -1768,6 +1768,7 @@ void tst_QNetworkReply::postToHttp()
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
 
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     QNetworkReplyPtr reply;
 
     QFETCH(QByteArray, data);
@@ -1794,6 +1795,7 @@ void tst_QNetworkReply::postToHttpSynchronous()
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
 
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
 
     request.setAttribute(
             QNetworkRequest::SynchronousRequestAttribute,
@@ -3408,6 +3410,8 @@ void tst_QNetworkReply::ioPostToHttpFromFile()
 
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
+
     QNetworkReplyPtr reply = manager.post(request, &sourceFile);
 
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
@@ -3484,8 +3488,10 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
     socketpair.endPoints[0]->write(data);
 
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
+
     manager.setProxy(proxy);
-    QNetworkReplyPtr reply = manager.post(QNetworkRequest(url), socketpair.endPoints[1]);
+    QNetworkReplyPtr reply = manager.post(request, socketpair.endPoints[1]);
     socketpair.endPoints[0]->close();
 
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
@@ -3558,6 +3564,7 @@ void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous()
 
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     request.setAttribute(
             QNetworkRequest::SynchronousRequestAttribute,
             true);
@@ -3587,7 +3594,8 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileToEnd()
 
     QUrl url = "http://" + QtNetworkSettings::serverName() + "/qtest/protected/cgi-bin/md5sum.cgi";
     QNetworkRequest request(url);
-    QNetworkReplyPtr reply = manager.post(QNetworkRequest(url), &sourceFile);
+    request.setRawHeader("Content-Type", "application/octet-stream");
+    QNetworkReplyPtr reply = manager.post(request, &sourceFile);
 
     connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
     connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
@@ -3613,6 +3621,7 @@ void tst_QNetworkReply::ioPostToHttpFromMiddleOfFileFiveBytes()
 
     QUrl url = "http://" + QtNetworkSettings::serverName() + "/qtest/protected/cgi-bin/md5sum.cgi";
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     // only send 5 bytes
     request.setHeader(QNetworkRequest::ContentLengthHeader, 5);
     QVERIFY(request.header(QNetworkRequest::ContentLengthHeader).isValid());
@@ -3673,6 +3682,7 @@ void tst_QNetworkReply::ioPostToHttpNoBufferFlag()
 
     QUrl url = "http://" + QtNetworkSettings::serverName() + "/qtest/protected/cgi-bin/md5sum.cgi";
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     // disallow buffering
     request.setAttribute(QNetworkRequest::DoNotBufferUploadDataAttribute, true);
     request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());
@@ -3735,6 +3745,7 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
     // create the request
     QUrl url = QUrl(QString("https://127.0.0.1:%1/").arg(server.serverPort()));
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     QNetworkReplyPtr reply = manager.post(request, &sourceFile);
     QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
     connect(&server, SIGNAL(newEncryptedConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
@@ -3956,6 +3967,7 @@ void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress()
     // create the request
     QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort()));
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     QNetworkReplyPtr reply = manager.post(request, &buffer);
     QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
     connect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
@@ -4302,6 +4314,7 @@ void tst_QNetworkReply::receiveCookiesFromHttp()
     QByteArray data = cookieString.toLatin1() + '\n';
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/set-cookie.cgi");
     QNetworkRequest request(url);
+    request.setRawHeader("Content-Type", "application/octet-stream");
     QNetworkReplyPtr reply;
     RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::PostOperation, request, reply, data));
 
@@ -4329,7 +4342,7 @@ void tst_QNetworkReply::receiveCookiesFromHttpSynchronous()
     QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/set-cookie.cgi");
 
     QNetworkRequest request(url);
-
+    request.setRawHeader("Content-Type", "application/octet-stream");
     request.setAttribute(
             QNetworkRequest::SynchronousRequestAttribute,
             true);
-- 
cgit v0.12


From 9ca3f9c6b6ae50c6b8a19d5e4b26bff15d5421e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 23 Mar 2011 07:01:56 +0100
Subject: Lighthouse: Wayland, implement gl_integration

---
 .../platforms/eglconvenience/qeglconvenience.h     |   4 -
 .../wayland/gl_integration/gl_integration.pri      |  13 ++
 .../gl_integration/qwaylandglintegration.cpp       |  11 ++
 .../wayland/gl_integration/qwaylandglintegration.h |  20 +++
 .../gl_integration/qwaylandglwindowsurface.cpp     | 181 ++++++++++++++++++++
 .../gl_integration/qwaylandglwindowsurface.h       |  69 ++++++++
 .../wayland_egl/qwaylandeglinclude.h               |  16 ++
 .../wayland_egl/qwaylandeglintegration.cpp         |  48 ++++++
 .../wayland_egl/qwaylandeglintegration.h           |  32 ++++
 .../wayland_egl/qwaylandeglwindow.cpp              | 112 +++++++++++++
 .../gl_integration/wayland_egl/qwaylandeglwindow.h |  71 ++++++++
 .../wayland_egl/qwaylandglcontext.cpp              | 155 +++++++++++++++++
 .../gl_integration/wayland_egl/qwaylandglcontext.h |  81 +++++++++
 .../gl_integration/wayland_egl/wayland_egl.pri     |  12 ++
 src/plugins/platforms/wayland/qwaylanddisplay.cpp  |  30 ++--
 src/plugins/platforms/wayland/qwaylanddisplay.h    |  17 +-
 .../platforms/wayland/qwaylanddrmsurface.cpp       | 183 ---------------------
 src/plugins/platforms/wayland/qwaylanddrmsurface.h |  70 --------
 .../platforms/wayland/qwaylandeglwindow.cpp        | 113 -------------
 src/plugins/platforms/wayland/qwaylandeglwindow.h  |  68 --------
 .../platforms/wayland/qwaylandglcontext.cpp        | 155 -----------------
 src/plugins/platforms/wayland/qwaylandglcontext.h  |  81 ---------
 src/plugins/platforms/wayland/qwaylandinclude.h    |  63 -------
 .../platforms/wayland/qwaylandintegration.cpp      |  14 +-
 src/plugins/platforms/wayland/qwaylandwindow.h     |   1 -
 src/plugins/platforms/wayland/wayland.pro          |  18 +-
 26 files changed, 852 insertions(+), 786 deletions(-)
 create mode 100644 src/plugins/platforms/wayland/gl_integration/gl_integration.pri
 create mode 100644 src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri
 delete mode 100644 src/plugins/platforms/wayland/qwaylanddrmsurface.cpp
 delete mode 100644 src/plugins/platforms/wayland/qwaylanddrmsurface.h
 delete mode 100644 src/plugins/platforms/wayland/qwaylandeglwindow.cpp
 delete mode 100644 src/plugins/platforms/wayland/qwaylandeglwindow.h
 delete mode 100644 src/plugins/platforms/wayland/qwaylandglcontext.cpp
 delete mode 100644 src/plugins/platforms/wayland/qwaylandglcontext.h
 delete mode 100644 src/plugins/platforms/wayland/qwaylandinclude.h

diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.h b/src/plugins/platforms/eglconvenience/qeglconvenience.h
index 8668095..fab1cb0 100644
--- a/src/plugins/platforms/eglconvenience/qeglconvenience.h
+++ b/src/plugins/platforms/eglconvenience/qeglconvenience.h
@@ -46,11 +46,7 @@
 #include <QtGui/QPlatformWindowFormat>
 #include <QtCore/QVector>
 
-#ifdef Q_PLATFORM_WAYLAND
-#include "qwaylandinclude.h"
-#else
 #include <EGL/egl.h>
-#endif
 QT_BEGIN_NAMESPACE
 
 QVector<EGLint> q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format);
diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
new file mode 100644
index 0000000..8a792a5
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -0,0 +1,13 @@
+HEADERS += \
+    $$PWD/qwaylandglintegration.h \
+    $$PWD/qwaylandglwindowsurface.h
+
+SOURCES += \
+    $$PWD/qwaylandglintegration.cpp \
+    $$PWD/qwaylandglwindowsurface.cpp
+
+wayland_egl {
+    include ($$PWD/wayland_egl/wayland_egl.pri)
+}
+
+
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
new file mode 100644
index 0000000..9a0a824
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
@@ -0,0 +1,11 @@
+#include "qwaylandglintegration.h"
+
+QWaylandGLIntegration::QWaylandGLIntegration()
+{
+
+}
+
+QWaylandGLIntegration::~QWaylandGLIntegration()
+{
+
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
new file mode 100644
index 0000000..a1f6b2c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
@@ -0,0 +1,20 @@
+#ifndef QWAYLANDGLINTEGRATION_H
+#define QWAYLANDGLINTEGRATION_H
+
+class QWaylandWindow;
+class QWidget;
+
+class QWaylandGLIntegration
+{
+public:
+    QWaylandGLIntegration();
+    virtual ~QWaylandGLIntegration();
+
+    virtual void initialize() = 0;
+
+    virtual QWaylandWindow *createEglWindow(QWidget *widget) = 0;
+
+    static QWaylandGLIntegration *createEglIntegration(struct wl_display *waylandDisplay);
+};
+
+#endif // QWAYLANDGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
new file mode 100644
index 0000000..ca9fb97
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandglwindowsurface.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandwindow.h"
+#include "qwaylandscreen.h"
+
+#include <QtOpenGL/QGLFramebufferObject>
+#include <QtOpenGL/QGLContext>
+
+#include <QtOpenGL/private/qglengineshadermanager_p.h>
+
+QT_BEGIN_NAMESPACE
+
+static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, const QRectF &br)
+{
+    const GLenum target = GL_TEXTURE_2D;
+    QRectF src = br.isEmpty()
+        ? QRectF(QPointF(), texSize)
+        : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size());
+
+    if (target == GL_TEXTURE_2D) {
+        qreal width = texSize.width();
+        qreal height = texSize.height();
+
+        src.setLeft(src.left() / width);
+        src.setRight(src.right() / width);
+        src.setTop(src.top() / height);
+        src.setBottom(src.bottom() / height);
+    }
+
+    const GLfloat tx1 = src.left();
+    const GLfloat tx2 = src.right();
+    const GLfloat ty1 = src.top();
+    const GLfloat ty2 = src.bottom();
+
+    GLfloat texCoordArray[4*2] = {
+        tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1
+    };
+
+    GLfloat vertexArray[4*2];
+    vertexArray[0] = rect.left(); vertexArray[1] = rect.top();
+    vertexArray[2] = rect.right(); vertexArray[3] = rect.top();
+    vertexArray[4] = rect.right(); vertexArray[5] = rect.bottom();
+    vertexArray[6] = rect.left(); vertexArray[7] = rect.bottom();
+
+    glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray);
+    glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray);
+
+    glBindTexture(target, tex_id);
+
+    glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+    glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
+    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+    glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+    glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
+
+    glBindTexture(target, 0);
+}
+
+static void blitTexture(QGLContext *ctx, GLuint texture, const QSize &viewport, const QSize &texSize, const QRect &targetRect, const QRect &sourceRect)
+{
+    glDisable(GL_DEPTH_TEST);
+    glDisable(GL_SCISSOR_TEST);
+    glDisable(GL_BLEND);
+    glViewport(0, 0, viewport.width(), viewport.height());
+
+    QGLShaderProgram *blitProgram =
+        QGLEngineSharedShaders::shadersForContext(ctx)->blitProgram();
+    blitProgram->bind();
+    blitProgram->setUniformValue("imageTexture", 0 /*QT_IMAGE_TEXTURE_UNIT*/);
+
+    // The shader manager's blit program does not multiply the
+    // vertices by the pmv matrix, so we need to do the effect
+    // of the orthographic projection here ourselves.
+    QRectF r;
+    qreal w = viewport.width();
+    qreal h = viewport.height();
+    r.setLeft((targetRect.left() / w) * 2.0f - 1.0f);
+    if (targetRect.right() == (viewport.width() - 1))
+        r.setRight(1.0f);
+    else
+        r.setRight((targetRect.right() / w) * 2.0f - 1.0f);
+    r.setBottom((targetRect.top() / h) * 2.0f - 1.0f);
+    if (targetRect.bottom() == (viewport.height() - 1))
+        r.setTop(1.0f);
+    else
+        r.setTop((targetRect.bottom() / w) * 2.0f - 1.0f);
+
+    drawTexture(r, texture, texSize, sourceRect);
+}
+
+QWaylandGLWindowSurface::QWaylandGLWindowSurface(QWidget *window)
+    : QWindowSurface(window)
+    , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+    , mPaintDevice(0)
+{
+
+}
+
+QWaylandGLWindowSurface::~QWaylandGLWindowSurface()
+{
+    delete mPaintDevice;
+}
+
+QPaintDevice *QWaylandGLWindowSurface::paintDevice()
+{
+    return mPaintDevice;
+}
+
+void QWaylandGLWindowSurface::beginPaint(const QRegion &)
+{
+    window()->platformWindow()->glContext()->makeCurrent();
+    glClearColor(0,0,0,0xff);
+    glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void QWaylandGLWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+    Q_UNUSED(offset);
+    Q_UNUSED(region);
+    QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow();
+
+    if (mPaintDevice->isBound())
+        mPaintDevice->release();
+
+    QRect rect(0,0,size().width(),size().height());
+    QGLContext *ctx = QGLContext::fromPlatformGLContext(ww->glContext());
+    blitTexture(ctx,mPaintDevice->texture(),size(),mPaintDevice->size(),rect,rect);
+    ww->glContext()->swapBuffers();
+}
+
+void QWaylandGLWindowSurface::resize(const QSize &size)
+{
+    QWindowSurface::resize(size);
+    window()->platformWindow()->glContext()->makeCurrent();
+    delete mPaintDevice;
+    mPaintDevice = new QGLFramebufferObject(size,QGLFramebufferObject::CombinedDepthStencil,GL_TEXTURE_2D,GL_RGBA);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
new file mode 100644
index 0000000..faff872
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDDRMSURFACE_H
+#define QWAYLANDDRMSURFACE_H
+
+#include "qwaylanddisplay.h"
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+class QGLFramebufferObject;
+
+class QWaylandGLWindowSurface : public QWindowSurface
+{
+public:
+    QWaylandGLWindowSurface(QWidget *window);
+    ~QWaylandGLWindowSurface();
+
+    void beginPaint(const QRegion &);
+
+    QPaintDevice *paintDevice();
+    void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+
+    void resize(const QSize &size);
+
+private:
+    QWaylandDisplay *mDisplay;
+    QGLFramebufferObject *mPaintDevice;
+};
+
+#endif // QWAYLANDDRMSURFACE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
new file mode 100644
index 0000000..778c3db
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
@@ -0,0 +1,16 @@
+#ifndef QWAYLANDEGLINCLUDE_H
+#define QWAYLANDEGLINCLUDE_H
+
+#include <wayland-client.h>
+
+#include <wayland-egl.h>
+
+#define GL_GLEXT_PROTOTYPES
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#endif // QWAYLANDEGLINCLUDE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
new file mode 100644
index 0000000..eb46bc7
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -0,0 +1,48 @@
+#include "qwaylandeglintegration.h"
+
+#include "qwaylandeglwindow.h"
+
+QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay)
+    : mWaylandDisplay(waylandDisplay)
+    , mNativeEglDisplay(wl_egl_display_create(mWaylandDisplay))
+{
+}
+
+QWaylandEglIntegration::~QWaylandEglIntegration()
+{
+    eglTerminate(mEglDisplay);
+}
+
+void QWaylandEglIntegration::initialize()
+{
+    EGLint major,minor;
+    mEglDisplay = eglGetDisplay((EGLNativeDisplayType)mNativeEglDisplay);
+    if (mEglDisplay == NULL) {
+        qWarning("EGL not available");
+    } else {
+        if (!eglInitialize(mEglDisplay, &major, &minor)) {
+            qWarning("failed to initialize EGL display");
+            return;
+        }
+    }
+}
+
+QWaylandWindow *QWaylandEglIntegration::createEglWindow(QWidget *window)
+{
+    return new QWaylandEglWindow(window);
+}
+
+EGLDisplay QWaylandEglIntegration::eglDisplay() const
+{
+    return mEglDisplay;
+}
+
+wl_egl_display * QWaylandEglIntegration::nativeDisplay() const
+{
+    return mNativeEglDisplay;
+}
+
+QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(wl_display *waylandDisplay)
+{
+    return new QWaylandEglIntegration(waylandDisplay);
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
new file mode 100644
index 0000000..8b166ce
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
@@ -0,0 +1,32 @@
+#ifndef QWAYLANDEGLINTEGRATION_H
+#define QWAYLANDEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include "qwaylandeglinclude.h"
+
+class QWaylandWindow;
+class QWidget;
+
+class QWaylandEglIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandEglIntegration(struct wl_display *waylandDisplay);
+    ~QWaylandEglIntegration();
+
+    void initialize();
+
+    QWaylandWindow *createEglWindow(QWidget *window);
+
+    EGLDisplay eglDisplay() const;
+    struct wl_egl_display *nativeDisplay() const;
+private:
+    struct wl_display *mWaylandDisplay;
+
+    EGLDisplay mEglDisplay;
+    struct wl_egl_display *mNativeEglDisplay;
+
+
+};
+
+#endif // QWAYLANDEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
new file mode 100644
index 0000000..a9aa46f
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandeglwindow.h"
+
+#include "qwaylandscreen.h"
+#include "qwaylandglcontext.h"
+
+QWaylandEglWindow::QWaylandEglWindow(QWidget *window)
+    : QWaylandWindow(window)
+    , mGLContext(0)
+    , mWaylandEglWindow(0)
+{
+    mEglIntegration = static_cast<QWaylandEglIntegration *>(mDisplay->eglIntegration());
+    //super creates a new surface
+    newSurfaceCreated();
+}
+
+QWaylandEglWindow::~QWaylandEglWindow()
+{
+    delete mGLContext;
+}
+
+QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
+{
+    return QWaylandWindow::Egl;
+}
+
+void QWaylandEglWindow::setGeometry(const QRect &rect)
+{
+    QWaylandWindow::setGeometry(rect);
+    if (mWaylandEglWindow) {
+        wl_egl_window_resize(mWaylandEglWindow,rect.width(),rect.height(),0,0);
+    }
+}
+
+void QWaylandEglWindow::setParent(const QPlatformWindow *parent)
+{
+    const QWaylandWindow *wParent = static_cast<const QWaylandWindow *>(parent);
+
+    mParentWindow = wParent;
+}
+
+QPlatformGLContext * QWaylandEglWindow::glContext() const
+{
+    if (!mGLContext) {
+        QWaylandEglWindow *that = const_cast<QWaylandEglWindow *>(this);
+        that->mGLContext = new QWaylandGLContext(mEglIntegration->eglDisplay(),widget()->platformWindowFormat());
+
+        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
+        EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
+        that->mGLContext->setEglSurface(surface);
+    }
+
+    return mGLContext;
+}
+
+void QWaylandEglWindow::newSurfaceCreated()
+{
+    if (mWaylandEglWindow) {
+        wl_egl_window_destroy(mWaylandEglWindow);
+    }
+    wl_visual *visual = QWaylandScreen::waylandScreenFromWidget(widget())->visual();
+    QSize size = geometry().size();
+    if (!size.isValid())
+        size = QSize(0,0);
+
+    mWaylandEglWindow = wl_egl_window_create(mEglIntegration->nativeDisplay(),mSurface,size.width(),size.height(),visual);
+    if (mGLContext) {
+        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
+        EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
+        mGLContext->setEglSurface(surface);
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
new file mode 100644
index 0000000..ef1e02a
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDEGLWINDOW_H
+#define QWAYLANDEGLWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandeglinclude.h"
+#include "qwaylandeglintegration.h"
+
+class QWaylandGLContext;
+
+class QWaylandEglWindow : public QWaylandWindow
+{
+public:
+    QWaylandEglWindow(QWidget *window);
+    ~QWaylandEglWindow();
+    WindowType windowType() const;
+    void setGeometry(const QRect &rect);
+    void setParent(const QPlatformWindow *parent);
+    QPlatformGLContext *glContext() const;
+protected:
+    void newSurfaceCreated();
+private:
+    QWaylandEglIntegration *mEglIntegration;
+    QWaylandGLContext *mGLContext;
+    struct wl_egl_window *mWaylandEglWindow;
+    EGLConfig mConfig;
+
+    const QWaylandWindow *mParentWindow;
+};
+
+#endif // QWAYLANDEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
new file mode 100644
index 0000000..4444229
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandglcontext.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandwindow.h"
+
+#include "../../../eglconvenience/qeglconvenience.h"
+
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QPlatformWindowFormat>
+#include <QtCore/QMutex>
+
+Q_GLOBAL_STATIC(QMutex,qt_defaultSharedContextMutex)
+
+QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindowFormat &format)
+    : QPlatformGLContext()
+    , mEglDisplay(eglDisplay)
+    , mSurface(EGL_NO_SURFACE)
+    , mConfig(q_configFromQPlatformWindowFormat(mEglDisplay,format,true))
+    , mFormat(qt_qPlatformWindowFormatFromConfig(mEglDisplay,mConfig))
+{
+    QPlatformGLContext *sharePlatformContext = 0;
+    if (format.useDefaultSharedContext()) {
+        if (!QPlatformGLContext::defaultSharedContext()) {
+            if (qt_defaultSharedContextMutex()->tryLock()){
+                createDefaultSharedContex(eglDisplay);
+                qt_defaultSharedContextMutex()->unlock();
+            } else {
+                qt_defaultSharedContextMutex()->lock(); //wait to the the shared context is created
+                qt_defaultSharedContextMutex()->unlock();
+            }
+        }
+        sharePlatformContext = QPlatformGLContext::defaultSharedContext();
+    } else {
+        sharePlatformContext = format.sharedGLContext();
+    }
+    mFormat.setSharedContext(sharePlatformContext);
+    EGLContext shareEGLContext = EGL_NO_CONTEXT;
+    if (sharePlatformContext)
+        shareEGLContext = static_cast<const QWaylandGLContext*>(sharePlatformContext)->mContext;
+
+    eglBindAPI(EGL_OPENGL_ES_API);
+
+    QVector<EGLint> eglContextAttrs;
+    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+    eglContextAttrs.append(2);
+    eglContextAttrs.append(EGL_NONE);
+
+    mContext = eglCreateContext(mEglDisplay, mConfig,
+                                shareEGLContext, eglContextAttrs.constData());
+}
+
+QWaylandGLContext::QWaylandGLContext()
+    : QPlatformGLContext()
+    , mEglDisplay(0)
+    , mContext(EGL_NO_CONTEXT)
+    , mSurface(EGL_NO_SURFACE)
+    , mConfig(0)
+{ }
+
+QWaylandGLContext::~QWaylandGLContext()
+{
+    eglDestroyContext(mEglDisplay,mContext);
+}
+
+void QWaylandGLContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+    if (mSurface == EGL_NO_SURFACE) {
+        qWarning("makeCurrent with EGL_NO_SURFACE");
+    }
+    eglMakeCurrent(mEglDisplay, mSurface, mSurface, mContext);
+}
+
+void QWaylandGLContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+    eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+}
+
+void QWaylandGLContext::swapBuffers()
+{
+    eglSwapBuffers(mEglDisplay,mSurface);
+}
+
+void *QWaylandGLContext::getProcAddress(const QString &string)
+{
+    return (void *) eglGetProcAddress(string.toLatin1().data());
+}
+
+void QWaylandGLContext::createDefaultSharedContex(EGLDisplay display)
+{
+    QVector<EGLint> eglContextAttrs;
+    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+    eglContextAttrs.append(2);
+    eglContextAttrs.append(EGL_NONE);
+
+    QWaylandGLContext *defaultSharedContext = new QWaylandGLContext;
+    defaultSharedContext->mEglDisplay = display;
+    defaultSharedContext->mContext = eglCreateContext(mEglDisplay,mConfig,
+                                                      EGL_NO_CONTEXT, eglContextAttrs.constData());
+    QPlatformGLContext::setDefaultSharedContext(defaultSharedContext);
+}
+
+void QWaylandGLContext::setEglSurface(EGLSurface surface)
+{
+    doneCurrent();
+    mSurface = surface;
+}
+
+EGLConfig QWaylandGLContext::eglConfig() const
+{
+    return mConfig;
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
new file mode 100644
index 0000000..d530b1c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDGLCONTEXT_H
+#define QWAYLANDGLCONTEXT_H
+
+#include "qwaylanddisplay.h"
+
+#include <QtGui/QPlatformGLContext>
+
+#include "qwaylandeglinclude.h"
+
+class QWaylandWindow;
+class QWaylandGLWindowSurface;
+
+class QWaylandGLContext : public QPlatformGLContext {
+public:
+    QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindowFormat &format);
+    ~QWaylandGLContext();
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString&);
+
+    QPlatformWindowFormat platformWindowFormat() const { return mFormat; }
+
+    void setEglSurface(EGLSurface surface);
+    EGLConfig eglConfig() const;
+private:
+    EGLDisplay mEglDisplay;
+
+    EGLContext mContext;
+    EGLSurface mSurface;
+    EGLConfig mConfig;
+    QPlatformWindowFormat mFormat;
+
+    void createDefaultSharedContex(EGLDisplay eglDisplay);
+    QWaylandGLContext();
+
+};
+
+
+#endif // QWAYLANDGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri b/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri
new file mode 100644
index 0000000..bc97864
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri
@@ -0,0 +1,12 @@
+LIBS += -lwayland-egl -lEGL
+INCLUDEPATH += $$PWD
+SOURCES += $$PWD/qwaylandeglintegration.cpp \
+           $$PWD/qwaylandglcontext.cpp \
+           $$PWD/qwaylandeglwindow.cpp \
+           $$PWD/../../../eglconvenience/qeglconvenience.cpp
+
+HEADERS += $$PWD/qwaylandeglintegration.h \
+           $$PWD/qwaylandglcontext.h \
+           $$PWD/qwaylandeglwindow.h \
+           $$PWD/../../../eglconvenience/qeglconvenience.h \
+    gl_integration/wayland_egl/qwaylandeglinclude.h
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index 27f4334..eebc9de 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -46,6 +46,10 @@
 #include "qwaylandcursor.h"
 #include "qwaylandinputdevice.h"
 
+#ifdef QT_WAYLAND_GL_SUPPORT
+#include "gl_integration/qwaylandglintegration.h"
+#endif
+
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -78,9 +82,9 @@ struct wl_visual *QWaylandDisplay::argbPremultipliedVisual()
     return wl_display_get_premultiplied_argb_visual(mDisplay);
 }
 
-struct wl_egl_display *QWaylandDisplay::nativeDisplay()
+QWaylandGLIntegration * QWaylandDisplay::eglIntegration()
 {
-    return mNativeEglDisplay;
+    return mEglIntegration;
 }
 
 void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell,
@@ -176,9 +180,6 @@ void QWaylandDisplay::flushRequests(void)
 QWaylandDisplay::QWaylandDisplay(void)
     : mWriteNotifier(0)
 {
-#ifdef QT_WAYLAND_GL_SUPPORT
-    EGLint major, minor;
-#endif
     mDisplay = wl_display_connect(NULL);
     if (mDisplay == NULL) {
         fprintf(stderr, "failed to create display: %m\n");
@@ -189,25 +190,13 @@ QWaylandDisplay::QWaylandDisplay(void)
                                    QWaylandDisplay::displayHandleGlobal, this);
 
 #ifdef QT_WAYLAND_GL_SUPPORT
-    mNativeEglDisplay = wl_egl_display_create(mDisplay);
-#else
-    mNativeEglDisplay = 0;
+    mEglIntegration = QWaylandGLIntegration::createEglIntegration(mDisplay);
 #endif
 
     readEvents();
 
 #ifdef QT_WAYLAND_GL_SUPPORT
-    mEglDisplay = eglGetDisplay((EGLNativeDisplayType)mNativeEglDisplay);
-    if (mEglDisplay == NULL) {
-        qWarning("EGL not available");
-    } else {
-	if (!eglInitialize(mEglDisplay, &major, &minor)) {
-	    qWarning("failed to initialize EGL display");
-	    return;
-	}
-    }
-#else
-    mEglDisplay = 0;
+    mEglIntegration->initialize();
 #endif
 
     int fd = wl_display_get_fd(mDisplay, sourceUpdate, this);
@@ -225,7 +214,7 @@ QWaylandDisplay::~QWaylandDisplay(void)
 {
     close(mFd);
 #ifdef QT_WAYLAND_GL_SUPPORT
-    eglTerminate(mEglDisplay);
+    delete mEglIntegration;
 #endif
     wl_display_destroy(mDisplay);
 }
@@ -245,3 +234,4 @@ void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, void *data)
 {
     wl_display_frame_callback(mDisplay, func, data);
 }
+
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index d994ffe..535dcd6 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -44,18 +44,15 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QRect>
-#include <QtCore/QDataStream>
-#include <QtCore/QTextStream>
-#include <QtCore/QMetaType>
-#include <QtGui>
 
-#include "qwaylandinclude.h"
+#include <wayland-client.h>
 
 class QWaylandInputDevice;
 class QSocketNotifier;
 class QWaylandBuffer;
 class QPlatformScreen;
 class QWaylandScreen;
+class QWaylandGLIntegration;
 
 class QWaylandDisplay : public QObject {
     Q_OBJECT
@@ -73,9 +70,10 @@ public:
     struct wl_visual *rgbVisual();
     struct wl_visual *argbVisual();
     struct wl_visual *argbPremultipliedVisual();
-    struct wl_egl_display *nativeDisplay();
-    EGLDisplay eglDisplay() { return mEglDisplay; }
 
+#ifdef QT_WAYLAND_GL_SUPPORT
+    QWaylandGLIntegration *eglIntegration();
+#endif
     void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
 
     void syncCallback(wl_display_sync_func_t func, void *data);
@@ -98,8 +96,9 @@ private:
     QList<QWaylandInputDevice *> mInputDevices;
     QSocketNotifier *mReadNotifier;
     QSocketNotifier *mWriteNotifier;
-    EGLDisplay mEglDisplay;
-    struct wl_egl_display *mNativeEglDisplay;
+#ifdef QT_WAYLAND_GL_SUPPORT
+    QWaylandGLIntegration *mEglIntegration;
+#endif
 
     static void displayHandleGlobal(struct wl_display *display,
                                     uint32_t id,
diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp
deleted file mode 100644
index a8bc352..0000000
--- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylanddrmsurface.h"
-
-#include "qwaylanddisplay.h"
-#include "qwaylandwindow.h"
-#include "qwaylandscreen.h"
-
-#include <QtOpenGL/QGLFramebufferObject>
-#include <QtOpenGL/QGLContext>
-
-#include <QtOpenGL/private/qglengineshadermanager_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-
-static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, const QRectF &br)
-{
-    const GLenum target = GL_TEXTURE_2D;
-    QRectF src = br.isEmpty()
-        ? QRectF(QPointF(), texSize)
-        : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size());
-
-    if (target == GL_TEXTURE_2D) {
-        qreal width = texSize.width();
-        qreal height = texSize.height();
-
-        src.setLeft(src.left() / width);
-        src.setRight(src.right() / width);
-        src.setTop(src.top() / height);
-        src.setBottom(src.bottom() / height);
-    }
-
-    const GLfloat tx1 = src.left();
-    const GLfloat tx2 = src.right();
-    const GLfloat ty1 = src.top();
-    const GLfloat ty2 = src.bottom();
-
-    GLfloat texCoordArray[4*2] = {
-        tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1
-    };
-
-    GLfloat vertexArray[4*2];
-    vertexArray[0] = rect.left(); vertexArray[1] = rect.top();
-    vertexArray[2] = rect.right(); vertexArray[3] = rect.top();
-    vertexArray[4] = rect.right(); vertexArray[5] = rect.bottom();
-    vertexArray[6] = rect.left(); vertexArray[7] = rect.bottom();
-
-    glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray);
-    glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray);
-
-    glBindTexture(target, tex_id);
-
-    glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
-    glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-    glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
-    glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
-
-    glBindTexture(target, 0);
-}
-
-static void blitTexture(QGLContext *ctx, GLuint texture, const QSize &viewport, const QSize &texSize, const QRect &targetRect, const QRect &sourceRect)
-{
-    glDisable(GL_DEPTH_TEST);
-    glDisable(GL_SCISSOR_TEST);
-    glDisable(GL_BLEND);
-    glViewport(0, 0, viewport.width(), viewport.height());
-
-    QGLShaderProgram *blitProgram =
-        QGLEngineSharedShaders::shadersForContext(ctx)->blitProgram();
-    blitProgram->bind();
-    blitProgram->setUniformValue("imageTexture", 0 /*QT_IMAGE_TEXTURE_UNIT*/);
-
-    // The shader manager's blit program does not multiply the
-    // vertices by the pmv matrix, so we need to do the effect
-    // of the orthographic projection here ourselves.
-    QRectF r;
-    qreal w = viewport.width();
-    qreal h = viewport.height();
-    r.setLeft((targetRect.left() / w) * 2.0f - 1.0f);
-    if (targetRect.right() == (viewport.width() - 1))
-        r.setRight(1.0f);
-    else
-        r.setRight((targetRect.right() / w) * 2.0f - 1.0f);
-    r.setBottom((targetRect.top() / h) * 2.0f - 1.0f);
-    if (targetRect.bottom() == (viewport.height() - 1))
-        r.setTop(1.0f);
-    else
-        r.setTop((targetRect.bottom() / w) * 2.0f - 1.0f);
-
-    drawTexture(r, texture, texSize, sourceRect);
-}
-
-QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window)
-    : QWindowSurface(window)
-    , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
-    , mPaintDevice(0)
-{
-
-}
-
-QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface()
-{
-    delete mPaintDevice;
-}
-
-QPaintDevice *QWaylandDrmWindowSurface::paintDevice()
-{
-    return mPaintDevice;
-}
-
-void QWaylandDrmWindowSurface::beginPaint(const QRegion &)
-{
-    window()->platformWindow()->glContext()->makeCurrent();
-    glClearColor(0,0,0,0xff);
-    glClear(GL_COLOR_BUFFER_BIT);
-}
-
-void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
-{
-    Q_UNUSED(offset);
-    Q_UNUSED(region);
-    QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow();
-
-    if (mPaintDevice->isBound())
-        mPaintDevice->release();
-
-    QRect rect(0,0,size().width(),size().height());
-    QGLContext *ctx = QGLContext::fromPlatformGLContext(ww->glContext());
-    blitTexture(ctx,mPaintDevice->texture(),size(),mPaintDevice->size(),rect,rect);
-    ww->glContext()->swapBuffers();
-}
-
-void QWaylandDrmWindowSurface::resize(const QSize &size)
-{
-    QWindowSurface::resize(size);
-    window()->platformWindow()->glContext()->makeCurrent();
-    delete mPaintDevice;
-    mPaintDevice = new QGLFramebufferObject(size,QGLFramebufferObject::CombinedDepthStencil,GL_TEXTURE_2D,GL_RGBA);
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.h b/src/plugins/platforms/wayland/qwaylanddrmsurface.h
deleted file mode 100644
index 78418ee..0000000
--- a/src/plugins/platforms/wayland/qwaylanddrmsurface.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDDRMSURFACE_H
-#define QWAYLANDDRMSURFACE_H
-
-#include "qwaylanddisplay.h"
-
-#include <QtGui/private/qwindowsurface_p.h>
-
-class QGLFramebufferObject;
-
-class QWaylandDrmWindowSurface : public QWindowSurface
-{
-public:
-    QWaylandDrmWindowSurface(QWidget *window);
-    ~QWaylandDrmWindowSurface();
-
-    void beginPaint(const QRegion &);
-
-    QPaintDevice *paintDevice();
-    void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
-
-    void resize(const QSize &size);
-
-private:
-
-    QWaylandDisplay *mDisplay;
-    QGLFramebufferObject *mPaintDevice;
-};
-
-#endif // QWAYLANDDRMSURFACE_H
diff --git a/src/plugins/platforms/wayland/qwaylandeglwindow.cpp b/src/plugins/platforms/wayland/qwaylandeglwindow.cpp
deleted file mode 100644
index ed54bb9..0000000
--- a/src/plugins/platforms/wayland/qwaylandeglwindow.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandeglwindow.h"
-
-#include "qwaylandscreen.h"
-#include "qwaylandglcontext.h"
-#include "qwaylandinclude.h"
-
-QWaylandEglWindow::QWaylandEglWindow(QWidget *window)
-    : QWaylandWindow(window)
-    , mGLContext(0)
-    , mWaylandEglWindow(0)
-{
-    //super creates a new surface
-    newSurfaceCreated();
-}
-
-QWaylandEglWindow::~QWaylandEglWindow()
-{
-    if (mGLContext)
-        delete mGLContext;
-}
-
-QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
-{
-    return QWaylandWindow::Egl;
-}
-
-void QWaylandEglWindow::setGeometry(const QRect &rect)
-{
-    QWaylandWindow::setGeometry(rect);
-    if (mWaylandEglWindow) {
-        wl_egl_window_resize(mWaylandEglWindow,rect.width(),rect.height(),0,0);
-    }
-}
-
-void QWaylandEglWindow::setParent(const QPlatformWindow *parent)
-{
-    const QWaylandWindow *wParent = static_cast<const QWaylandWindow *>(parent);
-
-    mParentWindow = wParent;
-}
-
-QPlatformGLContext * QWaylandEglWindow::glContext() const
-{
-    if (!mGLContext) {
-        QWaylandEglWindow *that = const_cast<QWaylandEglWindow *>(this);
-        that->mGLContext = new QWaylandGLContext(that->mDisplay,widget()->platformWindowFormat());
-
-        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
-        EGLSurface surface = eglCreateWindowSurface(mDisplay->eglDisplay(),mGLContext->eglConfig(),window,NULL);
-        that->mGLContext->setEglSurface(surface);
-    }
-
-    return mGLContext;
-}
-
-void QWaylandEglWindow::newSurfaceCreated()
-{
-    if (mWaylandEglWindow) {
-        wl_egl_window_destroy(mWaylandEglWindow);
-    }
-    wl_visual *visual = QWaylandScreen::waylandScreenFromWidget(widget())->visual();
-    QSize size = geometry().size();
-    if (!size.isValid())
-        size = QSize(0,0);
-
-    mWaylandEglWindow = wl_egl_window_create(mDisplay->nativeDisplay(),mSurface,size.width(),size.height(),visual);
-    if (mGLContext) {
-        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
-        EGLSurface surface = eglCreateWindowSurface(mDisplay->eglDisplay(),mGLContext->eglConfig(),window,NULL);
-        mGLContext->setEglSurface(surface);
-    }
-}
diff --git a/src/plugins/platforms/wayland/qwaylandeglwindow.h b/src/plugins/platforms/wayland/qwaylandeglwindow.h
deleted file mode 100644
index 4b3bb5b..0000000
--- a/src/plugins/platforms/wayland/qwaylandeglwindow.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDEGLWINDOW_H
-#define QWAYLANDEGLWINDOW_H
-
-#include "qwaylandwindow.h"
-
-class QWaylandGLContext;
-
-class QWaylandEglWindow : public QWaylandWindow
-{
-public:
-    QWaylandEglWindow(QWidget *window);
-    ~QWaylandEglWindow();
-    WindowType windowType() const;
-    void setGeometry(const QRect &rect);
-    void setParent(const QPlatformWindow *parent);
-    QPlatformGLContext *glContext() const;
-protected:
-    void newSurfaceCreated();
-private:
-    QWaylandGLContext *mGLContext;
-    struct wl_egl_window *mWaylandEglWindow;
-    EGLConfig mConfig;
-
-    const QWaylandWindow *mParentWindow;
-};
-
-#endif // QWAYLANDEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/qwaylandglcontext.cpp
deleted file mode 100644
index 3720567..0000000
--- a/src/plugins/platforms/wayland/qwaylandglcontext.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandglcontext.h"
-
-#include "qwaylanddisplay.h"
-#include "qwaylandwindow.h"
-#include "qwaylanddrmsurface.h"
-
-#include "../eglconvenience/qeglconvenience.h"
-
-#include <QtGui/QPlatformGLContext>
-#include <QtGui/QPlatformWindowFormat>
-
-Q_GLOBAL_STATIC(QMutex,qt_defaultSharedContextMutex)
-
-QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format)
-    : QPlatformGLContext()
-    , mDisplay(wd)
-    , mSurface(EGL_NO_SURFACE)
-    , mConfig(q_configFromQPlatformWindowFormat(mDisplay->eglDisplay(),format,true))
-    , mFormat(qt_qPlatformWindowFormatFromConfig(mDisplay->eglDisplay(),mConfig))
-{
-    QPlatformGLContext *sharePlatformContext = 0;
-    if (format.useDefaultSharedContext()) {
-        if (!QPlatformGLContext::defaultSharedContext()) {
-            if (qt_defaultSharedContextMutex()->tryLock()){
-                createDefaultSharedContex(wd);
-                qt_defaultSharedContextMutex()->unlock();
-            } else {
-                qt_defaultSharedContextMutex()->lock(); //wait to the the shared context is created
-                qt_defaultSharedContextMutex()->unlock();
-            }
-        }
-        sharePlatformContext = QPlatformGLContext::defaultSharedContext();
-    } else {
-        sharePlatformContext = format.sharedGLContext();
-    }
-    mFormat.setSharedContext(sharePlatformContext);
-    EGLContext shareEGLContext = EGL_NO_CONTEXT;
-    if (sharePlatformContext)
-        shareEGLContext = static_cast<const QWaylandGLContext*>(sharePlatformContext)->mContext;
-
-    eglBindAPI(EGL_OPENGL_ES_API);
-
-    QVector<EGLint> eglContextAttrs;
-    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
-    eglContextAttrs.append(2);
-    eglContextAttrs.append(EGL_NONE);
-
-    mContext = eglCreateContext(mDisplay->eglDisplay(), mConfig,
-                                shareEGLContext, eglContextAttrs.constData());
-}
-
-QWaylandGLContext::QWaylandGLContext()
-    : QPlatformGLContext()
-    , mDisplay(0)
-    , mContext(EGL_NO_CONTEXT)
-    , mSurface(EGL_NO_SURFACE)
-    , mConfig(0)
-{ }
-
-QWaylandGLContext::~QWaylandGLContext()
-{
-    eglDestroyContext(mDisplay->eglDisplay(),mContext);
-}
-
-void QWaylandGLContext::makeCurrent()
-{
-    QPlatformGLContext::makeCurrent();
-    if (mSurface == EGL_NO_SURFACE) {
-        qWarning("makeCurrent with EGL_NO_SURFACE");
-    }
-    eglMakeCurrent(mDisplay->eglDisplay(), mSurface, mSurface, mContext);
-}
-
-void QWaylandGLContext::doneCurrent()
-{
-    QPlatformGLContext::doneCurrent();
-    eglMakeCurrent(mDisplay->eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-}
-
-void QWaylandGLContext::swapBuffers()
-{
-    eglSwapBuffers(mDisplay->eglDisplay(),mSurface);
-}
-
-void *QWaylandGLContext::getProcAddress(const QString &string)
-{
-    return (void *) eglGetProcAddress(string.toLatin1().data());
-}
-
-void QWaylandGLContext::createDefaultSharedContex(QWaylandDisplay *display)
-{
-    QVector<EGLint> eglContextAttrs;
-    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
-    eglContextAttrs.append(2);
-    eglContextAttrs.append(EGL_NONE);
-
-    QWaylandGLContext *defaultSharedContext = new QWaylandGLContext;
-    defaultSharedContext->mDisplay = display;
-    defaultSharedContext->mContext = eglCreateContext(mDisplay->eglDisplay(),mConfig,
-                                                      EGL_NO_CONTEXT, eglContextAttrs.constData());
-    QPlatformGLContext::setDefaultSharedContext(defaultSharedContext);
-}
-
-void QWaylandGLContext::setEglSurface(EGLSurface surface)
-{
-    doneCurrent();
-    mSurface = surface;
-}
-
-EGLConfig QWaylandGLContext::eglConfig() const
-{
-    return mConfig;
-}
-
diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.h b/src/plugins/platforms/wayland/qwaylandglcontext.h
deleted file mode 100644
index dd319fd..0000000
--- a/src/plugins/platforms/wayland/qwaylandglcontext.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDGLCONTEXT_H
-#define QWAYLANDGLCONTEXT_H
-
-#include "qwaylanddisplay.h"
-
-#include <QtGui/QPlatformGLContext>
-
-class QWaylandWindow;
-class QWaylandDrmWindowSurface;
-
-#include "qwaylandinclude.h"
-
-class QWaylandGLContext : public QPlatformGLContext {
-public:
-    QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format);
-    ~QWaylandGLContext();
-    void makeCurrent();
-    void doneCurrent();
-    void swapBuffers();
-    void* getProcAddress(const QString&);
-
-    QPlatformWindowFormat platformWindowFormat() const { return mFormat; }
-
-    void setEglSurface(EGLSurface surface);
-    EGLConfig eglConfig() const;
-private:
-    QWaylandDisplay *mDisplay;
-
-    EGLContext mContext;
-    EGLSurface mSurface;
-    EGLConfig mConfig;
-    QPlatformWindowFormat mFormat;
-
-    void createDefaultSharedContex(QWaylandDisplay *display);
-    QWaylandGLContext();
-
-};
-
-
-#endif // QWAYLANDGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/qwaylandinclude.h b/src/plugins/platforms/wayland/qwaylandinclude.h
deleted file mode 100644
index 0135251..0000000
--- a/src/plugins/platforms/wayland/qwaylandinclude.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDINCLUDE_H
-#define QWAYLANDINCLUDE_H
-
-#include <wayland-client.h>
-
-#ifdef QT_WAYLAND_GL_SUPPORT
-#include <wayland-egl.h>
-
-#define GL_GLEXT_PROTOTYPES
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#define EGL_EGLEXT_PROTOTYPES
- #include <EGL/egl.h>
- #include <EGL/eglext.h>
-
-#else
-typedef void* EGLDisplay;
-typedef void* EGLConfig;
-#endif
-
-#endif // QWAYLANDINCLUDE_H
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp
index 267a037..be78b82 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.cpp
+++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp
@@ -43,9 +43,7 @@
 
 #include "qwaylanddisplay.h"
 #include "qwaylandshmsurface.h"
-#include "qwaylanddrmsurface.h"
 #include "qwaylandshmwindow.h"
-#include "qwaylandeglwindow.h"
 
 #include "qgenericunixfontdatabase.h"
 
@@ -55,6 +53,8 @@
 
 #include <QtGui/private/qpixmap_raster_p.h>
 #ifdef QT_WAYLAND_GL_SUPPORT
+#include "gl_integration/qwaylandglintegration.h"
+#include "gl_integration/qwaylandglwindowsurface.h"
 #include <QtOpenGL/private/qpixmapdata_gl_p.h>
 #endif
 
@@ -91,10 +91,11 @@ QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type)
 QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const
 {
     Q_UNUSED(winId);
+#ifdef QT_WAYLAND_GL_SUPPORT
     bool useOpenGL = mUseOpenGL || (widget->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL);
     if (useOpenGL)
-        return new QWaylandEglWindow(widget);
-
+        return mDisplay->eglIntegration()->createEglWindow(widget);
+#endif
     return new QWaylandShmWindow(widget);
 }
 
@@ -102,10 +103,11 @@ QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId wi
 {
     Q_UNUSED(winId);
     Q_UNUSED(winId);
+#ifdef QT_WAYLAND_GL_SUPPORT
     bool useOpenGL = mUseOpenGL || (widget->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL);
     if (useOpenGL)
-        return new QWaylandDrmWindowSurface(widget);
-
+        return new QWaylandGLWindowSurface(widget);
+#endif
     return new QWaylandShmWindowSurface(widget);
 }
 
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
index 3b51ee7..afc214e 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -44,7 +44,6 @@
 
 #include <QtGui/QPlatformWindow>
 
-#include <stdint.h>
 #include "qwaylanddisplay.h"
 
 class QWaylandDisplay;
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index f78e4b3..b44857b 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -22,29 +22,21 @@ HEADERS =   qwaylandintegration.h \
             qwaylandwindow.h \
             qwaylandscreen.h \
             qwaylandshmsurface.h \
-            qwaylanddrmsurface.h \
             qwaylandbuffer.h \
-            qwaylandinclude.h \
-            qwaylandeglwindow.h \
             qwaylandshmwindow.h
 
 INCLUDEPATH += $$QMAKE_INCDIR_WAYLAND
 LIBS += $$QMAKE_LIBS_WAYLAND
 QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_WAYLAND
 
+INCLUDEPATH += $$PWD
+
 contains(QT_CONFIG, opengles2) {
+    DEFINES += QT_WAYLAND_GL_SUPPORT
     QT += opengl
-    LIBS += -lwayland-egl -lEGL
-
-    SOURCES += qwaylanddrmsurface.cpp \
-            qwaylandglcontext.cpp \
-            ../eglconvenience/qeglconvenience.cpp \
-            qwaylandeglwindow.cpp
 
-    HEADERS += qwaylandglcontext.h \
-            ../eglconvenience/qeglconvenience.h \
-
-    DEFINES += QT_WAYLAND_GL_SUPPORT
+    CONFIG += wayland_egl
+    include ($$PWD/gl_integration/gl_integration.pri)
 }
 
 include (../fontdatabases/genericunix/genericunix.pri)
-- 
cgit v0.12


From 11d327e3d2b90a8f1f68675cf1c93a67e26b273b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 23 Mar 2011 09:04:40 +0100
Subject: Lighthouse: Wayland: Move the frame throttling into the platform
 window

This is only for the shm case
---
 src/plugins/platforms/wayland/qwaylandshmsurface.cpp | 19 ++++---------------
 src/plugins/platforms/wayland/qwaylandshmwindow.cpp  | 19 ++++++++++++++++---
 src/plugins/platforms/wayland/qwaylandshmwindow.h    |  5 ++++-
 3 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
index 54da9a1..cc6b2a1 100644
--- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
@@ -95,7 +95,6 @@ QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window)
     : QWindowSurface(window)
     , mBuffer(0)
     , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
-    , mWaitingForFrameSync(false)
 {
 }
 
@@ -110,30 +109,20 @@ QPaintDevice *QWaylandShmWindowSurface::paintDevice()
 
 void QWaylandShmWindowSurface::beginPaint(const QRegion &)
 {
-    while (mWaitingForFrameSync) {
+    QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+    Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+    while (waylandWindow->waitingForFrameSync()) {
         mDisplay->iterate();
     }
 }
 
-void QWaylandShmWindowSurface::frameCallback(void *data, uint32_t time)
-{
-    QWaylandShmWindowSurface *self = static_cast<QWaylandShmWindowSurface*>(data);
-    self->mWaitingForFrameSync = false;
-}
-
 void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(widget);
     Q_UNUSED(offset);
     QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
     Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
-
-    QVector<QRect> rects = region.rects();
-    for (int i = 0; i < rects.size(); i++) {
-        waylandWindow->damage(rects.at(i));
-    }
-    mWaitingForFrameSync = true;
-    mDisplay->frameCallback(QWaylandShmWindowSurface::frameCallback, this);
+    waylandWindow->damage(region);
 }
 
 void QWaylandShmWindowSurface::resize(const QSize &size)
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
index cafd2d0..d7c44a4 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
@@ -46,6 +46,7 @@
 QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
     : QWaylandWindow(widget)
     , mBuffer(0)
+    , mWaitingForFrameSync(false)
 {
     newSurfaceCreated();
 }
@@ -75,10 +76,16 @@ void QWaylandShmWindow::attach(QWaylandBuffer *buffer)
 }
 
 
-void QWaylandShmWindow::damage(const QRect &rect)
+void QWaylandShmWindow::damage(const QRegion &region)
 {
-    wl_surface_damage(mSurface,
-                      rect.x(), rect.y(), rect.width(), rect.height());
+    QVector<QRect> rects = region.rects();
+    for (int i = 0; i < rects.size(); i++) {
+        const QRect rect = rects.at(i);
+        wl_surface_damage(mSurface,
+                          rect.x(), rect.y(), rect.width(), rect.height());
+    }
+    mWaitingForFrameSync = true;
+    mDisplay->frameCallback(QWaylandShmWindow::frameCallback, this);
 }
 
 void QWaylandShmWindow::newSurfaceCreated()
@@ -87,3 +94,9 @@ void QWaylandShmWindow::newSurfaceCreated()
         wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
     }
 }
+
+void QWaylandShmWindow::frameCallback(void *data, uint32_t time)
+{
+    QWaylandShmWindow *self = static_cast<QWaylandShmWindow*>(data);
+    self->mWaitingForFrameSync = false;
+}
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.h b/src/plugins/platforms/wayland/qwaylandshmwindow.h
index 14a29d2..669533c 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.h
@@ -53,11 +53,14 @@ public:
     WindowType windowType() const;
     QPlatformGLContext *glContext() const;
     void attach(QWaylandBuffer *buffer);
-    void damage(const QRect &rect);
+    void damage(const QRegion &region);
+    bool waitingForFrameSync() const { return mWaitingForFrameSync; }
 protected:
     void newSurfaceCreated();
 private:
+    static void frameCallback(void *data, uint32_t time);
     QWaylandBuffer *mBuffer;
+    bool mWaitingForFrameSync;
 };
 
 #endif // QWAYLANDSHMWINDOW_H
-- 
cgit v0.12


From 60941f8fccca4406cbfee826df738bea3d5695d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 23 Mar 2011 16:57:11 +0100
Subject: Lighthouse: Wayland: Added a xpixmap readback glcontext

It uses a x11 pixmap to render all gl content into, then reads it back
using glReadPixels. Then it sends it over the wire like any other shm
surface.
---
 .../platforms/eglconvenience/qeglconvenience.cpp   |   4 +-
 .../platforms/eglconvenience/qeglconvenience.h     |   2 +-
 .../wayland/gl_integration/gl_integration.pri      |   4 +
 .../wayland/gl_integration/qwaylandglintegration.h |   3 +-
 .../gl_integration/qwaylandglwindowsurface.cpp     |   2 +-
 .../wayland_egl/qwaylandeglintegration.cpp         |   6 +-
 .../xpixmap_egl/qwaylandxpixmapeglcontext.cpp      | 109 +++++++++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapeglcontext.h        |  39 ++++++++
 .../xpixmap_egl/qwaylandxpixmapeglintegration.cpp  |  70 +++++++++++++
 .../xpixmap_egl/qwaylandxpixmapeglintegration.h    |  42 ++++++++
 .../xpixmap_egl/qwaylandxpixmapwindow.cpp          |  38 +++++++
 .../xpixmap_egl/qwaylandxpixmapwindow.h            |  27 +++++
 .../gl_integration/xpixmap_egl/xpixmap_egl.pri     |  14 +++
 src/plugins/platforms/wayland/qwaylanddisplay.cpp  |   2 +-
 src/plugins/platforms/wayland/qwaylanddisplay.h    |   1 +
 src/plugins/platforms/wayland/qwaylandshmsurface.h |   3 -
 .../platforms/wayland/qwaylandshmwindow.cpp        |   2 +
 src/plugins/platforms/wayland/qwaylandshmwindow.h  |   1 +
 src/plugins/platforms/wayland/wayland.pro          |   1 +
 19 files changed, 359 insertions(+), 11 deletions(-)
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri

diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp
index ec4577a..df7abc1 100644
--- a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp
+++ b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp
@@ -206,12 +206,12 @@ bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes)
     return false;
 }
 
-EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat)
+EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat, int surfaceType)
 {
     EGLConfig cfg = 0;
     QVector<EGLint> configureAttributes = q_createConfigAttributesFromFormat(format);
     configureAttributes.append(EGL_SURFACE_TYPE); //we only support eglconfigs for windows for now
-    configureAttributes.append(EGL_WINDOW_BIT);
+    configureAttributes.append(surfaceType);
 
     configureAttributes.append(EGL_RENDERABLE_TYPE);
     if (format.windowApi() == QPlatformWindowFormat::OpenVG) {
diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.h b/src/plugins/platforms/eglconvenience/qeglconvenience.h
index fab1cb0..c7d3d61 100644
--- a/src/plugins/platforms/eglconvenience/qeglconvenience.h
+++ b/src/plugins/platforms/eglconvenience/qeglconvenience.h
@@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE
 
 QVector<EGLint> q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format);
 bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes);
-EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat = false);
+EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat = false, int surfaceType = EGL_WINDOW_BIT);
 QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config);
 bool q_hasEglExtension(EGLDisplay display,const char* extensionName);
 
diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index 8a792a5..ed2b021 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -10,4 +10,8 @@ wayland_egl {
     include ($$PWD/wayland_egl/wayland_egl.pri)
 }
 
+xpixmap_egl {
+    include ($$PWD/xpixmap_egl/xpixmap_egl.pri)
+}
+
 
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
index a1f6b2c..52a663f 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
@@ -2,6 +2,7 @@
 #define QWAYLANDGLINTEGRATION_H
 
 class QWaylandWindow;
+class QWaylandDisplay;
 class QWidget;
 
 class QWaylandGLIntegration
@@ -14,7 +15,7 @@ public:
 
     virtual QWaylandWindow *createEglWindow(QWidget *widget) = 0;
 
-    static QWaylandGLIntegration *createEglIntegration(struct wl_display *waylandDisplay);
+    static QWaylandGLIntegration *createEglIntegration(QWaylandDisplay *waylandDisplay);
 };
 
 #endif // QWAYLANDGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
index ca9fb97..8c83128 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
@@ -175,7 +175,7 @@ void QWaylandGLWindowSurface::resize(const QSize &size)
     QWindowSurface::resize(size);
     window()->platformWindow()->glContext()->makeCurrent();
     delete mPaintDevice;
-    mPaintDevice = new QGLFramebufferObject(size,QGLFramebufferObject::CombinedDepthStencil,GL_TEXTURE_2D,GL_RGBA);
+    mPaintDevice = new QGLFramebufferObject(size);
 }
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
index eb46bc7..255fbfe 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -1,5 +1,7 @@
 #include "qwaylandeglintegration.h"
 
+#include "gl_integration/qwaylandglintegration.h"
+
 #include "qwaylandeglwindow.h"
 
 QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay)
@@ -42,7 +44,7 @@ wl_egl_display * QWaylandEglIntegration::nativeDisplay() const
     return mNativeEglDisplay;
 }
 
-QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(wl_display *waylandDisplay)
+QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(QWaylandDisplay *waylandDisplay)
 {
-    return new QWaylandEglIntegration(waylandDisplay);
+    return new QWaylandEglIntegration(waylandDisplay->wl_display());
 }
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
new file mode 100644
index 0000000..e29ad97
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
@@ -0,0 +1,109 @@
+#include "qwaylandxpixmapeglcontext.h"
+
+#include "../../../eglconvenience/qeglconvenience.h"
+
+#include <QtOpenGL/QGLContext>
+
+#include "qwaylandshmsurface.h"
+
+#include <QtCore/QDebug>
+
+QXPixmapReadbackGLContext::QXPixmapReadbackGLContext(QWaylandXPixmapEglIntegration *eglIntegration, QWaylandXPixmapWindow *window)
+    : mEglIntegration(eglIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mPixmap(0)
+    , mConfig(q_configFromQPlatformWindowFormat(eglIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_PIXMAP_BIT))
+    , mPixmapSurface(EGL_NO_SURFACE)
+{
+    QVector<EGLint> eglContextAttrs;
+    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+    eglContextAttrs.append(2);
+    eglContextAttrs.append(EGL_NONE);
+
+    mContext = eglCreateContext(eglIntegration->eglDisplay(),mConfig,0,eglContextAttrs.constData());
+
+    geometryChanged();
+}
+
+QXPixmapReadbackGLContext::~QXPixmapReadbackGLContext()
+{
+    eglDestroyContext(mEglIntegration->eglDisplay(),mContext);
+}
+
+void QXPixmapReadbackGLContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+
+    while(mWindow->waitingForFrameSync()) {
+        mEglIntegration->waylandDisplay()->iterate();
+    }
+
+    eglMakeCurrent(mEglIntegration->eglDisplay(),mPixmapSurface,mPixmapSurface,mContext);
+}
+
+void QXPixmapReadbackGLContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+    eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QXPixmapReadbackGLContext::swapBuffers()
+{
+    eglSwapBuffers(mEglIntegration->eglDisplay(),mPixmapSurface);
+
+    if (QPlatformGLContext::currentContext() != this) {
+        makeCurrent();
+    }
+
+    QSize size = mWindow->geometry().size();
+
+    QImage img(size,QImage::Format_ARGB32);
+    const uchar *constBits = img.bits();
+    void *pixels = const_cast<uchar *>(constBits);
+
+    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+    img = img.mirrored();
+    constBits = img.bits();
+
+    const uchar *constDstBits = mBuffer->image()->bits();
+    uchar *dstBits = const_cast<uchar *>(constDstBits);
+    memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+}
+
+void * QXPixmapReadbackGLContext::getProcAddress(const QString &procName)
+{
+    return (void *) eglGetProcAddress(procName.toLatin1().data());
+}
+
+QPlatformWindowFormat QXPixmapReadbackGLContext::platformWindowFormat() const
+{
+    return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
+}
+
+void QXPixmapReadbackGLContext::geometryChanged()
+{
+    while (mWindow->waitingForFrameSync())
+        mEglIntegration->waylandDisplay()->iterate();
+
+    QSize size(mWindow->geometry().size());
+    delete mBuffer;
+    if (mPixmap)
+        XFreePixmap(mEglIntegration->xDisplay(),mPixmap);
+    if (mPixmapSurface != EGL_NO_SURFACE)
+        eglDestroySurface(mEglIntegration->eglDisplay(),mPixmapSurface);
+
+    mBuffer = new QWaylandShmBuffer(mEglIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+    mWindow->attach(mBuffer);
+    mPixmap = XCreatePixmap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),size.width(),size.height(),mEglIntegration->depth());
+    XSync(mEglIntegration->xDisplay(),False);
+
+    mPixmapSurface = eglCreatePixmapSurface(mEglIntegration->eglDisplay(),mConfig,mPixmap,0);
+    if (mPixmapSurface == EGL_NO_SURFACE) {
+        qDebug() << "Could not make egl surface out of pixmap :(";
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
new file mode 100644
index 0000000..e6c6e8d
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
@@ -0,0 +1,39 @@
+#ifndef QXPIXMAPREADBACKGLCONTEXT_H
+#define QXPIXMAPREADBACKGLCONTEXT_H
+
+#include <QPlatformGLContext>
+#include <QtGui/QWidget>
+
+#include "qwaylandxpixmapeglintegration.h"
+#include "qwaylandxpixmapwindow.h"
+
+class QWaylandShmBuffer;
+
+class QXPixmapReadbackGLContext : public QPlatformGLContext
+{
+public:
+    QXPixmapReadbackGLContext(QWaylandXPixmapEglIntegration *eglIntegration, QWaylandXPixmapWindow *window);
+    ~QXPixmapReadbackGLContext();
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    virtual QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandXPixmapEglIntegration *mEglIntegration;
+    QWaylandXPixmapWindow *mWindow;
+    QWaylandShmBuffer *mBuffer;
+
+    Pixmap mPixmap;
+
+    EGLConfig mConfig;
+    EGLContext mContext;
+    EGLSurface mPixmapSurface;
+};
+
+#endif // QXPIXMAPREADBACKGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
new file mode 100644
index 0000000..c9f244c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
@@ -0,0 +1,70 @@
+#include "qwaylandxpixmapeglintegration.h"
+
+#include <QDebug>
+
+#include "qwaylandxpixmapwindow.h"
+
+QWaylandXPixmapEglIntegration::QWaylandXPixmapEglIntegration(QWaylandDisplay *display)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(display)
+{
+    char *display_name = getenv("DISPLAY");
+    mDisplay = XOpenDisplay(display_name);
+    mScreen = XDefaultScreen(mDisplay);
+    mRootWindow = XDefaultRootWindow(mDisplay);
+    XSync(mDisplay, False);
+}
+
+QWaylandXPixmapEglIntegration::~QWaylandXPixmapEglIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+
+QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandXPixmapEglIntegration(waylandDisplay);
+}
+
+void QWaylandXPixmapEglIntegration::initialize()
+{
+    eglBindAPI(EGL_OPENGL_ES_API);
+    mEglDisplay = eglGetDisplay(mDisplay);
+    EGLint major, minor;
+    EGLBoolean initialized = eglInitialize(mEglDisplay,&major,&minor);
+    if (initialized) {
+        qDebug() << "EGL initialized successfully" << major << "," << minor;
+    } else {
+        qDebug() << "EGL could not initialized. All EGL and GL operations will fail";
+    }
+}
+
+QWaylandWindow * QWaylandXPixmapEglIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandXPixmapWindow(widget,this);
+}
+
+EGLDisplay QWaylandXPixmapEglIntegration::eglDisplay()
+{
+    return mEglDisplay;
+}
+
+Window QWaylandXPixmapEglIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+int QWaylandXPixmapEglIntegration::depth() const
+{
+    return XDefaultDepth(mDisplay,mScreen);
+}
+
+Display * QWaylandXPixmapEglIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+QWaylandDisplay * QWaylandXPixmapEglIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
new file mode 100644
index 0000000..534494b
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
@@ -0,0 +1,42 @@
+#ifndef QWAYLANDXPIXMAPEGLINTEGRATION_H
+#define QWAYLANDXPIXMAPEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+#include <EGL/egl.h>
+//#include <EGL
+
+class QWaylandXPixmapEglIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandXPixmapEglIntegration(QWaylandDisplay *display);
+    ~QWaylandXPixmapEglIntegration();
+
+    void initialize();
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+    Display *xDisplay() const;
+    Window rootWindow() const;
+    int depth() const;
+
+    EGLDisplay eglDisplay();
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+    Display *mDisplay;
+    int mScreen;
+    Window mRootWindow;
+    EGLDisplay mEglDisplay;
+
+};
+
+#endif // QWAYLANDXPIXMAPEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
new file mode 100644
index 0000000..add30d8
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
@@ -0,0 +1,38 @@
+#include "qwaylandxpixmapwindow.h"
+
+#include "qwaylandxpixmapeglcontext.h"
+QWaylandXPixmapWindow::QWaylandXPixmapWindow(QWidget *window, QWaylandXPixmapEglIntegration *eglIntegration)
+    : QWaylandShmWindow(window)
+    , mEglIntegration(eglIntegration)
+    , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandXPixmapWindow::windowType() const
+{
+    //We'r lying, maybe we should add a type, but for now it will do
+    //since this is primarly used by the windowsurface.
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext *QWaylandXPixmapWindow::glContext() const
+{
+    if (!mContext) {
+        QWaylandXPixmapWindow *that = const_cast<QWaylandXPixmapWindow *>(this);
+        that->mContext = new QXPixmapReadbackGLContext(mEglIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandXPixmapWindow::newSurfaceCreated()
+{
+}
+
+void QWaylandXPixmapWindow::setGeometry(const QRect &rect)
+{
+    QPlatformWindow::setGeometry(rect);
+
+    if (mContext)
+        mContext->geometryChanged();
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
new file mode 100644
index 0000000..919e29d
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
@@ -0,0 +1,27 @@
+#ifndef QWAYLANDXPIXMAPWINDOW_H
+#define QWAYLANDXPIXMAPWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandxpixmapeglintegration.h"
+
+class QXPixmapReadbackGLContext;
+
+class QWaylandXPixmapWindow : public QWaylandShmWindow
+{
+public:
+    QWaylandXPixmapWindow(QWidget *window, QWaylandXPixmapEglIntegration *eglIntegration);
+
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+protected:
+    void newSurfaceCreated();
+
+private:
+    QWaylandXPixmapEglIntegration *mEglIntegration;
+    QXPixmapReadbackGLContext *mContext;
+};
+
+#endif // QWAYLANDXPIXMAPWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri
new file mode 100644
index 0000000..87e2d28
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri
@@ -0,0 +1,14 @@
+
+LIBS += -lX11 -lXext -lEGL
+
+HEADERS += \
+    gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h \
+    gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h \
+    gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h \
+    $$PWD/../../../eglconvenience/qeglconvenience.h
+
+SOURCES += \
+    gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp \
+    gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp \
+    gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp \
+    $$PWD/../../../eglconvenience/qeglconvenience.cpp
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index eebc9de..22e38eb 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -190,7 +190,7 @@ QWaylandDisplay::QWaylandDisplay(void)
                                    QWaylandDisplay::displayHandleGlobal, this);
 
 #ifdef QT_WAYLAND_GL_SUPPORT
-    mEglIntegration = QWaylandGLIntegration::createEglIntegration(mDisplay);
+    mEglIntegration = QWaylandGLIntegration::createEglIntegration(this);
 #endif
 
     readEvents();
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index 535dcd6..fc26ad2 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -81,6 +81,7 @@ public:
 
     void iterate();
 
+    struct wl_display *wl_display() const { return mDisplay; }
 public slots:
     void readEvents(void);
     void flushRequests(void);
diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.h b/src/plugins/platforms/wayland/qwaylandshmsurface.h
index 02b324a..b29ceaf 100644
--- a/src/plugins/platforms/wayland/qwaylandshmsurface.h
+++ b/src/plugins/platforms/wayland/qwaylandshmsurface.h
@@ -74,11 +74,8 @@ public:
     void beginPaint(const QRegion &);
 
 private:
-    static void frameCallback(void *data, uint32_t time);\
-
     QWaylandShmBuffer *mBuffer;
     QWaylandDisplay *mDisplay;
-    bool mWaitingForFrameSync;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
index d7c44a4..2808ed6 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
@@ -43,6 +43,8 @@
 
 #include "qwaylandbuffer.h"
 
+#include <QtCore/QVector>
+
 QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
     : QWaylandWindow(widget)
     , mBuffer(0)
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.h b/src/plugins/platforms/wayland/qwaylandshmwindow.h
index 669533c..3876c52 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.h
@@ -43,6 +43,7 @@
 #define QWAYLANDSHMWINDOW_H
 
 #include "qwaylandwindow.h"
+#include <QtGui/QRegion>
 
 class QWaylandShmWindow : public QWaylandWindow
 {
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index b44857b..f2d9d6b 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -36,6 +36,7 @@ contains(QT_CONFIG, opengles2) {
     QT += opengl
 
     CONFIG += wayland_egl
+#    CONFIG += xpixmap_egl
     include ($$PWD/gl_integration/gl_integration.pri)
 }
 
-- 
cgit v0.12


From 0579b6f43686b6dca17e2bf2b49bb39e81527a9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 24 Mar 2011 09:54:26 +0100
Subject: Don't say we support _NET_WM_PING when we don't (xcb platform).

Fixes graying out of windows on Compiz.
---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 017a902..30b700c 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -167,7 +167,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     int propertyCount = 0;
     properties[propertyCount++] = atom(QXcbAtom::WM_DELETE_WINDOW);
     properties[propertyCount++] = atom(QXcbAtom::WM_TAKE_FOCUS);
-    properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
+//    properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
 
     if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint)
         properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP);
-- 
cgit v0.12


From 8debf8fb8bc18dc4b125aa7ac1ee4980f5ac146c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 23 Mar 2011 17:11:28 +0100
Subject: Lighthouse: Wayland Fix naming bug in the glintegration

---
 src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h    | 2 +-
 .../wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp       | 2 +-
 .../gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp        | 2 +-
 src/plugins/platforms/wayland/qwaylanddisplay.cpp                       | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
index 52a663f..16115d5 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
@@ -15,7 +15,7 @@ public:
 
     virtual QWaylandWindow *createEglWindow(QWidget *widget) = 0;
 
-    static QWaylandGLIntegration *createEglIntegration(QWaylandDisplay *waylandDisplay);
+    static QWaylandGLIntegration *createGLIntegration(QWaylandDisplay *waylandDisplay);
 };
 
 #endif // QWAYLANDGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
index 255fbfe..1f77064 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -44,7 +44,7 @@ wl_egl_display * QWaylandEglIntegration::nativeDisplay() const
     return mNativeEglDisplay;
 }
 
-QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(QWaylandDisplay *waylandDisplay)
+QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
 {
     return new QWaylandEglIntegration(waylandDisplay->wl_display());
 }
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
index c9f244c..a121900 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
@@ -21,7 +21,7 @@ QWaylandXPixmapEglIntegration::~QWaylandXPixmapEglIntegration()
 }
 
 
-QWaylandGLIntegration *QWaylandGLIntegration::createEglIntegration(QWaylandDisplay *waylandDisplay)
+QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
 {
     return new QWaylandXPixmapEglIntegration(waylandDisplay);
 }
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index 22e38eb..d54a0fe 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -190,7 +190,7 @@ QWaylandDisplay::QWaylandDisplay(void)
                                    QWaylandDisplay::displayHandleGlobal, this);
 
 #ifdef QT_WAYLAND_GL_SUPPORT
-    mEglIntegration = QWaylandGLIntegration::createEglIntegration(this);
+    mEglIntegration = QWaylandGLIntegration::createGLIntegration(this);
 #endif
 
     readEvents();
-- 
cgit v0.12


From bbdc68b95bcec6e1a369df6b99df8ea499284d21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 24 Mar 2011 09:57:38 +0100
Subject: Lighthouse: Wayland. Added glx backend for gl integration

---
 .../platforms/glxconvenience/glxconvenience.pri    |   7 +
 .../platforms/glxconvenience/qglxconvenience.cpp   | 202 +++++++++++++++++++++
 .../platforms/glxconvenience/qglxconvenience.h     |  15 ++
 .../wayland/gl_integration/gl_integration.pri      |   4 +-
 .../gl_integration/qwaylandglwindowsurface.cpp     |   3 +
 .../xpixmap_egl/qwaylandxpixmapwindow.cpp          |   4 -
 .../xpixmap_egl/qwaylandxpixmapwindow.h            |   2 -
 .../xpixmap_glx/qwaylandxpixmapglxcontext.cpp      |  98 ++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxcontext.h        |  38 ++++
 .../xpixmap_glx/qwaylandxpixmapglxintegration.cpp  |  53 ++++++
 .../xpixmap_glx/qwaylandxpixmapglxintegration.h    |  39 ++++
 .../xpixmap_glx/qwaylandxpixmapglxwindow.cpp       |  32 ++++
 .../xpixmap_glx/qwaylandxpixmapglxwindow.h         |  24 +++
 .../gl_integration/xpixmap_glx/xpixmap_glx.pri     |  10 +
 src/plugins/platforms/wayland/wayland.pro          |  12 +-
 15 files changed, 533 insertions(+), 10 deletions(-)
 create mode 100644 src/plugins/platforms/glxconvenience/glxconvenience.pri
 create mode 100644 src/plugins/platforms/glxconvenience/qglxconvenience.cpp
 create mode 100644 src/plugins/platforms/glxconvenience/qglxconvenience.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri

diff --git a/src/plugins/platforms/glxconvenience/glxconvenience.pri b/src/plugins/platforms/glxconvenience/glxconvenience.pri
new file mode 100644
index 0000000..5734ff7
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/glxconvenience.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH = $$PWD
+
+HEADERS += \
+    $$PWD/qglxconvenience.h
+
+SOURCES += \
+    $$PWD/qglxconvenience.cpp
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
new file mode 100644
index 0000000..5088691
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -0,0 +1,202 @@
+#include "qglxconvenience.h"
+
+#include <QtCore/QVector>
+
+enum {
+    XFocusOut = FocusOut,
+    XFocusIn = FocusIn,
+    XKeyPress = KeyPress,
+    XKeyRelease = KeyRelease,
+    XNone = None,
+    XRevertToParent = RevertToParent,
+    XGrayScale = GrayScale,
+    XCursorShape = CursorShape
+};
+#undef FocusOut
+#undef FocusIn
+#undef KeyPress
+#undef KeyRelease
+#undef None
+#undef RevertToParent
+#undef GrayScale
+#undef CursorShape
+
+#ifdef FontChange
+#undef FontChange
+#endif
+
+QVector<int> buildSpec(const QPlatformWindowFormat &format)
+{
+    QVector<int> spec(48);
+    int i = 0;
+
+    spec[i++] = GLX_LEVEL;
+    spec[i++] = 0;
+    spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = GLX_WINDOW_BIT;
+
+    if (format.rgba()) {
+        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_RGBA_BIT;
+        spec[i++] = GLX_RED_SIZE; spec[i++] = (format.redBufferSize() == -1) ? 1 : format.redBufferSize();
+        spec[i++] = GLX_GREEN_SIZE; spec[i++] =  (format.greenBufferSize() == -1) ? 1 : format.greenBufferSize();
+        spec[i++] = GLX_BLUE_SIZE; spec[i++] = (format.blueBufferSize() == -1) ? 1 : format.blueBufferSize();
+        if (format.alpha()) {
+                spec[i++] = GLX_ALPHA_SIZE; spec[i++] = (format.alphaBufferSize() == -1) ? 1 : format.alphaBufferSize();
+            }
+
+        spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+        spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+        spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+
+        if (format.alpha()) {
+            spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+        }
+
+    } else {
+        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_COLOR_INDEX_BIT; //I'm really not sure if this works....
+        spec[i++] = GLX_BUFFER_SIZE; spec[i++] = 8;
+    }
+
+    spec[i++] = GLX_DOUBLEBUFFER; spec[i++] = format.doubleBuffer() ? True : False;
+    spec[i++] = GLX_STEREO; spec[i++] =  format.stereo() ? True : False;
+
+    if (format.depth()) {
+        spec[i++] = GLX_DEPTH_SIZE; spec[i++] = (format.depthBufferSize() == -1) ? 1 : format.depthBufferSize();
+    }
+
+    if (format.stencil()) {
+        spec[i++] = GLX_STENCIL_SIZE; spec[i++] =  (format.stencilBufferSize() == -1) ? 1 : format.stencilBufferSize();
+    }
+    if (format.sampleBuffers()) {
+        spec[i++] = GLX_SAMPLE_BUFFERS_ARB;
+        spec[i++] = 1;
+        spec[i++] = GLX_SAMPLES_ARB;
+        spec[i++] = format.samples() == -1 ? 4 : format.samples();
+    }
+
+    spec[i++] = XNone;
+    return spec;
+}
+
+GLXFBConfig findConfig(Display *display, int screen , const QPlatformWindowFormat &format)
+{
+    bool reduced = true;
+    GLXFBConfig chosenConfig = 0;
+    QPlatformWindowFormat reducedFormat = format;
+    while (!chosenConfig && reduced) {
+        QVector<int> spec = buildSpec(reducedFormat);
+        int confcount = 0;
+        GLXFBConfig *configs;
+        configs = glXChooseFBConfig(display, screen,spec.constData(),&confcount);
+        if (confcount)
+        {
+            for (int i = 0; i < confcount; i++) {
+                chosenConfig = configs[i];
+                // Make sure we try to get an ARGB visual if the format asked for an alpha:
+                if (reducedFormat.alpha()) {
+                    int alphaSize;
+                    glXGetFBConfigAttrib(display,configs[i],GLX_ALPHA_SIZE,&alphaSize);
+                    if (alphaSize > 0)
+                        break;
+                } else {
+                    break; // Just choose the first in the list if there's no alpha requested
+                }
+            }
+
+            XFree(configs);
+        }
+        reducedFormat = reducePlatformWindowFormat(reducedFormat,&reduced);
+    }
+
+    if (!chosenConfig)
+        qWarning("Warning no context created");
+
+    return chosenConfig;
+}
+
+XVisualInfo *findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format)
+{
+    GLXFBConfig config = findConfig(display,screen,format);
+    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(display,config);
+    return visualInfo;
+}
+
+QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
+{
+    QPlatformWindowFormat format;
+    int redSize     = 0;
+    int greenSize   = 0;
+    int blueSize    = 0;
+    int alphaSize   = 0;
+    int depthSize   = 0;
+    int stencilSize = 0;
+    int sampleBuffers = 0;
+    int sampleCount = 0;
+    int level       = 0;
+    int rgba        = 0;
+    int stereo      = 0;
+    int accumSizeA  = 0;
+    int accumSizeR  = 0;
+    int accumSizeG  = 0;
+    int accumSizeB  = 0;
+
+    XVisualInfo *vi = glXGetVisualFromFBConfig(display,config);
+    glXGetConfig(display,vi,GLX_RGBA,&rgba);
+    XFree(vi);
+    glXGetFBConfigAttrib(display, config, GLX_RED_SIZE,     &redSize);
+    glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE,   &greenSize);
+    glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE,    &blueSize);
+    glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE,   &alphaSize);
+    glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE,   &depthSize);
+    glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize);
+    glXGetFBConfigAttrib(display, config, GLX_SAMPLES,      &sampleBuffers);
+    glXGetFBConfigAttrib(display, config, GLX_LEVEL,        &level);
+    glXGetFBConfigAttrib(display, config, GLX_STEREO,       &stereo);
+    glXGetFBConfigAttrib(display, config, GLX_ACCUM_ALPHA_SIZE, &accumSizeA);
+    glXGetFBConfigAttrib(display, config, GLX_ACCUM_RED_SIZE, &accumSizeR);
+    glXGetFBConfigAttrib(display, config, GLX_ACCUM_GREEN_SIZE, &accumSizeG);
+    glXGetFBConfigAttrib(display, config, GLX_ACCUM_BLUE_SIZE, &accumSizeB);
+
+    format.setRedBufferSize(redSize);
+    format.setGreenBufferSize(greenSize);
+    format.setBlueBufferSize(blueSize);
+    format.setAlphaBufferSize(alphaSize);
+    format.setDepthBufferSize(depthSize);
+    format.setStencilBufferSize(stencilSize);
+    format.setSampleBuffers(sampleBuffers);
+    if (format.sampleBuffers()) {
+        glXGetFBConfigAttrib(display, config, GLX_SAMPLES_ARB, &sampleCount);
+        format.setSamples(sampleCount);
+    }
+
+    format.setDirectRendering(glXIsDirect(display, ctx));
+    format.setRgba(rgba);
+    format.setStereo(stereo);
+    format.setAccumBufferSize(accumSizeB);
+
+    return format;
+}
+
+QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
+{
+    QPlatformWindowFormat retFormat = format;
+    *reduced = true;
+
+    if (retFormat.sampleBuffers()) {
+        retFormat.setSampleBuffers(false);
+    } else if (retFormat.stereo()) {
+        retFormat.setStereo(false);
+    } else if (retFormat.accum()) {
+        retFormat.setAccum(false);
+    }else if (retFormat.stencil()) {
+        retFormat.setStencil(false);
+    }else if (retFormat.alpha()) {
+        retFormat.setAlpha(false);
+    }else if (retFormat.depth()) {
+        retFormat.setDepth(false);
+    }else if (retFormat.doubleBuffer()) {
+        retFormat.setDoubleBuffer(false);
+    }else{
+        *reduced = false;
+    }
+    return retFormat;
+}
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.h b/src/plugins/platforms/glxconvenience/qglxconvenience.h
new file mode 100644
index 0000000..b2a775e
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.h
@@ -0,0 +1,15 @@
+#ifndef QGLXCONVENIENCE_H
+#define QGLXCONVENIENCE_H
+
+#include <QPlatformWindowFormat>
+
+#include <X11/Xlib.h>
+#include <GL/glx.h>
+
+XVisualInfo *findVisualInfo(const Display *display, int screen, const QPlatformWindowFormat &format);
+GLXFBConfig findConfig(Display *display, int screen, const QPlatformWindowFormat &format);
+QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
+QVector<int> buildSpec(const QPlatformWindowFormat &format);
+QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
+
+#endif // QGLXCONVENIENCE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index ed2b021..10567cd 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -14,4 +14,6 @@ xpixmap_egl {
     include ($$PWD/xpixmap_egl/xpixmap_egl.pri)
 }
 
-
+xpixmap_glx {
+    include ($$PWD/xpixmap_glx/xpixmap_glx.pri)
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
index 8c83128..ebe4c7b 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
@@ -54,6 +54,9 @@ QT_BEGIN_NAMESPACE
 
 static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, const QRectF &br)
 {
+#if !defined(QT_OPENGL_ES_2)
+    QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
+#endif
     const GLenum target = GL_TEXTURE_2D;
     QRectF src = br.isEmpty()
         ? QRectF(QPointF(), texSize)
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
index add30d8..35ce41a 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
@@ -24,10 +24,6 @@ QPlatformGLContext *QWaylandXPixmapWindow::glContext() const
     return mContext;
 }
 
-void QWaylandXPixmapWindow::newSurfaceCreated()
-{
-}
-
 void QWaylandXPixmapWindow::setGeometry(const QRect &rect)
 {
     QPlatformWindow::setGeometry(rect);
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
index 919e29d..1f10112 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
@@ -16,8 +16,6 @@ public:
     QPlatformGLContext *glContext() const;
 
     void setGeometry(const QRect &rect);
-protected:
-    void newSurfaceCreated();
 
 private:
     QWaylandXPixmapEglIntegration *mEglIntegration;
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
new file mode 100644
index 0000000..c8b5fba
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -0,0 +1,98 @@
+#include "qwaylandxpixmapglxcontext.h"
+
+#include "qwaylandshmsurface.h"
+#include "qwaylandxpixmapglxwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandXPixmapGLXContext::QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegration *glxIntegration, QWaylandXPixmapGLXWindow *window)
+    : QPlatformGLContext()
+    , mGlxIntegration(glxIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mPixmap(0)
+    , mConfig(findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+    , mGlxPixmap(0)
+{
+    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
+    mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
+
+    geometryChanged();
+}
+
+void QWaylandXPixmapGLXContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+
+    while(mWindow->waitingForFrameSync()) {
+        mGlxIntegration->waylandDisplay()->iterate();
+    }
+
+    glXMakeCurrent(mGlxIntegration->xDisplay(),mGlxPixmap,mContext);
+}
+
+void QWaylandXPixmapGLXContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+}
+
+void QWaylandXPixmapGLXContext::swapBuffers()
+{
+    if (QPlatformGLContext::currentContext() != this) {
+        makeCurrent();
+    }
+
+    QSize size = mWindow->geometry().size();
+
+    QImage img(size,QImage::Format_ARGB32);
+    const uchar *constBits = img.bits();
+    void *pixels = const_cast<uchar *>(constBits);
+
+    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+    img = img.mirrored();
+    constBits = img.bits();
+
+    const uchar *constDstBits = mBuffer->image()->bits();
+    uchar *dstBits = const_cast<uchar *>(constDstBits);
+    memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+
+}
+
+void * QWaylandXPixmapGLXContext::getProcAddress(const QString &procName)
+{
+    return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QWaylandXPixmapGLXContext::platformWindowFormat() const
+{
+    return platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+}
+
+void QWaylandXPixmapGLXContext::geometryChanged()
+{
+    while (mWindow->waitingForFrameSync())
+        mGlxIntegration->waylandDisplay()->iterate();
+
+    QSize size(mWindow->geometry().size());
+    delete mBuffer;
+    if (mPixmap)
+        XFreePixmap(mGlxIntegration->xDisplay(),mPixmap);
+    if (mGlxPixmap)
+        glXDestroyPixmap(mGlxIntegration->xDisplay(),mGlxPixmap);
+
+    mBuffer = new QWaylandShmBuffer(mGlxIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+    mWindow->attach(mBuffer);
+    int depth = XDefaultDepth(mGlxIntegration->xDisplay(),mGlxIntegration->screen());
+    mPixmap = XCreatePixmap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),size.width(),size.height(),depth);
+    XSync(mGlxIntegration->xDisplay(),False);
+
+    mGlxPixmap = glXCreatePixmap(mGlxIntegration->xDisplay(),mConfig,mPixmap,0);
+
+    if (!mGlxPixmap) {
+        qDebug() << "Could not make egl surface out of pixmap :(";
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
new file mode 100644
index 0000000..c4c3796
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
@@ -0,0 +1,38 @@
+#ifndef QWAYLANDXPIXMAPGLXCONTEXT_H
+#define QWAYLANDXPIXMAPGLXCONTEXT_H
+
+#include <QPlatformGLContext>
+
+#include "qwaylandxpixmapglxintegration.h"
+
+#include "qglxconvenience.h"
+
+class QWaylandXPixmapGLXWindow;
+class QWaylandShmBuffer;
+
+class QWaylandXPixmapGLXContext : public QPlatformGLContext
+{
+public:
+    QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegration *glxIntegration, QWaylandXPixmapGLXWindow *window);
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandXPixmapGLXIntegration *mGlxIntegration;
+    QWaylandXPixmapGLXWindow *mWindow;
+    QWaylandShmBuffer *mBuffer;
+
+    Pixmap mPixmap;
+    GLXFBConfig mConfig;
+    GLXContext mContext;
+    GLXPixmap mGlxPixmap;
+};
+
+#endif // QWAYLANDXPIXMAPGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
new file mode 100644
index 0000000..17593d7
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
@@ -0,0 +1,53 @@
+#include "qwaylandxpixmapglxintegration.h"
+
+#include "qwaylandxpixmapglxwindow.h"
+
+QWaylandXPixmapGLXIntegration::QWaylandXPixmapGLXIntegration(QWaylandDisplay * waylandDispaly)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(waylandDispaly)
+{
+    char *display_name = getenv("DISPLAY");
+    mDisplay = XOpenDisplay(display_name);
+    mScreen = XDefaultScreen(mDisplay);
+    mRootWindow = XDefaultRootWindow(mDisplay);
+    XSync(mDisplay, False);
+}
+
+QWaylandXPixmapGLXIntegration::~QWaylandXPixmapGLXIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+void QWaylandXPixmapGLXIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandXPixmapGLXIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandXPixmapGLXWindow(widget,this);
+}
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandXPixmapGLXIntegration(waylandDisplay);
+}
+
+Display * QWaylandXPixmapGLXIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+int QWaylandXPixmapGLXIntegration::screen() const
+{
+    return mScreen;
+}
+
+Window QWaylandXPixmapGLXIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandXPixmapGLXIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
new file mode 100644
index 0000000..c48abb4
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
@@ -0,0 +1,39 @@
+#ifndef QWAYLANDXPIXMAPGLXINTEGRATION_H
+#define QWAYLANDXPIXMAPGLXINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+class QWaylandXPixmapGLXIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandXPixmapGLXIntegration(QWaylandDisplay * waylandDispaly);
+    ~QWaylandXPixmapGLXIntegration();
+
+    void initialize();
+
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+
+    Display *xDisplay() const;
+    int screen() const;
+    Window rootWindow() const;
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+
+    Display *mDisplay;
+    int mScreen;
+    Window mRootWindow;
+
+};
+
+#endif // QWAYLANDXPIXMAPGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
new file mode 100644
index 0000000..a191320
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
@@ -0,0 +1,32 @@
+#include "qwaylandxpixmapglxwindow.h"
+
+QWaylandXPixmapGLXWindow::QWaylandXPixmapGLXWindow(QWidget *window, QWaylandXPixmapGLXIntegration *glxIntegration)
+    : QWaylandShmWindow(window)
+    , mGlxIntegration(glxIntegration)
+    , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandXPixmapGLXWindow::windowType() const
+{
+    //yeah. this type needs a new name
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandXPixmapGLXWindow::glContext() const
+{
+    if (!mContext) {
+        QWaylandXPixmapGLXWindow *that = const_cast<QWaylandXPixmapGLXWindow *>(this);
+        that->mContext = new QWaylandXPixmapGLXContext(mGlxIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandXPixmapGLXWindow::setGeometry(const QRect &rect)
+{
+    QWaylandShmWindow::setGeometry(rect);
+
+    if (mContext) {
+        mContext->geometryChanged();
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
new file mode 100644
index 0000000..6aba21c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
@@ -0,0 +1,24 @@
+#ifndef QWAYLANDXPIXMAPGLXWINDOW_H
+#define QWAYLANDXPIXMAPGLXWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandxpixmapglxintegration.h"
+#include "qwaylandxpixmapglxcontext.h"
+
+class QWaylandXPixmapGLXWindow : public QWaylandShmWindow
+{
+public:
+    QWaylandXPixmapGLXWindow(QWidget *window, QWaylandXPixmapGLXIntegration *glxIntegration);
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+
+private:
+    QWaylandXPixmapGLXIntegration *mGlxIntegration;
+    QWaylandXPixmapGLXContext *mContext;
+
+};
+
+#endif // QWAYLANDXPIXMAPGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
new file mode 100644
index 0000000..07654df
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
@@ -0,0 +1,10 @@
+include (../../../glxconvenience/glxconvenience.pri)
+HEADERS += \
+    $$PWD/qwaylandxpixmapglxintegration.h \
+    gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h \
+    gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
+
+SOURCES += \
+    $$PWD/qwaylandxpixmapglxintegration.cpp \
+    gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp \
+    gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index f2d9d6b..45457fc 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -31,12 +31,18 @@ QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_WAYLAND
 
 INCLUDEPATH += $$PWD
 
-contains(QT_CONFIG, opengles2) {
+contains(QT_CONFIG, opengl) {
     DEFINES += QT_WAYLAND_GL_SUPPORT
     QT += opengl
 
-    CONFIG += wayland_egl
-#    CONFIG += xpixmap_egl
+    contains(QT_CONFIG, opengles2) {
+        CONFIG += wayland_egl
+        #CONFIG += xpixmap_egl
+    } else {
+        message("HELLO")
+        CONFIG += xpixmap_glx    
+    }
+
     include ($$PWD/gl_integration/gl_integration.pri)
 }
 
-- 
cgit v0.12


From 52dc52dffb80f3ffd321156639564b524263810a Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 22 Mar 2011 16:32:10 +0100
Subject: QLocale fixes.

Prepended non-static functions with a qt_ prefix as our policy says.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp      | 24 ++++++++++++------------
 src/corelib/tools/qlocale_mac.mm   |  8 ++++----
 src/corelib/tools/qlocale_p.h      | 14 +++++++-------
 src/corelib/tools/qlocale_unix.cpp |  4 ++--
 src/corelib/tools/qlocale_win.cpp  |  6 +++---
 5 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 2a5522a..e264a64 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -232,7 +232,7 @@ QString QLocalePrivate::bcp47Name() const
     return name;
 }
 
-const QLocalePrivate *findLocale(QLocale::Language language, QLocale::Script script, QLocale::Country country)
+const QLocalePrivate *QLocalePrivate::findLocale(QLocale::Language language, QLocale::Script script, QLocale::Country country)
 {
     const unsigned language_id = language;
     const unsigned script_id = script;
@@ -293,7 +293,7 @@ static bool parse_locale_tag(const QString &input, int &i, QString *result, cons
     return true;
 }
 
-bool splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry)
+bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry)
 {
     const int length = name.length();
 
@@ -358,7 +358,7 @@ void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &l
     QString lang_code;
     QString script_code;
     QString cntry_code;
-    if (!splitLocaleName(name, lang_code, script_code, cntry_code))
+    if (!qt_splitLocaleName(name, lang_code, script_code, cntry_code))
         return;
 
     lang = QLocalePrivate::codeToLanguage(lang_code);
@@ -368,17 +368,17 @@ void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &l
     cntry = QLocalePrivate::codeToCountry(cntry_code);
 }
 
-const QLocalePrivate *findLocale(const QString &name)
+static const QLocalePrivate *findLocale(const QString &name)
 {
     QLocale::Language lang;
     QLocale::Script script;
     QLocale::Country cntry;
     QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
 
-    return findLocale(lang, script, cntry);
+    return QLocalePrivate::findLocale(lang, script, cntry);
 }
 
-QString readEscapedFormatString(const QString &format, int *idx)
+QString qt_readEscapedFormatString(const QString &format, int *idx)
 {
     int &i = *idx;
 
@@ -412,7 +412,7 @@ QString readEscapedFormatString(const QString &format, int *idx)
     return result;
 }
 
-int repeatCount(const QString &s, int i)
+int qt_repeatCount(const QString &s, int i)
 {
     QChar c = s.at(i);
     int j = i + 1;
@@ -686,7 +686,7 @@ QLocale::QLocale()
 QLocale::QLocale(Language language, Country country)
     : v(0)
 {
-    const QLocalePrivate *d = findLocale(language, QLocale::AnyScript, country);
+    const QLocalePrivate *d = QLocalePrivate::findLocale(language, QLocale::AnyScript, country);
 
     // If not found, should default to system
     if (d->languageId() == QLocale::C && language != QLocale::C) {
@@ -725,7 +725,7 @@ QLocale::QLocale(Language language, Country country)
 QLocale::QLocale(Language language, Script script, Country country)
     : v(0)
 {
-    const QLocalePrivate *d = findLocale(language, script, country);
+    const QLocalePrivate *d = QLocalePrivate::findLocale(language, script, country);
 
     // If not found, should default to system
     if (d->languageId() == QLocale::C && language != QLocale::C) {
@@ -1304,7 +1304,7 @@ static bool timeFormatContainsAP(const QString &format)
     int i = 0;
     while (i < format.size()) {
         if (format.at(i).unicode() == '\'') {
-            readEscapedFormatString(format, &i);
+            qt_readEscapedFormatString(format, &i);
             continue;
         }
 
@@ -2226,12 +2226,12 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDate *dat
     int i = 0;
     while (i < format.size()) {
         if (format.at(i).unicode() == '\'') {
-            result.append(readEscapedFormatString(format, &i));
+            result.append(qt_readEscapedFormatString(format, &i));
             continue;
         }
 
         const QChar c = format.at(i);
-        int repeat = repeatCount(format, i);
+        int repeat = qt_repeatCount(format, i);
         bool used = false;
         if (date) {
             switch (c.unicode()) {
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index ba7ca7d..c824ec0 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -75,7 +75,7 @@ static QByteArray getMacLocaleName()
 
     QString lang, script, cntry;
     if (result.isEmpty() || result != "C"
-            && !splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) {
+            && !qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) {
         QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
         CFStringRef locale = CFLocaleGetIdentifier(l);
         result = QCFString::toQString(locale).toUtf8();
@@ -173,7 +173,7 @@ static QString macToQtFormat(const QString &sys_fmt)
 
     while (i < sys_fmt.size()) {
         if (sys_fmt.at(i).unicode() == '\'') {
-            QString text = readEscapedFormatString(sys_fmt, &i);
+            QString text = qt_readEscapedFormatString(sys_fmt, &i);
             if (text == QLatin1String("'"))
                 result += QLatin1String("''");
             else
@@ -182,7 +182,7 @@ static QString macToQtFormat(const QString &sys_fmt)
         }
 
         QChar c = sys_fmt.at(i);
-        int repeat = repeatCount(sys_fmt, i);
+        int repeat = qt_repeatCount(sys_fmt, i);
 
         switch (c.unicode()) {
             case 'G': // Qt doesn't support these :(
@@ -439,7 +439,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
         getMacPreferredLanguageAndCountry(&preferredLanguage, &preferredCountry);
         QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : QLocalePrivate::codeToLanguage(preferredLanguage));
         QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : QLocalePrivate::codeToCountry(preferredCountry));
-        const QLocalePrivate *d = findLocale(languageCode, QLocale::AnyScript, countryCode);
+        const QLocalePrivate *d = QLocalePrivate::findLocale(languageCode, QLocale::AnyScript, countryCode);
         if (type == LanguageId)
             return (QLocale::Language)d->languageId();
         return (QLocale::Country)d->countryId();
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index 5326a77..e600807 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -91,6 +91,10 @@ public:
     static QLocale::Country codeToCountry(const QString &code);
     static void getLangAndCountry(const QString &name, QLocale::Language &lang,
                                   QLocale::Script &script, QLocale::Country &cntry);
+    static const QLocalePrivate *findLocale(QLocale::Language language,
+                                            QLocale::Script script,
+                                            QLocale::Country country);
+
 
     QLocale::MeasurementSystem measurementSystem() const;
 
@@ -264,13 +268,9 @@ private:
 };
 #endif
 
-const QLocalePrivate *findLocale(QLocale::Language language,
-                                 QLocale::Script script,
-                                 QLocale::Country country);
-const QLocalePrivate *findLocale(const QString &name);
-QString readEscapedFormatString(const QString &format, int *idx);
-bool splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
-int repeatCount(const QString &s, int i);
+QString qt_readEscapedFormatString(const QString &format, int *idx);
+bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
+int qt_repeatCount(const QString &s, int i);
 
 QT_END_NAMESPACE
 
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 117e2e4..21097bf 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -192,7 +192,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
             for (int i = 0; i < lst.size();) {
                 const QString &name = lst.at(i);
                 QString lang, script, cntry;
-                if (name.isEmpty() || !splitLocaleName(name, lang, script, cntry))
+                if (name.isEmpty() || !qt_splitLocaleName(name, lang, script, cntry))
                     lst.removeAt(i);
                 else
                     ++i;
@@ -201,7 +201,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
         }
         if (!d->lc_messages_var.isEmpty()) {
             QString lang, script, cntry;
-            if (splitLocaleName(QString::fromLatin1(d->lc_messages_var.constData(), d->lc_messages_var.size()),
+            if (qt_splitLocaleName(QString::fromLatin1(d->lc_messages_var.constData(), d->lc_messages_var.size()),
                                 lang, script, cntry)) {
                 if (!cntry.length() && lang.length())
                     return QStringList(lang);
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index c892e04..0c2d039 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -573,7 +573,7 @@ QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
 
     while (i < sys_fmt.size()) {
         if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
-            QString text = readEscapedFormatString(sys_fmt, &i);
+            QString text = qt_readEscapedFormatString(sys_fmt, &i);
             if (text == QLatin1String("'"))
                 result += QLatin1String("''");
             else
@@ -582,7 +582,7 @@ QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt)
         }
 
         QChar c = sys_fmt.at(i);
-        int repeat = repeatCount(sys_fmt, i);
+        int repeat = qt_repeatCount(sys_fmt, i);
 
         switch (c.unicode()) {
             // Date
@@ -925,7 +925,7 @@ static QByteArray getWinLocaleName(LCID id)
         result = langEnvVar;
         QString lang, script, cntry;
         if ( result == "C" || (!result.isEmpty()
-                && splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
+                && qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
             long id = 0;
             bool ok = false;
             id = qstrtoll(result.data(), 0, 0, &ok);
-- 
cgit v0.12


From d7594cbb83f223ec4a56ba3d999412a1c0185937 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 24 Mar 2011 10:35:24 +0100
Subject: Added missing -lX11 to xpixmap_glx wayland integration.

---
 .../platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri        | 2 ++
 src/plugins/platforms/wayland/wayland.pro                               | 1 -
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
index 07654df..2b6ae0d 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
@@ -8,3 +8,5 @@ SOURCES += \
     $$PWD/qwaylandxpixmapglxintegration.cpp \
     gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp \
     gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+
+LIBS += -lX11
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index 45457fc..e5c866b 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -39,7 +39,6 @@ contains(QT_CONFIG, opengl) {
         CONFIG += wayland_egl
         #CONFIG += xpixmap_egl
     } else {
-        message("HELLO")
         CONFIG += xpixmap_glx    
     }
 
-- 
cgit v0.12


From cfd32d1f590fff2545932347d0ff6081a4a4477a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 24 Mar 2011 11:19:44 +0100
Subject: Lighthouse: Wayland: Make QGLWidget work with the glx integration

Still missing same code for egl integration
---
 .../xpixmap_glx/qwaylandxpixmapglxcontext.cpp      | 36 +++++++++++++++++++---
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
index c8b5fba..50bf4ee 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -5,6 +5,28 @@
 
 #include <QtCore/QDebug>
 
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+    const int width = img.width();
+    const int height = img.height();
+
+    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+    {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+        }
+    } else {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+        }
+    }
+}
+
 QWaylandXPixmapGLXContext::QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegration *glxIntegration, QWaylandXPixmapGLXWindow *window)
     : QPlatformGLContext()
     , mGlxIntegration(glxIntegration)
@@ -51,6 +73,7 @@ void QWaylandXPixmapGLXContext::swapBuffers()
     glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
 
     img = img.mirrored();
+    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
     constBits = img.bits();
 
     const uchar *constDstBits = mBuffer->image()->bits();
@@ -74,15 +97,20 @@ QPlatformWindowFormat QWaylandXPixmapGLXContext::platformWindowFormat() const
 
 void QWaylandXPixmapGLXContext::geometryChanged()
 {
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
     while (mWindow->waitingForFrameSync())
         mGlxIntegration->waylandDisplay()->iterate();
 
-    QSize size(mWindow->geometry().size());
     delete mBuffer;
-    if (mPixmap)
+    //XFreePixmap deletes the glxPixmap as well
+    if (mPixmap) {
         XFreePixmap(mGlxIntegration->xDisplay(),mPixmap);
-    if (mGlxPixmap)
-        glXDestroyPixmap(mGlxIntegration->xDisplay(),mGlxPixmap);
+    }
 
     mBuffer = new QWaylandShmBuffer(mGlxIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
     mWindow->attach(mBuffer);
-- 
cgit v0.12


From 39ede7e7914b486d5971491dd742da3712a1d7e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 24 Mar 2011 15:25:15 +0100
Subject: Lighthouse: Move glx common code into shared files

---
 .../fontdatabases/genericunix/genericunix.pri      |   5 +-
 .../platforms/glxconvenience/glxconvenience.pri    |   2 +-
 .../platforms/glxconvenience/qglxconvenience.cpp   |  16 +-
 .../platforms/glxconvenience/qglxconvenience.h     |  10 +-
 .../xpixmap_glx/qwaylandxpixmapglxcontext.cpp      |   4 +-
 src/plugins/platforms/xcb/qglxintegration.cpp      | 183 +--------------------
 src/plugins/platforms/xcb/qglxintegration.h        |   7 -
 src/plugins/platforms/xcb/qxcbwindow.cpp           |   3 +-
 src/plugins/platforms/xcb/xcb.pro                  |   1 +
 src/plugins/platforms/xlib/qglxintegration.cpp     | 183 +--------------------
 src/plugins/platforms/xlib/qglxintegration.h       |   7 -
 src/plugins/platforms/xlib/qxlibwindow.cpp         |   3 +-
 src/plugins/platforms/xlib/xlib.pro                |   1 +
 13 files changed, 33 insertions(+), 392 deletions(-)

diff --git a/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
index dbcfbce..7b0db41 100644
--- a/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
+++ b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
@@ -5,6 +5,7 @@ contains(QT_CONFIG, fontconfig) {
     include(../basicunix/basicunix.pri)
 }
 
-INCLUDEPATH += $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/genericunix
+message("GENERIC UNIX")
+INCLUDEPATH += $$PWD
 HEADERS += \
-           $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/genericunix/qgenericunixfontdatabase.h
+           $$PWD/qgenericunixfontdatabase.h
diff --git a/src/plugins/platforms/glxconvenience/glxconvenience.pri b/src/plugins/platforms/glxconvenience/glxconvenience.pri
index 5734ff7..d6c9922 100644
--- a/src/plugins/platforms/glxconvenience/glxconvenience.pri
+++ b/src/plugins/platforms/glxconvenience/glxconvenience.pri
@@ -1,4 +1,4 @@
-INCLUDEPATH = $$PWD
+INCLUDEPATH += $$PWD
 
 HEADERS += \
     $$PWD/qglxconvenience.h
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
index 5088691..08972f7 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -25,7 +25,7 @@ enum {
 #undef FontChange
 #endif
 
-QVector<int> buildSpec(const QPlatformWindowFormat &format)
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format)
 {
     QVector<int> spec(48);
     int i = 0;
@@ -77,13 +77,13 @@ QVector<int> buildSpec(const QPlatformWindowFormat &format)
     return spec;
 }
 
-GLXFBConfig findConfig(Display *display, int screen , const QPlatformWindowFormat &format)
+GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindowFormat &format)
 {
     bool reduced = true;
     GLXFBConfig chosenConfig = 0;
     QPlatformWindowFormat reducedFormat = format;
     while (!chosenConfig && reduced) {
-        QVector<int> spec = buildSpec(reducedFormat);
+        QVector<int> spec = qglx_buildSpec(reducedFormat);
         int confcount = 0;
         GLXFBConfig *configs;
         configs = glXChooseFBConfig(display, screen,spec.constData(),&confcount);
@@ -104,7 +104,7 @@ GLXFBConfig findConfig(Display *display, int screen , const QPlatformWindowForma
 
             XFree(configs);
         }
-        reducedFormat = reducePlatformWindowFormat(reducedFormat,&reduced);
+        reducedFormat = qglx_reducePlatformWindowFormat(reducedFormat,&reduced);
     }
 
     if (!chosenConfig)
@@ -113,14 +113,14 @@ GLXFBConfig findConfig(Display *display, int screen , const QPlatformWindowForma
     return chosenConfig;
 }
 
-XVisualInfo *findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format)
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format)
 {
-    GLXFBConfig config = findConfig(display,screen,format);
+    GLXFBConfig config = qglx_findConfig(display,screen,format);
     XVisualInfo *visualInfo = glXGetVisualFromFBConfig(display,config);
     return visualInfo;
 }
 
-QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
+QPlatformWindowFormat qglx_platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
 {
     QPlatformWindowFormat format;
     int redSize     = 0;
@@ -176,7 +176,7 @@ QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfi
     return format;
 }
 
-QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
+QPlatformWindowFormat qglx_reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
 {
     QPlatformWindowFormat retFormat = format;
     *reduced = true;
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.h b/src/plugins/platforms/glxconvenience/qglxconvenience.h
index b2a775e..a3cfd9a 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.h
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.h
@@ -6,10 +6,10 @@
 #include <X11/Xlib.h>
 #include <GL/glx.h>
 
-XVisualInfo *findVisualInfo(const Display *display, int screen, const QPlatformWindowFormat &format);
-GLXFBConfig findConfig(Display *display, int screen, const QPlatformWindowFormat &format);
-QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
-QVector<int> buildSpec(const QPlatformWindowFormat &format);
-QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format);
+GLXFBConfig qglx_findConfig(Display *display, int screen, const QPlatformWindowFormat &format);
+QPlatformWindowFormat qglx_platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format);
+QPlatformWindowFormat qglx_reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
 
 #endif // QGLXCONVENIENCE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
index 50bf4ee..d5806bb 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -33,7 +33,7 @@ QWaylandXPixmapGLXContext::QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegrati
     , mWindow(window)
     , mBuffer(0)
     , mPixmap(0)
-    , mConfig(findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
     , mGlxPixmap(0)
 {
     XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
@@ -92,7 +92,7 @@ void * QWaylandXPixmapGLXContext::getProcAddress(const QString &procName)
 
 QPlatformWindowFormat QWaylandXPixmapGLXContext::platformWindowFormat() const
 {
-    return platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+    return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
 }
 
 void QWaylandXPixmapGLXContext::geometryChanged()
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index e94b6a6..e086f91 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -51,6 +51,7 @@
 #include <GL/glx.h>
 
 #include "qglxintegration.h"
+#include "qglxconvenience.h"
 
 #if defined(Q_OS_LINUX) || defined(Q_OS_BSD4)
 #include <dlfcn.h>
@@ -58,182 +59,6 @@
 
 QMutex QGLXContext::m_defaultSharedContextMutex(QMutex::Recursive);
 
-QVector<int> QGLXContext::buildSpec(const QPlatformWindowFormat &format)
-{
-    QVector<int> spec(48);
-    int i = 0;
-
-    spec[i++] = GLX_LEVEL;
-    spec[i++] = 0;
-    spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = GLX_WINDOW_BIT;
-
-    if (format.rgba()) {
-        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_RGBA_BIT;
-        spec[i++] = GLX_RED_SIZE; spec[i++] = (format.redBufferSize() == -1) ? 1 : format.redBufferSize();
-        spec[i++] = GLX_GREEN_SIZE; spec[i++] =  (format.greenBufferSize() == -1) ? 1 : format.greenBufferSize();
-        spec[i++] = GLX_BLUE_SIZE; spec[i++] = (format.blueBufferSize() == -1) ? 1 : format.blueBufferSize();
-        if (format.alpha()) {
-                spec[i++] = GLX_ALPHA_SIZE; spec[i++] = (format.alphaBufferSize() == -1) ? 1 : format.alphaBufferSize();
-            }
-
-        spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-
-        if (format.alpha()) {
-            spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        }
-
-    } else {
-        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_COLOR_INDEX_BIT; //I'm really not sure if this works....
-        spec[i++] = GLX_BUFFER_SIZE; spec[i++] = 8;
-    }
-
-    spec[i++] = GLX_DOUBLEBUFFER; spec[i++] = format.doubleBuffer() ? True : False;
-    spec[i++] = GLX_STEREO; spec[i++] =  format.stereo() ? True : False;
-
-    if (format.depth()) {
-        spec[i++] = GLX_DEPTH_SIZE; spec[i++] = (format.depthBufferSize() == -1) ? 1 : format.depthBufferSize();
-    }
-
-    if (format.stencil()) {
-        spec[i++] = GLX_STENCIL_SIZE; spec[i++] =  (format.stencilBufferSize() == -1) ? 1 : format.stencilBufferSize();
-    }
-    if (format.sampleBuffers()) {
-        spec[i++] = GLX_SAMPLE_BUFFERS_ARB;
-        spec[i++] = 1;
-        spec[i++] = GLX_SAMPLES_ARB;
-        spec[i++] = format.samples() == -1 ? 4 : format.samples();
-    }
-
-    spec[i++] = None;
-    return spec;
-}
-
-GLXFBConfig QGLXContext::findConfig(const QXcbScreen *screen, const QPlatformWindowFormat &format)
-{
-    bool reduced = true;
-    GLXFBConfig chosenConfig = 0;
-    QPlatformWindowFormat reducedFormat = format;
-    while (!chosenConfig && reduced) {
-        QVector<int> spec = buildSpec(reducedFormat);
-        int confcount = 0;
-        GLXFBConfig *configs;
-        configs = glXChooseFBConfig(DISPLAY_FROM_XCB(screen), screen->screenNumber(), spec.constData(), &confcount);
-        if (confcount)
-        {
-            for (int i = 0; i < confcount; i++) {
-                chosenConfig = configs[i];
-                // Make sure we try to get an ARGB visual if the format asked for an alpha:
-                if (reducedFormat.alpha()) {
-                    int alphaSize;
-                    glXGetFBConfigAttrib(DISPLAY_FROM_XCB(screen), configs[i], GLX_ALPHA_SIZE, &alphaSize);
-                    if (alphaSize > 0)
-                        break;
-                } else {
-                    break; // Just choose the first in the list if there's no alpha requested
-                }
-            }
-
-            XFree(configs);
-        }
-        reducedFormat = reducePlatformWindowFormat(reducedFormat,&reduced);
-    }
-
-    if (!chosenConfig)
-        qWarning("Warning no context created");
-
-    return chosenConfig;
-}
-
-XVisualInfo *QGLXContext::findVisualInfo(const QXcbScreen *screen, const QPlatformWindowFormat &format)
-{
-    GLXFBConfig config = QGLXContext::findConfig(screen,format);
-    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(DISPLAY_FROM_XCB(screen), config);
-    return visualInfo;
-}
-
-QPlatformWindowFormat QGLXContext::platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
-{
-    QPlatformWindowFormat format;
-    int redSize     = 0;
-    int greenSize   = 0;
-    int blueSize    = 0;
-    int alphaSize   = 0;
-    int depthSize   = 0;
-    int stencilSize = 0;
-    int sampleBuffers = 0;
-    int sampleCount = 0;
-    int level       = 0;
-    int rgba        = 0;
-    int stereo      = 0;
-    int accumSizeA  = 0;
-    int accumSizeR  = 0;
-    int accumSizeG  = 0;
-    int accumSizeB  = 0;
-
-    XVisualInfo *vi = glXGetVisualFromFBConfig(display,config);
-    glXGetConfig(display,vi,GLX_RGBA,&rgba);
-    XFree(vi);
-    glXGetFBConfigAttrib(display, config, GLX_RED_SIZE,     &redSize);
-    glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE,   &greenSize);
-    glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE,    &blueSize);
-    glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE,   &alphaSize);
-    glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE,   &depthSize);
-    glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize);
-    glXGetFBConfigAttrib(display, config, GLX_SAMPLES,      &sampleBuffers);
-    glXGetFBConfigAttrib(display, config, GLX_LEVEL,        &level);
-    glXGetFBConfigAttrib(display, config, GLX_STEREO,       &stereo);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_ALPHA_SIZE, &accumSizeA);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_RED_SIZE, &accumSizeR);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_GREEN_SIZE, &accumSizeG);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_BLUE_SIZE, &accumSizeB);
-
-    format.setRedBufferSize(redSize);
-    format.setGreenBufferSize(greenSize);
-    format.setBlueBufferSize(blueSize);
-    format.setAlphaBufferSize(alphaSize);
-    format.setDepthBufferSize(depthSize);
-    format.setStencilBufferSize(stencilSize);
-    format.setSampleBuffers(sampleBuffers);
-    if (format.sampleBuffers()) {
-        glXGetFBConfigAttrib(display, config, GLX_SAMPLES_ARB, &sampleCount);
-        format.setSamples(sampleCount);
-    }
-
-    format.setDirectRendering(glXIsDirect(display, ctx));
-    format.setRgba(rgba);
-    format.setStereo(stereo);
-    format.setAccumBufferSize(accumSizeB);
-
-    return format;
-}
-
-QPlatformWindowFormat QGLXContext::reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
-{
-    QPlatformWindowFormat retFormat = format;
-    *reduced = true;
-
-    if (retFormat.sampleBuffers()) {
-        retFormat.setSampleBuffers(false);
-    } else if (retFormat.stereo()) {
-        retFormat.setStereo(false);
-    } else if (retFormat.accum()) {
-        retFormat.setAccum(false);
-    }else if (retFormat.stencil()) {
-        retFormat.setStencil(false);
-    }else if (retFormat.alpha()) {
-        retFormat.setAlpha(false);
-    }else if (retFormat.depth()) {
-        retFormat.setDepth(false);
-    }else if (retFormat.doubleBuffer()) {
-        retFormat.setDoubleBuffer(false);
-    }else{
-        *reduced = false;
-    }
-    return retFormat;
-}
-
 QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindowFormat &format)
     : QPlatformGLContext()
     , m_screen(screen)
@@ -260,9 +85,9 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
     if (sharePlatformContext)
         shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
 
-    GLXFBConfig config = findConfig(screen,format);
+    GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
     m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, shareGlxContext, TRUE);
-    m_windowFormat = QGLXContext::platformWindowFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
+    m_windowFormat = qglx_platformWindowFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
 }
 
 QGLXContext::QGLXContext(QXcbScreen *screen, Drawable drawable, GLXContext context)
@@ -286,7 +111,7 @@ void QGLXContext::createDefaultSharedContex(QXcbScreen *screen)
 
     QPlatformWindowFormat format = QPlatformWindowFormat::defaultFormat();
     GLXContext context;
-    GLXFBConfig config = findConfig(screen,format);
+    GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
     if (config) {
         XVisualInfo *visualInfo = glXGetVisualFromFBConfig(DISPLAY_FROM_XCB(screen), config);
         Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(screen), screen->root(), visualInfo->visual, AllocNone);
diff --git a/src/plugins/platforms/xcb/qglxintegration.h b/src/plugins/platforms/xcb/qglxintegration.h
index f2e20c4..c65a00a 100644
--- a/src/plugins/platforms/xcb/qglxintegration.h
+++ b/src/plugins/platforms/xcb/qglxintegration.h
@@ -66,14 +66,7 @@ public:
 
     QPlatformWindowFormat platformWindowFormat() const;
 
-    static XVisualInfo *findVisualInfo(const QXcbScreen *xd, const QPlatformWindowFormat &format);
-
 private:
-    static GLXFBConfig findConfig(const QXcbScreen *xd,const QPlatformWindowFormat &format);
-    static QVector<int> buildSpec(const QPlatformWindowFormat &format);
-    static QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
-    static QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
-
     QXcbScreen *m_screen;
     Drawable m_drawable;
     GLXContext m_context;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 30b700c..a016ccd 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -63,6 +63,7 @@
 
 #if defined(XCB_USE_GLX)
 #include "qglxintegration.h"
+#include "qglxconvenience.h"
 #elif defined(XCB_USE_EGL)
 #include "../eglconvenience/qeglplatformcontext.h"
 #include "../eglconvenience/qeglconvenience.h"
@@ -112,7 +113,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
        && QApplicationPrivate::platformIntegration()->hasOpenGL() ) {
 #if defined(XCB_USE_GLX)
-            XVisualInfo *visualInfo = QGLXContext::findVisualInfo(m_screen, tlw->platformWindowFormat());
+            XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
 #elif defined(XCB_USE_EGL)
         EGLDisplay eglDisplay = connection()->egl_display();
         EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,tlw->platformWindowFormat(),true);
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index fdbe2cd..122cb40 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -55,6 +55,7 @@ contains(QT_CONFIG, opengl) {
             LIBS += -lEGL
         } else {
             DEFINES += XCB_USE_GLX
+            include (../glxconvenience/glxconvenience.pri)
             HEADERS += qglxintegration.h
             SOURCES += qglxintegration.cpp
         }
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
index 80011d9..9995f87 100644
--- a/src/plugins/platforms/xlib/qglxintegration.cpp
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -51,6 +51,7 @@
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <GL/glx.h>
+#include "qglxconvenience.h"
 
 #include "qglxintegration.h"
 
@@ -62,182 +63,6 @@ QT_BEGIN_NAMESPACE
 
 QMutex QGLXContext::m_defaultSharedContextMutex(QMutex::Recursive);
 
-QVector<int> QGLXContext::buildSpec(const QPlatformWindowFormat &format)
-{
-    QVector<int> spec(48);
-    int i = 0;
-
-    spec[i++] = GLX_LEVEL;
-    spec[i++] = 0;
-    spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = GLX_WINDOW_BIT;
-
-    if (format.rgba()) {
-        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_RGBA_BIT;
-        spec[i++] = GLX_RED_SIZE; spec[i++] = (format.redBufferSize() == -1) ? 1 : format.redBufferSize();
-        spec[i++] = GLX_GREEN_SIZE; spec[i++] =  (format.greenBufferSize() == -1) ? 1 : format.greenBufferSize();
-        spec[i++] = GLX_BLUE_SIZE; spec[i++] = (format.blueBufferSize() == -1) ? 1 : format.blueBufferSize();
-        if (format.alpha()) {
-                spec[i++] = GLX_ALPHA_SIZE; spec[i++] = (format.alphaBufferSize() == -1) ? 1 : format.alphaBufferSize();
-            }
-
-        spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-
-        if (format.alpha()) {
-            spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
-        }
-
-    } else {
-        spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_COLOR_INDEX_BIT; //I'm really not sure if this works....
-        spec[i++] = GLX_BUFFER_SIZE; spec[i++] = 8;
-    }
-
-    spec[i++] = GLX_DOUBLEBUFFER; spec[i++] = format.doubleBuffer() ? True : False;
-    spec[i++] = GLX_STEREO; spec[i++] =  format.stereo() ? True : False;
-
-    if (format.depth()) {
-        spec[i++] = GLX_DEPTH_SIZE; spec[i++] = (format.depthBufferSize() == -1) ? 1 : format.depthBufferSize();
-    }
-
-    if (format.stencil()) {
-        spec[i++] = GLX_STENCIL_SIZE; spec[i++] =  (format.stencilBufferSize() == -1) ? 1 : format.stencilBufferSize();
-    }
-    if (format.sampleBuffers()) {
-        spec[i++] = GLX_SAMPLE_BUFFERS_ARB;
-        spec[i++] = 1;
-        spec[i++] = GLX_SAMPLES_ARB;
-        spec[i++] = format.samples() == -1 ? 4 : format.samples();
-    }
-
-    spec[i++] = XNone;
-    return spec;
-}
-
-GLXFBConfig QGLXContext::findConfig(const QXlibScreen *screen, const QPlatformWindowFormat &format)
-{
-    bool reduced = true;
-    GLXFBConfig chosenConfig = 0;
-    QPlatformWindowFormat reducedFormat = format;
-    while (!chosenConfig && reduced) {
-        QVector<int> spec = buildSpec(reducedFormat);
-        int confcount = 0;
-        GLXFBConfig *configs;
-        configs = glXChooseFBConfig(screen->display()->nativeDisplay(),screen->xScreenNumber(),spec.constData(),&confcount);
-        if (confcount)
-        {
-            for (int i = 0; i < confcount; i++) {
-                chosenConfig = configs[i];
-                // Make sure we try to get an ARGB visual if the format asked for an alpha:
-                if (reducedFormat.alpha()) {
-                    int alphaSize;
-                    glXGetFBConfigAttrib(screen->display()->nativeDisplay(),configs[i],GLX_ALPHA_SIZE,&alphaSize);
-                    if (alphaSize > 0)
-                        break;
-                } else {
-                    break; // Just choose the first in the list if there's no alpha requested
-                }
-            }
-
-            XFree(configs);
-        }
-        reducedFormat = reducePlatformWindowFormat(reducedFormat,&reduced);
-    }
-
-    if (!chosenConfig)
-        qWarning("Warning no context created");
-
-    return chosenConfig;
-}
-
-XVisualInfo *QGLXContext::findVisualInfo(const QXlibScreen *screen, const QPlatformWindowFormat &format)
-{
-    GLXFBConfig config = QGLXContext::findConfig(screen,format);
-    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(screen->display()->nativeDisplay(),config);
-    return visualInfo;
-}
-
-QPlatformWindowFormat QGLXContext::platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
-{
-    QPlatformWindowFormat format;
-    int redSize     = 0;
-    int greenSize   = 0;
-    int blueSize    = 0;
-    int alphaSize   = 0;
-    int depthSize   = 0;
-    int stencilSize = 0;
-    int sampleBuffers = 0;
-    int sampleCount = 0;
-    int level       = 0;
-    int rgba        = 0;
-    int stereo      = 0;
-    int accumSizeA  = 0;
-    int accumSizeR  = 0;
-    int accumSizeG  = 0;
-    int accumSizeB  = 0;
-
-    XVisualInfo *vi = glXGetVisualFromFBConfig(display,config);
-    glXGetConfig(display,vi,GLX_RGBA,&rgba);
-    XFree(vi);
-    glXGetFBConfigAttrib(display, config, GLX_RED_SIZE,     &redSize);
-    glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE,   &greenSize);
-    glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE,    &blueSize);
-    glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE,   &alphaSize);
-    glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE,   &depthSize);
-    glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize);
-    glXGetFBConfigAttrib(display, config, GLX_SAMPLES,      &sampleBuffers);
-    glXGetFBConfigAttrib(display, config, GLX_LEVEL,        &level);
-    glXGetFBConfigAttrib(display, config, GLX_STEREO,       &stereo);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_ALPHA_SIZE, &accumSizeA);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_RED_SIZE, &accumSizeR);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_GREEN_SIZE, &accumSizeG);
-    glXGetFBConfigAttrib(display, config, GLX_ACCUM_BLUE_SIZE, &accumSizeB);
-
-    format.setRedBufferSize(redSize);
-    format.setGreenBufferSize(greenSize);
-    format.setBlueBufferSize(blueSize);
-    format.setAlphaBufferSize(alphaSize);
-    format.setDepthBufferSize(depthSize);
-    format.setStencilBufferSize(stencilSize);
-    format.setSampleBuffers(sampleBuffers);
-    if (format.sampleBuffers()) {
-        glXGetFBConfigAttrib(display, config, GLX_SAMPLES_ARB, &sampleCount);
-        format.setSamples(sampleCount);
-    }
-
-    format.setDirectRendering(glXIsDirect(display, ctx));
-    format.setRgba(rgba);
-    format.setStereo(stereo);
-    format.setAccumBufferSize(accumSizeB);
-
-    return format;
-}
-
-QPlatformWindowFormat QGLXContext::reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
-{
-    QPlatformWindowFormat retFormat = format;
-    *reduced = true;
-
-    if (retFormat.sampleBuffers()) {
-        retFormat.setSampleBuffers(false);
-    } else if (retFormat.stereo()) {
-        retFormat.setStereo(false);
-    } else if (retFormat.accum()) {
-        retFormat.setAccum(false);
-    }else if (retFormat.stencil()) {
-        retFormat.setStencil(false);
-    }else if (retFormat.alpha()) {
-        retFormat.setAlpha(false);
-    }else if (retFormat.depth()) {
-        retFormat.setDepth(false);
-    }else if (retFormat.doubleBuffer()) {
-        retFormat.setDoubleBuffer(false);
-    }else{
-        *reduced = false;
-    }
-    return retFormat;
-}
-
 QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWindowFormat &format)
     : QPlatformGLContext()
     , m_screen(screen)
@@ -264,9 +89,9 @@ QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWind
     if (sharePlatformContext)
         shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
 
-    GLXFBConfig config = findConfig(screen,format);
+    GLXFBConfig config = qglx_findConfig(screen->display()->nativeDisplay(),screen->xScreenNumber(),format);
     m_context = glXCreateNewContext(screen->display()->nativeDisplay(),config,GLX_RGBA_TYPE,shareGlxContext,TRUE);
-    m_windowFormat = QGLXContext::platformWindowFromGLXFBConfig(screen->display()->nativeDisplay(),config,m_context);
+    m_windowFormat = qglx_platformWindowFromGLXFBConfig(screen->display()->nativeDisplay(),config,m_context);
 
 #ifdef MYX11_DEBUG
     qDebug() << "QGLXGLContext::create context" << m_context;
@@ -296,7 +121,7 @@ void QGLXContext::createDefaultSharedContex(QXlibScreen *screen)
 
     QPlatformWindowFormat format = QPlatformWindowFormat::defaultFormat();
     GLXContext context;
-    GLXFBConfig config = findConfig(screen,format);
+    GLXFBConfig config = qglx_findConfig(screen->display()->nativeDisplay(),screen->xScreenNumber(),format);
     if (config) {
         XVisualInfo *visualInfo = glXGetVisualFromFBConfig(screen->display()->nativeDisplay(),config);
         Colormap cmap = XCreateColormap(screen->display()->nativeDisplay(),screen->rootWindow(),visualInfo->visual,AllocNone);
diff --git a/src/plugins/platforms/xlib/qglxintegration.h b/src/plugins/platforms/xlib/qglxintegration.h
index dbb5c2e..8a40527 100644
--- a/src/plugins/platforms/xlib/qglxintegration.h
+++ b/src/plugins/platforms/xlib/qglxintegration.h
@@ -69,14 +69,7 @@ public:
 
     QPlatformWindowFormat platformWindowFormat() const;
 
-    static XVisualInfo *findVisualInfo(const QXlibScreen *xd, const QPlatformWindowFormat &format);
 private:
-    static GLXFBConfig findConfig(const QXlibScreen *xd,const QPlatformWindowFormat &format);
-    static QVector<int> buildSpec(const QPlatformWindowFormat &format);
-    static QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
-    static QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
-
-
     QXlibScreen  *m_screen;
     Drawable    m_drawable;
     GLXContext  m_context;
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index 01d4b8e..e9bcbf5 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -58,6 +58,7 @@
 #if !defined(QT_NO_OPENGL)
 #if !defined(QT_OPENGL_ES_2)
 #include "qglxintegration.h"
+#include "qglxconvenience.h"
 #else
 #include "../eglconvenience/qeglconvenience.h"
 #include "../eglconvenience/qeglplatformcontext.h"
@@ -83,7 +84,7 @@ QXlibWindow::QXlibWindow(QWidget *window)
             && QApplicationPrivate::platformIntegration()->hasOpenGL() ) {
 #if !defined(QT_NO_OPENGL)
 #if !defined(QT_OPENGL_ES_2)
-        XVisualInfo *visualInfo = QGLXContext::findVisualInfo(mScreen,window->platformWindowFormat());
+        XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(),mScreen->xScreenNumber(),window->platformWindowFormat());
 #else
         QPlatformWindowFormat windowFormat = correctColorBuffers(window->platformWindowFormat());
 
diff --git a/src/plugins/platforms/xlib/xlib.pro b/src/plugins/platforms/xlib/xlib.pro
index 159fdbe..4cda1a7 100644
--- a/src/plugins/platforms/xlib/xlib.pro
+++ b/src/plugins/platforms/xlib/xlib.pro
@@ -39,6 +39,7 @@ include (../fontdatabases/genericunix/genericunix.pri)
 contains(QT_CONFIG, opengl) {
     QT += opengl
     !contains(QT_CONFIG, opengles2) {
+        include (../glxconvenience/glxconvenience.pri)
         HEADERS += qglxintegration.h
         SOURCES += qglxintegration.cpp
     } else { # There is no easy way to detect if we'r suppose to use glx or not
-- 
cgit v0.12


From fe0e71ae0bc13464ecbcc39b6db9300fc6200779 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 25 Jan 2011 10:01:56 +0100
Subject: Improved performance of mapFromGlobal/mapToGlobal on X11
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

We don't call XTranslateCoordinates anymore, but use the toplevel window
offset that we already store to convert between screen coordinates and
widget coordinates.

Reviewed-by: João Abecasis
---
 src/gui/kernel/qwidget_x11.cpp | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index c6753fc..4f39443 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -1333,12 +1333,40 @@ QPoint QWidgetPrivate::mapFromGlobal(const QPoint &pos) const
 QPoint QWidget::mapToGlobal(const QPoint &pos) const
 {
     Q_D(const QWidget);
+    QPoint offset = data->crect.topLeft();
+    const QWidget *w = this;
+    const QWidget *p = w->parentWidget();
+    while (!w->isWindow() && p) {
+        w = p;
+        p = p->parentWidget();
+        offset += w->data->crect.topLeft();
+    }
+
+    const QWidgetPrivate *wd = w->d_func();
+    QTLWExtra *tlw = wd->topData();
+    if (!tlw->embedded)
+        return pos + offset;
+
     return d->mapToGlobal(pos);
 }
 
 QPoint QWidget::mapFromGlobal(const QPoint &pos) const
 {
     Q_D(const QWidget);
+    QPoint offset = data->crect.topLeft();
+    const QWidget *w = this;
+    const QWidget *p = w->parentWidget();
+    while (!w->isWindow() && p) {
+        w = p;
+        p = p->parentWidget();
+        offset += w->data->crect.topLeft();
+    }
+
+    const QWidgetPrivate *wd = w->d_func();
+    QTLWExtra *tlw = wd->topData();
+    if (!tlw->embedded)
+        return pos - offset;
+
     return d->mapFromGlobal(pos);
 }
 
-- 
cgit v0.12


From 7e50de65d564d69d28a73fee3c65dd0a92bf3f53 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 24 Mar 2011 17:15:27 +0100
Subject: Fixed documentation for QLocale

Reviewed-by: trustme
---
 src/corelib/tools/qlocale.cpp  | 31 +++++++++++++++----------------
 src/corelib/tools/qlocale.h    |  1 -
 src/corelib/tools/qlocale.qdoc |  2 ++
 3 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index e264a64..2e838bd 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -825,36 +825,35 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
 /*!
     \since 4.8
 
-    Returns a string according to the current locale.
+    Returns a string that represents a join of a given \a list of strings with
+    a separator defined by the locale.
 */
-QString QLocale::createSeparatedList(const QStringList &strl) const
+QString QLocale::createSeparatedList(const QStringList &list) const
 {
 #ifndef QT_NO_SYSTEMLOCALE
     if (d() == systemPrivate()) {
         QVariant res;
-        res = systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(strl));
+        res = systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(list));
 
         if (!res.isNull())
             return res.toString();
     }
 #endif
 
-    const int size = strl.size();
-    if (size == 1)
-        return strl.at(0);
-    else if (size == 2) {
+    const int size = list.size();
+    if (size == 1) {
+        return list.at(0);
+    } else if (size == 2) {
         QString format = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_two_idx, d()->m_list_pattern_part_two_size);
-        return format.arg(strl.at(0), strl.at(1));
-    }
-    else if (size > 2) {
+        return format.arg(list.at(0), list.at(1));
+    } else if (size > 2) {
         QString formatStart = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_start_idx, d()->m_list_pattern_part_start_size);
         QString formatMid = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_mid_idx, d()->m_list_pattern_part_mid_size);
         QString formatEnd = getLocaleData(list_pattern_part_data + d()->m_list_pattern_part_end_idx, d()->m_list_pattern_part_end_size);
-        QString result = formatStart.arg(strl.at(0), strl.at(1));
-        int i;
-        for (i = 2; i < size - 1; ++i)
-            result = formatMid.arg(result, strl.at(i));
-        result = formatEnd.arg(result, strl.at(size - 1));
+        QString result = formatStart.arg(list.at(0), list.at(1));
+        for (int i = 2; i < size - 1; ++i)
+            result = formatMid.arg(result, list.at(i));
+        result = formatEnd.arg(result, list.at(size - 1));
         return result;
     }
 
@@ -1852,7 +1851,7 @@ QStringList QLocale::matchingLocales(QLocale::Language language,
     database. If the result is an empty list, then \a language is not represented in
     Qt's locale database.
 
-    \sa matchingLocales
+    \sa matchingLocales()
 */
 QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
 {
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 71eec47..ecb608e 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -736,7 +736,6 @@ public:
     inline bool operator!=(const QLocale &other) const;
 
     static QString languageToString(Language language);
-    static QString languageToString(Language language, Script script);
     static QString countryToString(Country country);
     static QString scriptToString(Script script);
     static void setDefault(const QLocale &locale);
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index ea5ec33..f6b1d27 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -763,6 +763,8 @@
   \value StringToStandardQuotation a QString containing a quoted version of the string ref stored in the in variant using standard quotes.
   \value StringToAlternateQuotation a QString containing a quoted version of the string ref stored in the in variant using alternate quotes.
   \value Weekdays a QList<Qt::DayOfWeek> specifying the regular weekdays
+  \value LocaleChanged this type is queried whenever the system locale is changed.
+  \value ListToSeparatedString a string that represents a join of a given QStringList with a locale-defined separator.
 */
 
 /*!
-- 
cgit v0.12


From 116fed06f9ed561befb505d94b6b44dc71bf9e45 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 24 Mar 2011 17:17:17 +0100
Subject: Use QByteArray::isEmpty instead of isNull in QLocale

When checking whether the environment variable is set or not, check for
its length by using isEmpty as the envvar can be set to an empty string.

Task-number: QTBUG-15321
Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale_mac.mm   | 4 ++--
 src/corelib/tools/qlocale_unix.cpp | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index c824ec0..172997d 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -61,9 +61,9 @@ static QByteArray envVarLocale()
     static QByteArray lang = 0;
 #ifdef Q_OS_UNIX
     lang = qgetenv("LC_ALL");
-    if (lang.isNull())
+    if (lang.isEmpty())
         lang = qgetenv("LC_NUMERIC");
-    if (lang.isNull())
+    if (lang.isEmpty())
 #endif
         lang = qgetenv("LANG");
     return lang;
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
index 21097bf..40a52ba 100644
--- a/src/corelib/tools/qlocale_unix.cpp
+++ b/src/corelib/tools/qlocale_unix.cpp
@@ -94,9 +94,9 @@ Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
 QLocale QSystemLocale::fallbackLocale() const
 {
     QByteArray lang = qgetenv("LC_ALL");
-    if (lang.isNull())
+    if (lang.isEmpty())
         lang = qgetenv("LC_NUMERIC");
-    if (lang.isNull())
+    if (lang.isEmpty())
         lang = qgetenv("LANG");
     return QLocale(QLatin1String(lang));
 }
-- 
cgit v0.12


From 31ca1ee427cce4dadb98e3091504db707346b0bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 24 Mar 2011 18:55:18 +0100
Subject: Prevent crash on exit by deleting QXcbWindow's GL context
 integration.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index a016ccd..e33a661 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -195,6 +195,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 
 QXcbWindow::~QXcbWindow()
 {
+    delete m_context;
     xcb_destroy_window(xcb_connection(), m_window);
 }
 
-- 
cgit v0.12


From f55e9ff471a29eb4c8f0e1558bc5b0592686ddf2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 25 Mar 2011 08:23:53 +0100
Subject: Lighthouse: Wayland: Print out what platformbackend we are using

---
 .../wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp     | 4 ++++
 .../gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp      | 1 +
 .../gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h        | 1 -
 .../gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp      | 3 +++
 4 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
index 1f77064..942e591 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -4,12 +4,16 @@
 
 #include "qwaylandeglwindow.h"
 
+#include <QtCore/QDebug>
+
 QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay)
     : mWaylandDisplay(waylandDisplay)
     , mNativeEglDisplay(wl_egl_display_create(mWaylandDisplay))
 {
+    qDebug() << "Using Wayland-EGL";
 }
 
+
 QWaylandEglIntegration::~QWaylandEglIntegration()
 {
     eglTerminate(mEglDisplay);
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
index a121900..8ccfc67 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
@@ -8,6 +8,7 @@ QWaylandXPixmapEglIntegration::QWaylandXPixmapEglIntegration(QWaylandDisplay *di
     : QWaylandGLIntegration()
     , mWaylandDisplay(display)
 {
+    qDebug() << "Using Wayland XPixmap-EGL";
     char *display_name = getenv("DISPLAY");
     mDisplay = XOpenDisplay(display_name);
     mScreen = XDefaultScreen(mDisplay);
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
index 534494b..9e7cb66 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
@@ -12,7 +12,6 @@
 #include <X11/Xlib.h>
 
 #include <EGL/egl.h>
-//#include <EGL
 
 class QWaylandXPixmapEglIntegration : public QWaylandGLIntegration
 {
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
index 17593d7..f094946 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
@@ -2,10 +2,13 @@
 
 #include "qwaylandxpixmapglxwindow.h"
 
+#include <QtCore/QDebug>
+
 QWaylandXPixmapGLXIntegration::QWaylandXPixmapGLXIntegration(QWaylandDisplay * waylandDispaly)
     : QWaylandGLIntegration()
     , mWaylandDisplay(waylandDispaly)
 {
+    qDebug() << "Using Wayland XPixmap-GLX";
     char *display_name = getenv("DISPLAY");
     mDisplay = XOpenDisplay(display_name);
     mScreen = XDefaultScreen(mDisplay);
-- 
cgit v0.12


From 372539b350b8c48863d04e46438267210569768e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 25 Mar 2011 08:32:57 +0100
Subject: Lighthouse: Wayland: Fix the readback for the glContext in the egl

backend
---
 .../xpixmap_egl/qwaylandxpixmapeglcontext.cpp      | 33 ++++++++++++++++++++--
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
index e29ad97..32ba6de 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
@@ -3,11 +3,34 @@
 #include "../../../eglconvenience/qeglconvenience.h"
 
 #include <QtOpenGL/QGLContext>
+#include <QtOpenGL/private/qglextensions_p.h>
 
 #include "qwaylandshmsurface.h"
 
 #include <QtCore/QDebug>
 
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+    const int width = img.width();
+    const int height = img.height();
+
+    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+    {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+        }
+    } else {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+        }
+    }
+}
+
 QXPixmapReadbackGLContext::QXPixmapReadbackGLContext(QWaylandXPixmapEglIntegration *eglIntegration, QWaylandXPixmapWindow *window)
     : mEglIntegration(eglIntegration)
     , mWindow(window)
@@ -65,6 +88,7 @@ void QXPixmapReadbackGLContext::swapBuffers()
     glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
 
     img = img.mirrored();
+    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
     constBits = img.bits();
 
     const uchar *constDstBits = mBuffer->image()->bits();
@@ -87,15 +111,18 @@ QPlatformWindowFormat QXPixmapReadbackGLContext::platformWindowFormat() const
 
 void QXPixmapReadbackGLContext::geometryChanged()
 {
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
     while (mWindow->waitingForFrameSync())
         mEglIntegration->waylandDisplay()->iterate();
 
-    QSize size(mWindow->geometry().size());
     delete mBuffer;
     if (mPixmap)
         XFreePixmap(mEglIntegration->xDisplay(),mPixmap);
-    if (mPixmapSurface != EGL_NO_SURFACE)
-        eglDestroySurface(mEglIntegration->eglDisplay(),mPixmapSurface);
 
     mBuffer = new QWaylandShmBuffer(mEglIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
     mWindow->attach(mBuffer);
-- 
cgit v0.12


From 10d81f9a815f889ebf693f89eaf381299d7ccfc2 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Fri, 25 Mar 2011 10:30:17 +0100
Subject: QHostInfo: Don't mess with addr family ordering

Reviewed-by: Aaron Tunney
---
 src/network/kernel/qhostinfo_symbian.cpp | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 5998a72..02bef40 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -160,13 +160,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
 
         // Ensure that record is valid (not an alias and with length greater than 0)
         if (!(nameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
-           if (nameResult().iAddr.Family() == KAfInet) {
-                // IPv4 - prepend
-                hostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
-            } else {
-                // IPv6 - append
-                hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
-            }
+            hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
         }
     }
 
@@ -389,13 +383,7 @@ void QSymbianHostResolver::processNameResults()
 
         // Ensure that record is valid (not an alias and with length greater than 0)
         if (!(iNameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
-           if (iNameResult().iAddr.Family() == KAfInet) {
-                // IPv4 - prepend
-                hostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
-            } else {
-                // IPv6 - append
-                hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
-            }
+            hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
         }
     }
 
-- 
cgit v0.12


From 3b37a79cd94bb0c03d7d8af0f20036ed60a7056f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 25 Mar 2011 10:59:50 +0100
Subject: Fixed GLX on Nvidia for XCB backend.

We probably need to make sure the window is mapped before we start
issuing GL commands.
---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index e33a661..b6c133f 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -219,6 +219,9 @@ void QXcbWindow::setVisible(bool visible)
             xcb_wm_hints_set_normal(&hints);
         xcb_set_wm_hints(xcb_connection(), m_window, &hints);
         xcb_map_window(xcb_connection(), m_window);
+#if defined(XCB_USE_GLX)
+        glXWaitX();
+#endif
     } else {
         xcb_unmap_window(xcb_connection(), m_window);
 
-- 
cgit v0.12


From c648418f82450f12de14b93d007c7564cd77a791 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 25 Mar 2011 12:49:40 +0100
Subject: Fixed typo.

---
 .../wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp          | 4 ++--
 .../platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h  | 2 +-
 src/plugins/platforms/xcb/qglxintegration.cpp                         | 4 ++--
 src/plugins/platforms/xcb/qglxintegration.h                           | 2 +-
 src/plugins/platforms/xlib/qglxintegration.cpp                        | 4 ++--
 src/plugins/platforms/xlib/qglxintegration.h                          | 2 +-
 6 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
index 4444229..89ba12b 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
@@ -63,7 +63,7 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindo
     if (format.useDefaultSharedContext()) {
         if (!QPlatformGLContext::defaultSharedContext()) {
             if (qt_defaultSharedContextMutex()->tryLock()){
-                createDefaultSharedContex(eglDisplay);
+                createDefaultSharedContext(eglDisplay);
                 qt_defaultSharedContextMutex()->unlock();
             } else {
                 qt_defaultSharedContextMutex()->lock(); //wait to the the shared context is created
@@ -128,7 +128,7 @@ void *QWaylandGLContext::getProcAddress(const QString &string)
     return (void *) eglGetProcAddress(string.toLatin1().data());
 }
 
-void QWaylandGLContext::createDefaultSharedContex(EGLDisplay display)
+void QWaylandGLContext::createDefaultSharedContext(EGLDisplay display)
 {
     QVector<EGLint> eglContextAttrs;
     eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
index d530b1c..a3befdc 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
@@ -72,7 +72,7 @@ private:
     EGLConfig mConfig;
     QPlatformWindowFormat mFormat;
 
-    void createDefaultSharedContex(EGLDisplay eglDisplay);
+    void createDefaultSharedContext(EGLDisplay eglDisplay);
     QWaylandGLContext();
 
 };
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index e086f91..bce3dfc 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -70,7 +70,7 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
     if (format.useDefaultSharedContext()) {
         if (!QPlatformGLContext::defaultSharedContext()) {
             if (m_defaultSharedContextMutex.tryLock()){
-                createDefaultSharedContex(screen);
+                createDefaultSharedContext(screen);
                 m_defaultSharedContextMutex.unlock();
             } else {
                 m_defaultSharedContextMutex.lock(); //wait to the the shared context is created
@@ -102,7 +102,7 @@ QGLXContext::~QGLXContext()
         glXDestroyContext(DISPLAY_FROM_XCB(m_screen), m_context);
 }
 
-void QGLXContext::createDefaultSharedContex(QXcbScreen *screen)
+void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
 {
     int x = 0;
     int y = 0;
diff --git a/src/plugins/platforms/xcb/qglxintegration.h b/src/plugins/platforms/xcb/qglxintegration.h
index c65a00a..2e19cf2 100644
--- a/src/plugins/platforms/xcb/qglxintegration.h
+++ b/src/plugins/platforms/xcb/qglxintegration.h
@@ -74,7 +74,7 @@ private:
 
     QGLXContext (QXcbScreen *screen, Drawable drawable, GLXContext context);
     static QMutex m_defaultSharedContextMutex;
-    static void createDefaultSharedContex(QXcbScreen *xd);
+    static void createDefaultSharedContext(QXcbScreen *xd);
 };
 
 #endif
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
index 9995f87..6746e22 100644
--- a/src/plugins/platforms/xlib/qglxintegration.cpp
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -74,7 +74,7 @@ QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWind
     if (format.useDefaultSharedContext()) {
         if (!QPlatformGLContext::defaultSharedContext()) {
             if (m_defaultSharedContextMutex.tryLock()){
-                createDefaultSharedContex(screen);
+                createDefaultSharedContext(screen);
                 m_defaultSharedContextMutex.unlock();
             } else {
                 m_defaultSharedContextMutex.lock(); //wait to the the shared context is created
@@ -112,7 +112,7 @@ QGLXContext::~QGLXContext()
     }
 }
 
-void QGLXContext::createDefaultSharedContex(QXlibScreen *screen)
+void QGLXContext::createDefaultSharedContext(QXlibScreen *screen)
 {
     int x = 0;
     int y = 0;
diff --git a/src/plugins/platforms/xlib/qglxintegration.h b/src/plugins/platforms/xlib/qglxintegration.h
index 8a40527..cf6b006 100644
--- a/src/plugins/platforms/xlib/qglxintegration.h
+++ b/src/plugins/platforms/xlib/qglxintegration.h
@@ -77,7 +77,7 @@ private:
 
     QGLXContext (QXlibScreen *screen, Drawable drawable, GLXContext context);
     static QMutex m_defaultSharedContextMutex;
-    static void createDefaultSharedContex(QXlibScreen *xd);
+    static void createDefaultSharedContext(QXlibScreen *xd);
 };
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From be5e7924ec7bd6cccd626f931f55e2687910ad13 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Mar 2011 13:33:54 +0000
Subject: Fix for tst_QEventLoop::processEventsExcludeSocket

Depending on the OS scheduling, the TCP data sent and flushed may not
have been looped back to trigger the socket's ready to read notification
before the test called processEvents.
This caused a failure on CI system windows 7.
Added a short delay before processEvents to allow the OS to catch up.

Reviewed-By: Markus Goetz
---
 tests/auto/qeventloop/tst_qeventloop.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp
index aad8390..fa2a34e 100644
--- a/tests/auto/qeventloop/tst_qeventloop.cpp
+++ b/tests/auto/qeventloop/tst_qeventloop.cpp
@@ -602,6 +602,7 @@ public slots:
         QTcpSocket *serverSocket = server->nextPendingConnection();
         serverSocket->write(data, size);
         serverSocket->flush();
+        QTest::qSleep(200); //allow the TCP/IP stack time to loopback the data, so our socket is ready to read
         QCoreApplication::processEvents(QEventLoop::ExcludeSocketNotifiers);
         testResult = dataArrived;
         QCoreApplication::processEvents(); //check the deferred event is processed
-- 
cgit v0.12


From 57909eb88ff571fba18459045bd0f8344b32247a Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 23 Mar 2011 16:21:50 +0100
Subject: Add a test in QVariant for forward declared classes

---
 tests/auto/qvariant/tst_qvariant.cpp | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tests/auto/qvariant/tst_qvariant.cpp b/tests/auto/qvariant/tst_qvariant.cpp
index 2e57264..6ebe84e 100644
--- a/tests/auto/qvariant/tst_qvariant.cpp
+++ b/tests/auto/qvariant/tst_qvariant.cpp
@@ -275,6 +275,8 @@ private slots:
     void variantInVariant();
 
     void colorInteger();
+
+    void forwardDeclare();
 };
 
 Q_DECLARE_METATYPE(QDate)
@@ -3439,5 +3441,16 @@ void tst_QVariant::colorInteger()
     QCOMPARE(v.value<QColor>(), QColor(Qt::yellow));
 }
 
+class Forward;
+Q_DECLARE_METATYPE(Forward*);
+
+void tst_QVariant::forwardDeclare()
+{
+    Forward *f = 0;
+    QVariant v = QVariant::fromValue(f);
+    QCOMPARE(qvariant_cast<Forward*>(v), f);
+}
+
+
 QTEST_MAIN(tst_QVariant)
 #include "tst_qvariant.moc"
-- 
cgit v0.12


From ffab45eeec38416631a2c95148dbbedb8add2d7c Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Mar 2011 17:03:59 +0000
Subject: Fix new http multipart test case on symbian

The new test added three reference data files required by the test,
but these were not being included in the sis file.

Reviewed-by: mread
---
 tests/auto/qnetworkreply/test/test.pro | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/tests/auto/qnetworkreply/test/test.pro b/tests/auto/qnetworkreply/test/test.pro
index 80b879a..d1f6707 100644
--- a/tests/auto/qnetworkreply/test/test.pro
+++ b/tests/auto/qnetworkreply/test/test.pro
@@ -16,21 +16,18 @@ win32 {
 QT = core network
 RESOURCES += ../qnetworkreply.qrc
 
-wince*: {
-    addFiles.files = ../empty ../rfc3252.txt ../resource
-    addFiles.path = .
-    DEPLOYMENT += addFiles
-}
-
-symbian:{
-    addFiles.files = ../empty ../rfc3252.txt ../resource ../bigfile
+symbian|wince*:{
+    # For cross compiled targets, reference data files need to be deployed
+    addFiles.files = ../empty ../rfc3252.txt ../resource ../bigfile ../*.jpg
     addFiles.path = .
     DEPLOYMENT += addFiles
 
     certFiles.files = ../certs
     certFiles.path    = .
     DEPLOYMENT += certFiles
+}
 
+symbian:{
     # Symbian toolchain does not support correct include semantics
     INCLUDEPATH+=..\\..\\..\\..\\include\\QtNetwork\\private
     # bigfile test case requires more heap
-- 
cgit v0.12


From 41ffab6b5b2d9f5a578109a4ea6ca0c5df58a3eb Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 12:54:29 +0100
Subject: Update DEF files

---
 src/s60installs/bwins/QtCoreu.def    | 40 +++++++++++++++++++++++++++--
 src/s60installs/bwins/QtGuiu.def     |  6 +++++
 src/s60installs/bwins/QtNetworku.def | 31 ++++++++++++++++++++++
 src/s60installs/eabi/QtCoreu.def     | 30 ++++++++++++++++++++++
 src/s60installs/eabi/QtGuiu.def      | 50 ++++++++++++++++++++++++++----------
 src/s60installs/eabi/QtNetworku.def  | 32 +++++++++++++++++++++++
 src/s60installs/eabi/QtOpenVGu.def   |  4 +++
 7 files changed, 178 insertions(+), 15 deletions(-)

diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index 8265f98..f6d4271 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -1375,7 +1375,7 @@ EXPORTS
 	?count@QStringRef@@QBEHXZ @ 1374 NONAME ; int QStringRef::count(void) const
 	?countriesForLanguage@QLocale@@SA?AV?$QList@W4Country@QLocale@@@@W4Language@1@@Z @ 1375 NONAME ; class QList<enum QLocale::Country> QLocale::countriesForLanguage(enum QLocale::Language)
 	?country@QLocale@@QBE?AW4Country@1@XZ @ 1376 NONAME ; enum QLocale::Country QLocale::country(void) const
-	?countryId@QLocalePrivate@@QBEIXZ @ 1377 NONAME ; unsigned int QLocalePrivate::countryId(void) const
+	?countryId@QLocalePrivate@@QBEIXZ @ 1377 NONAME ABSENT ; unsigned int QLocalePrivate::countryId(void) const
 	?countryToString@QLocale@@SA?AVQString@@W4Country@1@@Z @ 1378 NONAME ; class QString QLocale::countryToString(enum QLocale::Country)
 	?create@QAbstractFileEngine@@SAPAV1@ABVQString@@@Z @ 1379 NONAME ; class QAbstractFileEngine * QAbstractFileEngine::create(class QString const &)
 	?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@PAVQByteArray@@@Z @ 1380 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QByteArray *)
@@ -2331,7 +2331,7 @@ EXPORTS
 	?killTimer@QObject@@QAEXH@Z @ 2330 NONAME ; void QObject::killTimer(int)
 	?killTimer@QTimer@@AAEXH@Z @ 2331 NONAME ; void QTimer::killTimer(int)
 	?language@QLocale@@QBE?AW4Language@1@XZ @ 2332 NONAME ; enum QLocale::Language QLocale::language(void) const
-	?languageId@QLocalePrivate@@QBEIXZ @ 2333 NONAME ; unsigned int QLocalePrivate::languageId(void) const
+	?languageId@QLocalePrivate@@QBEIXZ @ 2333 NONAME ABSENT ; unsigned int QLocalePrivate::languageId(void) const
 	?languageToString@QLocale@@SA?AVQString@@W4Language@1@@Z @ 2334 NONAME ; class QString QLocale::languageToString(enum QLocale::Language)
 	?lastIndexIn@QRegExp@@QBEHABVQString@@HW4CaretMode@1@@Z @ 2335 NONAME ; int QRegExp::lastIndexIn(class QString const &, int, enum QRegExp::CaretMode) const
 	?lastIndexOf@QByteArray@@QBEHABV1@H@Z @ 2336 NONAME ; int QByteArray::lastIndexOf(class QByteArray const &, int) const
@@ -4631,3 +4631,39 @@ EXPORTS
 	?removeSocket@QSymbianSocketManager@@QAE_NABVRSocket@@@Z @ 4630 NONAME ; bool QSymbianSocketManager::removeSocket(class RSocket const &)
 	?started@QAnimationDriver@@MAEXXZ @ 4631 NONAME ; void QAnimationDriver::started(void)
 	?stopped@QAnimationDriver@@MAEXXZ @ 4632 NONAME ; void QAnimationDriver::stopped(void)
+	?toCurrencyString@QLocale@@QBE?AVQString@@NABV2@@Z @ 4633 NONAME ; class QString QLocale::toCurrencyString(double, class QString const &) const
+	?quoteString@QLocale@@QBE?AVQString@@ABVQStringRef@@W4QuotationStyle@1@@Z @ 4634 NONAME ; class QString QLocale::quoteString(class QStringRef const &, enum QLocale::QuotationStyle) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@FABV2@@Z @ 4635 NONAME ; class QString QLocale::toCurrencyString(short, class QString const &) const
+	?countryCode@QLocalePrivate@@QBE?AVQString@@XZ @ 4636 NONAME ; class QString QLocalePrivate::countryCode(void) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@IABV2@@Z @ 4637 NONAME ; class QString QLocale::toCurrencyString(unsigned int, class QString const &) const
+	?longLongToString@QLocalePrivate@@SA?AVQString@@VQChar@@000_JHHHI@Z @ 4638 NONAME ; class QString QLocalePrivate::longLongToString(class QChar, class QChar, class QChar, class QChar, long long, int, int, int, unsigned int)
+	?codeToScript@QLocalePrivate@@SA?AW4Script@QLocale@@ABVQString@@@Z @ 4639 NONAME ; enum QLocale::Script QLocalePrivate::codeToScript(class QString const &)
+	?bcp47Name@QLocale@@QBE?AVQString@@XZ @ 4640 NONAME ; class QString QLocale::bcp47Name(void) const
+	?quoteString@QLocale@@QBE?AVQString@@ABV2@W4QuotationStyle@1@@Z @ 4641 NONAME ; class QString QLocale::quoteString(class QString const &, enum QLocale::QuotationStyle) const
+	?unsLongLongToString@QLocalePrivate@@SA?AVQString@@VQChar@@00_KHHHI@Z @ 4642 NONAME ; class QString QLocalePrivate::unsLongLongToString(class QChar, class QChar, class QChar, unsigned long long, int, int, int, unsigned int)
+	?toCurrencyString@QLocale@@QBE?AVQString@@_KABV2@@Z @ 4643 NONAME ; class QString QLocale::toCurrencyString(unsigned long long, class QString const &) const
+	?firstDayOfWeek@QLocale@@QBE?AW4DayOfWeek@Qt@@XZ @ 4644 NONAME ; enum Qt::DayOfWeek QLocale::firstDayOfWeek(void) const
+	?createSeparatedList@QLocale@@QBE?AVQString@@ABVQStringList@@@Z @ 4645 NONAME ; class QString QLocale::createSeparatedList(class QStringList const &) const
+	?codeToCountry@QLocalePrivate@@SA?AW4Country@QLocale@@ABVQString@@@Z @ 4646 NONAME ; enum QLocale::Country QLocalePrivate::codeToCountry(class QString const &)
+	?scriptCode@QLocalePrivate@@QBE?AVQString@@XZ @ 4647 NONAME ; class QString QLocalePrivate::scriptCode(void) const
+	?scriptToString@QLocale@@SA?AVQString@@W4Script@1@@Z @ 4648 NONAME ; class QString QLocale::scriptToString(enum QLocale::Script)
+	?script@QLocale@@QBE?AW4Script@1@XZ @ 4649 NONAME ; enum QLocale::Script QLocale::script(void) const
+	?codeToLanguage@QLocalePrivate@@SA?AW4Language@QLocale@@ABVQString@@@Z @ 4650 NONAME ; enum QLocale::Language QLocalePrivate::codeToLanguage(class QString const &)
+	?weekdays@QLocale@@QBE?AV?$QList@W4DayOfWeek@Qt@@@@XZ @ 4651 NONAME ; class QList<enum Qt::DayOfWeek> QLocale::weekdays(void) const
+	?getLangAndCountry@QLocalePrivate@@SAXABVQString@@AAW4Language@QLocale@@AAW4Script@4@AAW4Country@4@@Z @ 4652 NONAME ; void QLocalePrivate::getLangAndCountry(class QString const &, enum QLocale::Language &, enum QLocale::Script &, enum QLocale::Country &)
+	?bcp47Name@QLocalePrivate@@QBE?AVQString@@XZ @ 4653 NONAME ; class QString QLocalePrivate::bcp47Name(void) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@HABV2@@Z @ 4654 NONAME ; class QString QLocale::toCurrencyString(int, class QString const &) const
+	?matchingLocales@QLocale@@SA?AVQStringList@@W4Language@1@W4Script@1@W4Country@1@@Z @ 4655 NONAME ; class QStringList QLocale::matchingLocales(enum QLocale::Language, enum QLocale::Script, enum QLocale::Country)
+	?languageCode@QLocalePrivate@@QBE?AVQString@@XZ @ 4656 NONAME ; class QString QLocalePrivate::languageCode(void) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@GABV2@@Z @ 4657 NONAME ; class QString QLocale::toCurrencyString(unsigned short, class QString const &) const
+	?doubleToString@QLocalePrivate@@SA?AVQString@@VQChar@@00000NHW4DoubleForm@1@HI@Z @ 4658 NONAME ; class QString QLocalePrivate::doubleToString(class QChar, class QChar, class QChar, class QChar, class QChar, class QChar, double, int, enum QLocalePrivate::DoubleForm, int, unsigned int)
+	?currencySymbol@QLocale@@QBE?AVQString@@W4CurrencySymbolFormat@1@@Z @ 4659 NONAME ; class QString QLocale::currencySymbol(enum QLocale::CurrencySymbolFormat) const
+	?uiLanguages@QLocale@@QBE?AVQStringList@@XZ @ 4660 NONAME ; class QStringList QLocale::uiLanguages(void) const
+	?findLocale@QLocalePrivate@@SAPBU1@W4Language@QLocale@@W4Script@3@W4Country@3@@Z @ 4661 NONAME ; struct QLocalePrivate const * QLocalePrivate::findLocale(enum QLocale::Language, enum QLocale::Script, enum QLocale::Country)
+	?load@QTranslator@@QAE_NABVQLocale@@ABVQString@@111@Z @ 4662 NONAME ; bool QTranslator::load(class QLocale const &, class QString const &, class QString const &, class QString const &, class QString const &)
+	??0QLocale@@QAE@W4Language@0@W4Script@0@W4Country@0@@Z @ 4663 NONAME ; QLocale::QLocale(enum QLocale::Language, enum QLocale::Script, enum QLocale::Country)
+	?languageId@QLocalePrivate@@QBEGXZ @ 4664 NONAME ; unsigned short QLocalePrivate::languageId(void) const
+	?countryId@QLocalePrivate@@QBEGXZ @ 4665 NONAME ; unsigned short QLocalePrivate::countryId(void) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@_JABV2@@Z @ 4666 NONAME ; class QString QLocale::toCurrencyString(long long, class QString const &) const
+	?toCurrencyString@QLocale@@QBE?AVQString@@MABV2@@Z @ 4667 NONAME ; class QString QLocale::toCurrencyString(float, class QString const &) const
+
diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index 0c3d1a2..0be8a53 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -13203,3 +13203,9 @@ EXPORTS
 	?byteCount@QVolatileImage@@QBEHXZ @ 13202 NONAME ; int QVolatileImage::byteCount(void) const
 	??0QVolatileImage@@QAE@ABV0@@Z @ 13203 NONAME ; QVolatileImage::QVolatileImage(class QVolatileImage const &)
 	?depth@QVolatileImage@@QBEHXZ @ 13204 NONAME ; int QVolatileImage::depth(void) const
+	?setTabsClosable@QMdiArea@@QAEX_N@Z @ 13205 NONAME ; void QMdiArea::setTabsClosable(bool)
+	?qt_s60_setPartialScreenInputMode@@YAX_N@Z @ 13206 NONAME ; void qt_s60_setPartialScreenInputMode(bool)
+	?setTabsMovable@QMdiArea@@QAEX_N@Z @ 13207 NONAME ; void QMdiArea::setTabsMovable(bool)
+	?tabsMovable@QMdiArea@@QBE_NXZ @ 13208 NONAME ; bool QMdiArea::tabsMovable(void) const
+	?tabsClosable@QMdiArea@@QBE_NXZ @ 13209 NONAME ; bool QMdiArea::tabsClosable(void) const
+
diff --git a/src/s60installs/bwins/QtNetworku.def b/src/s60installs/bwins/QtNetworku.def
index 3f8f6d2..dbe43d7 100644
--- a/src/s60installs/bwins/QtNetworku.def
+++ b/src/s60installs/bwins/QtNetworku.def
@@ -1164,4 +1164,35 @@ EXPORTS
 	?nativeSession@QNetworkSessionPrivate@@SAPAVRConnection@@AAVQNetworkSession@@@Z @ 1163 NONAME ; class RConnection * QNetworkSessionPrivate::nativeSession(class QNetworkSession &)
 	?nativeOpenSocket@QNetworkSessionPrivate@@SAHAAVQNetworkSession@@AAVRSocket@@III@Z @ 1164 NONAME ; int QNetworkSessionPrivate::nativeOpenSocket(class QNetworkSession &, class RSocket &, unsigned int, unsigned int, unsigned int)
 	?nativeOpenHostResolver@QNetworkSessionPrivate@@SAHAAVQNetworkSession@@AAVRHostResolver@@II@Z @ 1165 NONAME ; int QNetworkSessionPrivate::nativeOpenHostResolver(class QNetworkSession &, class RHostResolver &, unsigned int, unsigned int)
+	??_EQHttpMultiPart@@UAE@I@Z @ 1166 NONAME ; QHttpMultiPart::~QHttpMultiPart(unsigned int)
+	??1QHttpPart@@QAE@XZ @ 1167 NONAME ; QHttpPart::~QHttpPart(void)
+	?trUtf8@QHttpMultiPart@@SA?AVQString@@PBD0@Z @ 1168 NONAME ; class QString QHttpMultiPart::trUtf8(char const *, char const *)
+	??0QHttpPart@@QAE@ABV0@@Z @ 1169 NONAME ; QHttpPart::QHttpPart(class QHttpPart const &)
+	?setBody@QHttpPart@@QAEXABVQByteArray@@@Z @ 1170 NONAME ; void QHttpPart::setBody(class QByteArray const &)
+	?trUtf8@QHttpMultiPart@@SA?AVQString@@PBD0H@Z @ 1171 NONAME ; class QString QHttpMultiPart::trUtf8(char const *, char const *, int)
+	?staticMetaObject@QHttpMultiPart@@2UQMetaObject@@B @ 1172 NONAME ; struct QMetaObject const QHttpMultiPart::staticMetaObject
+	??4QHttpPart@@QAEAAV0@ABV0@@Z @ 1173 NONAME ; class QHttpPart & QHttpPart::operator=(class QHttpPart const &)
+	?append@QHttpMultiPart@@QAEXABVQHttpPart@@@Z @ 1174 NONAME ; void QHttpMultiPart::append(class QHttpPart const &)
+	?setContentType@QHttpMultiPart@@QAEXW4ContentType@1@@Z @ 1175 NONAME ; void QHttpMultiPart::setContentType(enum QHttpMultiPart::ContentType)
+	?d_func@QHttpMultiPart@@AAEPAVQHttpMultiPartPrivate@@XZ @ 1176 NONAME ; class QHttpMultiPartPrivate * QHttpMultiPart::d_func(void)
+	??9QHttpPart@@QBE_NABV0@@Z @ 1177 NONAME ; bool QHttpPart::operator!=(class QHttpPart const &) const
+	??0QHttpMultiPart@@QAE@W4ContentType@0@PAVQObject@@@Z @ 1178 NONAME ; QHttpMultiPart::QHttpMultiPart(enum QHttpMultiPart::ContentType, class QObject *)
+	??0QHttpPart@@QAE@XZ @ 1179 NONAME ; QHttpPart::QHttpPart(void)
+	?post@QNetworkAccessManager@@QAEPAVQNetworkReply@@ABVQNetworkRequest@@PAVQHttpMultiPart@@@Z @ 1180 NONAME ; class QNetworkReply * QNetworkAccessManager::post(class QNetworkRequest const &, class QHttpMultiPart *)
+	??0QHttpMultiPart@@QAE@PAVQObject@@@Z @ 1181 NONAME ; QHttpMultiPart::QHttpMultiPart(class QObject *)
+	??8QHttpPart@@QBE_NABV0@@Z @ 1182 NONAME ; bool QHttpPart::operator==(class QHttpPart const &) const
+	?setBodyDevice@QHttpPart@@QAEXPAVQIODevice@@@Z @ 1183 NONAME ; void QHttpPart::setBodyDevice(class QIODevice *)
+	?getStaticMetaObject@QHttpMultiPart@@SAABUQMetaObject@@XZ @ 1184 NONAME ; struct QMetaObject const & QHttpMultiPart::getStaticMetaObject(void)
+	?qt_metacast@QHttpMultiPart@@UAEPAXPBD@Z @ 1185 NONAME ; void * QHttpMultiPart::qt_metacast(char const *)
+	?put@QNetworkAccessManager@@QAEPAVQNetworkReply@@ABVQNetworkRequest@@PAVQHttpMultiPart@@@Z @ 1186 NONAME ; class QNetworkReply * QNetworkAccessManager::put(class QNetworkRequest const &, class QHttpMultiPart *)
+	?tr@QHttpMultiPart@@SA?AVQString@@PBD0@Z @ 1187 NONAME ; class QString QHttpMultiPart::tr(char const *, char const *)
+	?qt_metacall@QHttpMultiPart@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1188 NONAME ; int QHttpMultiPart::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?boundary@QHttpMultiPart@@QBE?AVQByteArray@@XZ @ 1189 NONAME ; class QByteArray QHttpMultiPart::boundary(void) const
+	?setRawHeader@QHttpPart@@QAEXABVQByteArray@@0@Z @ 1190 NONAME ; void QHttpPart::setRawHeader(class QByteArray const &, class QByteArray const &)
+	?metaObject@QHttpMultiPart@@UBEPBUQMetaObject@@XZ @ 1191 NONAME ; struct QMetaObject const * QHttpMultiPart::metaObject(void) const
+	?setHeader@QHttpPart@@QAEXW4KnownHeaders@QNetworkRequest@@ABVQVariant@@@Z @ 1192 NONAME ; void QHttpPart::setHeader(enum QNetworkRequest::KnownHeaders, class QVariant const &)
+	??1QHttpMultiPart@@UAE@XZ @ 1193 NONAME ; QHttpMultiPart::~QHttpMultiPart(void)
+	?d_func@QHttpMultiPart@@ABEPBVQHttpMultiPartPrivate@@XZ @ 1194 NONAME ; class QHttpMultiPartPrivate const * QHttpMultiPart::d_func(void) const
+	?tr@QHttpMultiPart@@SA?AVQString@@PBD0H@Z @ 1195 NONAME ; class QString QHttpMultiPart::tr(char const *, char const *, int)
+	?setBoundary@QHttpMultiPart@@QAEXABVQByteArray@@@Z @ 1196 NONAME ; void QHttpMultiPart::setBoundary(class QByteArray const &)
 
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index c5dd0ac..1bf52b1 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -3834,3 +3834,33 @@ EXPORTS
 	gzungetc @ 3833 NONAME
 	_ZN16QAnimationDriverC1EP7QObject @ 3834 NONAME
 	_ZN16QAnimationDriverC1ER23QAnimationDriverPrivateP7QObject @ 3835 NONAME
+	_ZN11QTranslator4loadERK7QLocaleRK7QStringS5_S5_S5_ @ 3836 NONAME
+	_ZN14QLocalePrivate10findLocaleEN7QLocale8LanguageENS0_6ScriptENS0_7CountryE @ 3837 NONAME
+	_ZN14QLocalePrivate12codeToScriptERK7QString @ 3838 NONAME
+	_ZN14QLocalePrivate13codeToCountryERK7QString @ 3839 NONAME
+	_ZN14QLocalePrivate14codeToLanguageERK7QString @ 3840 NONAME
+	_ZN14QLocalePrivate14doubleToStringE5QCharS0_S0_S0_S0_S0_diNS_10DoubleFormEij @ 3841 NONAME
+	_ZN14QLocalePrivate16longLongToStringE5QCharS0_S0_S0_xiiij @ 3842 NONAME
+	_ZN14QLocalePrivate17getLangAndCountryERK7QStringRN7QLocale8LanguageERNS3_6ScriptERNS3_7CountryE @ 3843 NONAME
+	_ZN14QLocalePrivate19unsLongLongToStringE5QCharS0_S0_yiiij @ 3844 NONAME
+	_ZN7QLocale14scriptToStringENS_6ScriptE @ 3845 NONAME
+	_ZN7QLocale15matchingLocalesENS_8LanguageENS_6ScriptENS_7CountryE @ 3846 NONAME
+	_ZN7QLocaleC1ENS_8LanguageENS_6ScriptENS_7CountryE @ 3847 NONAME
+	_ZN7QLocaleC2ENS_8LanguageENS_6ScriptENS_7CountryE @ 3848 NONAME
+	_ZNK14QLocalePrivate10scriptCodeEv @ 3849 NONAME
+	_ZNK14QLocalePrivate11countryCodeEv @ 3850 NONAME
+	_ZNK14QLocalePrivate12languageCodeEv @ 3851 NONAME
+	_ZNK14QLocalePrivate9bcp47NameEv @ 3852 NONAME
+	_ZNK7QLocale11quoteStringERK10QStringRefNS_14QuotationStyleE @ 3853 NONAME
+	_ZNK7QLocale11quoteStringERK7QStringNS_14QuotationStyleE @ 3854 NONAME
+	_ZNK7QLocale11uiLanguagesEv @ 3855 NONAME
+	_ZNK7QLocale14currencySymbolENS_20CurrencySymbolFormatE @ 3856 NONAME
+	_ZNK7QLocale14firstDayOfWeekEv @ 3857 NONAME
+	_ZNK7QLocale16toCurrencyStringEdRK7QString @ 3858 NONAME
+	_ZNK7QLocale16toCurrencyStringExRK7QString @ 3859 NONAME
+	_ZNK7QLocale16toCurrencyStringEyRK7QString @ 3860 NONAME
+	_ZNK7QLocale19createSeparatedListERK11QStringList @ 3861 NONAME
+	_ZNK7QLocale6scriptEv @ 3862 NONAME
+	_ZNK7QLocale8weekdaysEv @ 3863 NONAME
+	_ZNK7QLocale9bcp47NameEv @ 3864 NONAME
+
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 561e332..2ffb98e 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12360,17 +12360,41 @@ EXPORTS
 	_ZN14QVolatileImageD2Ev @ 12359 NONAME
 	_ZN14QVolatileImageaSERKS_ @ 12360 NONAME
 	_ZN15QGraphicsSystem22releaseCachedResourcesEv @ 12361 NONAME
-	_ZNK14QVolatileImage12bytesPerLineEv @ 12374 NONAME
-	_ZNK14QVolatileImage13endDataAccessEb @ 12375 NONAME
-	_ZNK14QVolatileImage15beginDataAccessEv @ 12376 NONAME
-	_ZNK14QVolatileImage15hasAlphaChannelEv @ 12377 NONAME
-	_ZNK14QVolatileImage20duplicateNativeImageEv @ 12378 NONAME
-	_ZNK14QVolatileImage5depthEv @ 12379 NONAME
-	_ZNK14QVolatileImage5widthEv @ 12380 NONAME
-	_ZNK14QVolatileImage6formatEv @ 12381 NONAME
-	_ZNK14QVolatileImage6heightEv @ 12382 NONAME
-	_ZNK14QVolatileImage6isNullEv @ 12383 NONAME
-	_ZNK14QVolatileImage7toImageEv @ 12384 NONAME
-	_ZNK14QVolatileImage9byteCountEv @ 12385 NONAME
-	_ZNK14QVolatileImage9constBitsEv @ 12386 NONAME
+	_Z32qt_s60_setPartialScreenInputModeb @ 12362 NONAME
+	_ZN17QInternalMimeData11canReadDataERK7QString @ 12363 NONAME
+	_ZN17QInternalMimeData11qt_metacallEN11QMetaObject4CallEiPPv @ 12364 NONAME
+	_ZN17QInternalMimeData11qt_metacastEPKc @ 12365 NONAME
+	_ZN17QInternalMimeData13formatsHelperEPK9QMimeData @ 12366 NONAME
+	_ZN17QInternalMimeData15hasFormatHelperERK7QStringPK9QMimeData @ 12367 NONAME
+	_ZN17QInternalMimeData16renderDataHelperERK7QStringPK9QMimeData @ 12368 NONAME
+	_ZN17QInternalMimeData16staticMetaObjectE @ 12369 NONAME DATA 16
+	_ZN17QInternalMimeData19getStaticMetaObjectEv @ 12370 NONAME
+	_ZN17QInternalMimeDataC2Ev @ 12371 NONAME
+	_ZN17QInternalMimeDataD0Ev @ 12372 NONAME
+	_ZN17QInternalMimeDataD1Ev @ 12373 NONAME
+	_ZN17QInternalMimeDataD2Ev @ 12374 NONAME
+	_ZN8QMdiArea14setTabsMovableEb @ 12375 NONAME
+	_ZN8QMdiArea15setTabsClosableEb @ 12376 NONAME
+	_ZNK14QVolatileImage12bytesPerLineEv @ 12377 NONAME
+	_ZNK14QVolatileImage13endDataAccessEb @ 12378 NONAME
+	_ZNK14QVolatileImage15beginDataAccessEv @ 12379 NONAME
+	_ZNK14QVolatileImage15hasAlphaChannelEv @ 12380 NONAME
+	_ZNK14QVolatileImage20duplicateNativeImageEv @ 12381 NONAME
+	_ZNK14QVolatileImage5depthEv @ 12382 NONAME
+	_ZNK14QVolatileImage5widthEv @ 12383 NONAME
+	_ZNK14QVolatileImage6formatEv @ 12384 NONAME
+	_ZNK14QVolatileImage6heightEv @ 12385 NONAME
+	_ZNK14QVolatileImage6isNullEv @ 12386 NONAME
+	_ZNK14QVolatileImage7toImageEv @ 12387 NONAME
+	_ZNK14QVolatileImage9byteCountEv @ 12388 NONAME
+	_ZNK14QVolatileImage9constBitsEv @ 12389 NONAME
+	_ZNK14QWidgetPrivate20assignedInputContextEv @ 12390 NONAME
+	_ZNK17QInternalMimeData10metaObjectEv @ 12391 NONAME
+	_ZNK17QInternalMimeData12retrieveDataERK7QStringN8QVariant4TypeE @ 12392 NONAME
+	_ZNK17QInternalMimeData7formatsEv @ 12393 NONAME
+	_ZNK17QInternalMimeData9hasFormatERK7QString @ 12394 NONAME
+	_ZNK8QMdiArea11tabsMovableEv @ 12395 NONAME
+	_ZNK8QMdiArea12tabsClosableEv @ 12396 NONAME
+	_ZTI17QInternalMimeData @ 12397 NONAME
+	_ZTV17QInternalMimeData @ 12398 NONAME
 
diff --git a/src/s60installs/eabi/QtNetworku.def b/src/s60installs/eabi/QtNetworku.def
index 672ae84..47d251d 100644
--- a/src/s60installs/eabi/QtNetworku.def
+++ b/src/s60installs/eabi/QtNetworku.def
@@ -1186,4 +1186,36 @@ EXPORTS
 	_ZN22QNetworkSessionPrivate16nativeOpenSocketER15QNetworkSessionR7RSocketjjj @ 1185 NONAME
 	_ZN22QNetworkSessionPrivate22nativeOpenHostResolverER15QNetworkSessionR13RHostResolverjj @ 1186 NONAME
 	_ZNK10QSslSocket14peerVerifyNameEv @ 1187 NONAME
+	_ZN14QHttpMultiPart11qt_metacallEN11QMetaObject4CallEiPPv @ 1188 NONAME
+	_ZN14QHttpMultiPart11qt_metacastEPKc @ 1189 NONAME
+	_ZN14QHttpMultiPart11setBoundaryERK10QByteArray @ 1190 NONAME
+	_ZN14QHttpMultiPart14setContentTypeENS_11ContentTypeE @ 1191 NONAME
+	_ZN14QHttpMultiPart16staticMetaObjectE @ 1192 NONAME DATA 16
+	_ZN14QHttpMultiPart19getStaticMetaObjectEv @ 1193 NONAME
+	_ZN14QHttpMultiPart6appendERK9QHttpPart @ 1194 NONAME
+	_ZN14QHttpMultiPartC1ENS_11ContentTypeEP7QObject @ 1195 NONAME
+	_ZN14QHttpMultiPartC1EP7QObject @ 1196 NONAME
+	_ZN14QHttpMultiPartC2ENS_11ContentTypeEP7QObject @ 1197 NONAME
+	_ZN14QHttpMultiPartC2EP7QObject @ 1198 NONAME
+	_ZN14QHttpMultiPartD0Ev @ 1199 NONAME
+	_ZN14QHttpMultiPartD1Ev @ 1200 NONAME
+	_ZN14QHttpMultiPartD2Ev @ 1201 NONAME
+	_ZN21QNetworkAccessManager3putERK15QNetworkRequestP14QHttpMultiPart @ 1202 NONAME
+	_ZN21QNetworkAccessManager4postERK15QNetworkRequestP14QHttpMultiPart @ 1203 NONAME
+	_ZN9QHttpPart12setRawHeaderERK10QByteArrayS2_ @ 1204 NONAME
+	_ZN9QHttpPart13setBodyDeviceEP9QIODevice @ 1205 NONAME
+	_ZN9QHttpPart7setBodyERK10QByteArray @ 1206 NONAME
+	_ZN9QHttpPart9setHeaderEN15QNetworkRequest12KnownHeadersERK8QVariant @ 1207 NONAME
+	_ZN9QHttpPartC1ERKS_ @ 1208 NONAME
+	_ZN9QHttpPartC1Ev @ 1209 NONAME
+	_ZN9QHttpPartC2ERKS_ @ 1210 NONAME
+	_ZN9QHttpPartC2Ev @ 1211 NONAME
+	_ZN9QHttpPartD1Ev @ 1212 NONAME
+	_ZN9QHttpPartD2Ev @ 1213 NONAME
+	_ZN9QHttpPartaSERKS_ @ 1214 NONAME
+	_ZNK14QHttpMultiPart10metaObjectEv @ 1215 NONAME
+	_ZNK14QHttpMultiPart8boundaryEv @ 1216 NONAME
+	_ZNK9QHttpParteqERKS_ @ 1217 NONAME
+	_ZTI14QHttpMultiPart @ 1218 NONAME
+	_ZTV14QHttpMultiPart @ 1219 NONAME
 
diff --git a/src/s60installs/eabi/QtOpenVGu.def b/src/s60installs/eabi/QtOpenVGu.def
index e05cc79..72f11fc 100644
--- a/src/s60installs/eabi/QtOpenVGu.def
+++ b/src/s60installs/eabi/QtOpenVGu.def
@@ -209,4 +209,8 @@ EXPORTS
 	_ZN13QVGPixmapData12updateSerialEv @ 208 NONAME ABSENT
 	_ZN13QVGPixmapData4copyEPK11QPixmapDataRK5QRect @ 209 NONAME ABSENT
 	_ZNK13QVGPixmapData11idealFormatEP6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 210 NONAME ABSENT
+	_ZN13QVGPixmapData24releaseNativeImageHandleEv @ 211 NONAME
+	_ZN13QVGPixmapData25initFromNativeImageHandleEPvRK7QString @ 212 NONAME
+	_ZN13QVGPixmapData35createFromNativeImageHandleProviderEv @ 213 NONAME
+	_ZNK13QVGPixmapData14ensureReadbackEb @ 214 NONAME
 
-- 
cgit v0.12


From 383da4084ae0cd8dcb9777cbfa90a55c56f7ad09 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 25 Mar 2011 19:24:35 +0100
Subject: QtConcurrent: throw exception from destructor

Task-number: QTBUG-18149
Reviewed-by: Morten Sorvig
---
 src/corelib/concurrent/qtconcurrentexception.cpp |  7 +-----
 tests/auto/qfuture/tst_qfuture.cpp               | 28 ++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/corelib/concurrent/qtconcurrentexception.cpp b/src/corelib/concurrent/qtconcurrentexception.cpp
index 948269a..b4123f5 100644
--- a/src/corelib/concurrent/qtconcurrentexception.cpp
+++ b/src/corelib/concurrent/qtconcurrentexception.cpp
@@ -203,12 +203,7 @@ ExceptionHolder ExceptionStore::exception()
 
 void ExceptionStore::throwPossibleException()
 {
-    /* On win32-g++, with GCC 3.4.2 std::uncaught_exception() isn't reliable. */
-    if (hasException()
-#ifndef Q_CC_MINGW
-        && std::uncaught_exception() == false
-#endif
-            ) {
+    if (hasException() ) {
         exceptionHolder.base->hasThrown = true;
         exceptionHolder.exception()->raise();
     }
diff --git a/tests/auto/qfuture/tst_qfuture.cpp b/tests/auto/qfuture/tst_qfuture.cpp
index fa4ccb5..8afdf48 100644
--- a/tests/auto/qfuture/tst_qfuture.cpp
+++ b/tests/auto/qfuture/tst_qfuture.cpp
@@ -81,6 +81,7 @@ private slots:
     void voidConversions();
 #ifndef QT_NO_EXCEPTIONS
     void exceptions();
+    void exceptions_QTBUG18149();
 #endif
 };
 
@@ -1431,6 +1432,33 @@ void tst_QFuture::exceptions()
 
 }
 
+
+void tst_QFuture::exceptions_QTBUG18149()
+{
+    class MyClass
+    {
+    public:
+        ~MyClass()
+        {
+            QFuture<void> f = createExceptionFuture();
+            bool caught = false;
+            try {
+                f.waitForFinished();
+            } catch (Exception &) {
+                caught = true;
+            }
+            QVERIFY(caught);
+        }
+    };
+
+    try {
+        MyClass m;
+        throw 0;
+    } catch (int) {}
+
+}
+
+
 #endif // QT_NO_EXCEPTIONS
 
 #include "tst_qfuture.moc"
-- 
cgit v0.12


From d3fb49f36f1a3f3ecf8ffac0824ea70d8792a8d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 28 Mar 2011 15:06:41 +0200
Subject: Xlib platform plugin also doesn't support PING protocol.

---
 src/plugins/platforms/xlib/qxlibwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index e9bcbf5..82e377c 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -137,7 +137,7 @@ QXlibWindow::QXlibWindow(QWidget *window)
     int n = 0;
     protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_DELETE_WINDOW);        // support del window protocol
     protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_TAKE_FOCUS);                // support take focus window protocol
-    protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_PING);                // support _NET_WM_PING protocol
+//    protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_PING);                // support _NET_WM_PING protocol
 #ifndef QT_NO_XSYNC
     protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_SYNC_REQUEST);        // support _NET_WM_SYNC_REQUEST protocol
 #endif // QT_NO_XSYNC
-- 
cgit v0.12


From 0ee221b374ffef3657247be4c78e05689e04bef7 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 25 Mar 2011 19:15:39 +0100
Subject: Fix the leak of QAdoptedThread and all dependent objects

if there is a QEventDispatcher in QAdoptedThread.

QAdoptedThread is supposed to be destroyed when the QThreadData is
destroyed. But QThreadData is ref-counted, and QEventDispatcher holds
a reference to it.  QEventDispatcher is supposed to be destroyed
in QThreadPrivate::finish, which is supposed to be called from the
destructor of QAdoptedThread.

There is a circular dependence.  We break it by calling finish in the
callback that is called when the thread is finished.

Task-number: QTBUG-17986
Reviewed-by: Brad
---
 src/corelib/thread/qthread.cpp      |  6 +++---
 src/corelib/thread/qthread_p.h      |  1 +
 src/corelib/thread/qthread_unix.cpp | 13 +++++++++++--
 src/corelib/thread/qthread_win.cpp  | 13 ++++++++++++-
 tests/auto/qthread/tst_qthread.cpp  | 17 +++++++++++++++++
 5 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 326f494..817e73e 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -78,7 +78,7 @@ QT_BEGIN_NAMESPACE
 
 QThreadData::QThreadData(int initialRefCount)
     : _ref(initialRefCount), thread(0),
-      quitNow(false), loopLevel(0), eventDispatcher(0), canWait(true)
+      quitNow(false), loopLevel(0), eventDispatcher(0), canWait(true), isAdopted(false)
 {
     // fprintf(stderr, "QThreadData %p created\n", this);
 }
@@ -150,7 +150,7 @@ QAdoptedThread::QAdoptedThread(QThreadData *data)
 QAdoptedThread::~QAdoptedThread()
 {
 #ifndef QT_NO_THREAD
-    QThreadPrivate::finish(this);
+//    QThreadPrivate::finish(this);
 #endif
     // fprintf(stderr, "~QAdoptedThread = %p\n", this);
 }
@@ -409,7 +409,7 @@ QThread::~QThread()
             wait();
             locker.relock();
         }
-        if (d->running && !d->finished)
+        if (d->running && !d->finished && !d->data->isAdopted)
             qWarning("QThread: Destroyed while thread is still running");
 
         d->data->thread = 0;
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 36e07c0..2413452 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -208,6 +208,7 @@ public:
     QPostEventList postEventList;
     bool canWait;
     QVector<void *> tls;
+    bool isAdopted;
 
 # ifdef Q_OS_SYMBIAN
     RThread symbian_thread_handle;
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 811a193..484b455 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -148,7 +148,16 @@ static void destroy_current_thread_data(void *p)
     // this destructor function, so we need to set it back to the
     // right value...
     pthread_setspecific(current_thread_data_key, p);
-    reinterpret_cast<QThreadData *>(p)->deref();
+    QThreadData *data = static_cast<QThreadData *>(p);
+    if (data->isAdopted) {
+        QThread *thread = data->thread;
+        Q_ASSERT(thread);
+        QThreadPrivate *thread_p = static_cast<QThreadPrivate *>(QObjectPrivate::get(thread));
+        Q_ASSERT(!thread_p->finished);
+        thread_p->finish(thread);
+    }
+    data->deref();
+
     // ... but we must reset it to zero before returning so we aren't
     // called again (POSIX allows implementations to call destructor
     // functions repeatedly until all values are zero)
@@ -251,6 +260,7 @@ QThreadData *QThreadData::current()
             }
             data->deref();
         }
+        data->isAdopted = true;
         if (!QCoreApplicationPrivate::theMainThread)
             QCoreApplicationPrivate::theMainThread = data->thread;
     }
@@ -376,7 +386,6 @@ void QThreadPrivate::finish(void *arg)
 #else
     QMutexLocker locker(&d->mutex);
 #endif
-
     d->isInFinish = true;
     d->priority = QThread::InheritPriority;
     bool terminated = d->terminated;
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 6b7932b..b9c55b0 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -124,6 +124,7 @@ QThreadData *QThreadData::current()
             }
             threadData->deref();
         }
+        threadData->isAdopted = true;
 
         if (!QCoreApplicationPrivate::theMainThread) {
             QCoreApplicationPrivate::theMainThread = threadData->thread;
@@ -231,7 +232,17 @@ void qt_adopted_thread_watcher_function(void *)
         } else {
 //             printf("(qt) - qt_adopted_thread_watcher_function... called\n");
             const int qthreadIndex = handleIndex - 1;
-            QThreadData::get2(qt_adopted_qthreads.at(qthreadIndex))->deref();
+
+            QThreadData *data = QThreadData::get2(qt_adopted_qthreads.at(qthreadIndex));
+            if (data->isAdopted) {
+                QThread *thread = data->thread;
+                Q_ASSERT(thread);
+                QThreadPrivate *thread_p = static_cast<QThreadPrivate *>(QObjectPrivate::get(thread));
+                Q_ASSERT(!thread_p->finished);
+                thread_p->finish(thread);
+            }
+            data->deref();
+
 #if !defined(Q_OS_WINCE) || (defined(_WIN32_WCE) && (_WIN32_WCE>=0x600))
             CloseHandle(qt_adopted_thread_handles.at(handleIndex));
 #endif
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index c69052e..12709db 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -103,6 +103,7 @@ private slots:
     void adoptedThreadExit();
     void adoptedThreadExec();
     void adoptedThreadFinished();
+    void adoptedThreadExecFinished();
     void adoptMultipleThreads();
 
     void QTBUG13810_exitAndStart();
@@ -895,6 +896,21 @@ void tst_QThread::adoptedThreadFinished()
     QVERIFY(!QTestEventLoop::instance().timeout());
 }
 
+void tst_QThread::adoptedThreadExecFinished()
+{
+    NativeThreadWrapper nativeThread;
+    nativeThread.setWaitForStop();
+    nativeThread.startAndWait(adoptedThreadExecFunction);
+
+    QObject::connect(nativeThread.qthread, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+
+    nativeThread.stop();
+    nativeThread.join();
+
+    QTestEventLoop::instance().enterLoop(5);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+}
+
 void tst_QThread::adoptMultipleThreads()
 {
 #if defined(Q_OS_WIN)
@@ -929,6 +945,7 @@ void tst_QThread::adoptMultipleThreads()
     QTestEventLoop::instance().enterLoop(5);
     QVERIFY(!QTestEventLoop::instance().timeout());
     QCOMPARE(int(recorder.activationCount), numThreads);
+    qDeleteAll(nativeThreads);
 }
 
 void tst_QThread::stressTest()
-- 
cgit v0.12


From 869a1c838ec58051f355552435049b58c6fbe354 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Mon, 28 Mar 2011 14:53:46 +0200
Subject: Changed the return value of QLocale::matchingLocales().

Instead of returning a QStringList, return the list of QLocale objects
that can be used directly.

Reviewed-by: axis
---
 src/corelib/tools/qlocale.cpp   | 18 ++++++++++--------
 src/corelib/tools/qlocale.h     |  2 +-
 tests/manual/qlocale/window.cpp |  5 ++---
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 2e838bd..af95a75 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1815,21 +1815,21 @@ QLocale QLocale::system()
 /*!
     \since 4.8
 
-    Returns the list of valid locale names that match the given \a language, \a
+    Returns a list of valid locale objects that match the given \a language, \a
     script and \a country.
 
     Getting a list of all locales:
-    QStringList allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
+    QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
 */
-QStringList QLocale::matchingLocales(QLocale::Language language,
-                                     QLocale::Script script,
-                                     QLocale::Country country)
+QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
+                                        QLocale::Script script,
+                                        QLocale::Country country)
 {
     if (uint(language) > QLocale::LastLanguage || uint(script) > QLocale::LastScript ||
             uint(country) > QLocale::LastCountry)
-        return QStringList();
+        return QList<QLocale>();
 
-    QStringList result;
+    QList<QLocale> result;
     const QLocalePrivate *d = locale_data;
     if (language == QLocale::AnyLanguage && script == QLocale::AnyScript && country == QLocale::AnyCountry)
         result.reserve(locale_data_size);
@@ -1837,7 +1837,9 @@ QStringList QLocale::matchingLocales(QLocale::Language language,
         d += locale_index[language];
     while ( (d != locale_data + locale_data_size)
             && (language == QLocale::AnyLanguage || d->m_language_id == uint(language))) {
-        result.append(d->bcp47Name());
+        QLocale locale(QLocale::C);
+        locale.p.index = localePrivateIndex(d);
+        result.append(locale);
         ++d;
     }
     return result;
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index ecb608e..4ac7630 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -743,7 +743,7 @@ public:
     static QLocale c() { return QLocale(C); }
     static QLocale system();
 
-    static QStringList matchingLocales(QLocale::Language language, QLocale::Script script, QLocale::Country country);
+    static QList<QLocale> matchingLocales(QLocale::Language language, QLocale::Script script, QLocale::Country country);
     static QList<Country> countriesForLanguage(Language lang);
 
     void setNumberOptions(NumberOptions options);
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index 89e3ec6..38bbbe4 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -46,9 +46,8 @@ Window::Window()
 
     localeCombo->addItem("System", QLocale::system());
 
-    QStringList locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
-    foreach (const QString &name, locales) {
-        QLocale locale(name);
+    QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
+    foreach (const QLocale &locale, locales) {
         QString label = QLocale::languageToString(locale.language());
         label += QLatin1Char('/');
         if (locale.script() != QLocale::AnyScript) {
-- 
cgit v0.12


From d92c3ca977c62bdc0cc6d0961d4e2ae91cd5fc48 Mon Sep 17 00:00:00 2001
From: "Darryl L. Miles" <darryl.miles@darrylmiles.org>
Date: Mon, 28 Mar 2011 16:56:47 +0200
Subject: This test fails in Europe/London timezone due to this check, since in
 winter Qt::LocalTime==Qt::UTC.

Merge-request: 1159
Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com>
---
 tests/auto/qdatetime/tst_qdatetime.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/qdatetime/tst_qdatetime.cpp b/tests/auto/qdatetime/tst_qdatetime.cpp
index fa9c70b..f8836a6 100644
--- a/tests/auto/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/qdatetime/tst_qdatetime.cpp
@@ -198,8 +198,8 @@ void tst_QDateTime::ctor()
     QDateTime dt3(QDate(2004, 1, 2), QTime(1, 2, 3), Qt::UTC);
 
     QVERIFY(dt1 == dt2);
-    QVERIFY(dt1 != dt3);
     if (europeanTimeZone) {
+        QVERIFY(dt1 != dt3);
         QVERIFY(dt1 < dt3);
         QVERIFY(dt1.addSecs(3600).toUTC() == dt3);
     }
-- 
cgit v0.12


From aa144f7e11547549414a977f6e72ff8b92f95d30 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Thu, 24 Mar 2011 11:50:15 +0100
Subject: QSslConfiguration: do not lazily construct the d-pointer

...the private class is cheap anyway; and lazy construction lead to
problems like setting an empty default configuration would crash etc.

Reviewed-by: Markus Goetz
Task-number: QTBUG-17550
---
 src/network/ssl/qsslconfiguration.cpp              | 44 ++++++++++------------
 src/network/ssl/qsslconfiguration.h                |  2 +-
 src/network/ssl/qsslsocket.cpp                     |  1 +
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp     | 34 +++++++++++++++++
 tests/auto/qsslsocket/tst_qsslsocket.cpp           | 39 ++++++++++++++++++-
 .../tst_qsslsocket_onDemandCertificates_member.cpp |  7 ++++
 .../tst_qsslsocket_onDemandCertificates_static.cpp | 12 ++++++
 7 files changed, 113 insertions(+), 26 deletions(-)

diff --git a/src/network/ssl/qsslconfiguration.cpp b/src/network/ssl/qsslconfiguration.cpp
index 150f77e..c8dbaed 100644
--- a/src/network/ssl/qsslconfiguration.cpp
+++ b/src/network/ssl/qsslconfiguration.cpp
@@ -47,18 +47,6 @@
 
 QT_BEGIN_NAMESPACE
 
-template<> void QSharedDataPointer<QSslConfigurationPrivate>::detach()
-{
-    if (d && d->ref == 1)
-        return;
-    QSslConfigurationPrivate *x = (d ? new QSslConfigurationPrivate(*d)
-                                   : new QSslConfigurationPrivate);
-    x->ref.ref();
-    if (d && !d->ref.deref())
-        delete d;
-    d = x;
-}
-
 /*!
     \class QSslConfiguration
     \brief The QSslConfiguration class holds the configuration and state of an SSL connection
@@ -126,7 +114,7 @@ template<> void QSharedDataPointer<QSslConfigurationPrivate>::detach()
     Once any setter methods are called, isNull() will return false.
 */
 QSslConfiguration::QSslConfiguration()
-    : d(0)
+    : d(new QSslConfigurationPrivate)
 {
 }
 
@@ -203,7 +191,15 @@ bool QSslConfiguration::operator==(const QSslConfiguration &other) const
 */
 bool QSslConfiguration::isNull() const
 {
-    return d == 0;
+    return (d->protocol == QSsl::SecureProtocols &&
+            d->peerVerifyMode == QSslSocket::AutoVerifyPeer &&
+            d->peerVerifyDepth == 0 &&
+            d->caCertificates.count() == 0 &&
+            d->ciphers.count() == 0 &&
+            d->localCertificate.isNull() &&
+            d->privateKey.isNull() &&
+            d->peerCertificate.isNull() &&
+            d->peerCertificateChain.count() == 0);
 }
 
 /*!
@@ -213,7 +209,7 @@ bool QSslConfiguration::isNull() const
 */
 QSsl::SslProtocol QSslConfiguration::protocol() const
 {
-    return d ? d->protocol : QSsl::SecureProtocols;
+    return d->protocol;
 }
 
 /*!
@@ -243,7 +239,7 @@ void QSslConfiguration::setProtocol(QSsl::SslProtocol protocol)
 */
 QSslSocket::PeerVerifyMode QSslConfiguration::peerVerifyMode() const
 {
-    return d ? d->peerVerifyMode : QSslSocket::AutoVerifyPeer;
+    return d->peerVerifyMode;
 }
 
 /*!
@@ -276,7 +272,7 @@ void QSslConfiguration::setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
 */
 int QSslConfiguration::peerVerifyDepth() const
 {
-    return d ? d->peerVerifyDepth : 0;
+    return d->peerVerifyDepth;
 }
 
 /*!
@@ -307,7 +303,7 @@ void QSslConfiguration::setPeerVerifyDepth(int depth)
 */
 QSslCertificate QSslConfiguration::localCertificate() const
 {
-    return d ? d->localCertificate : QSslCertificate();
+    return d->localCertificate;
 }
 
 /*!
@@ -361,7 +357,7 @@ void QSslConfiguration::setLocalCertificate(const QSslCertificate &certificate)
 */
 QSslCertificate QSslConfiguration::peerCertificate() const
 {
-    return d ? d->peerCertificate : QSslCertificate();
+    return d->peerCertificate;
 }
 
 /*!
@@ -393,7 +389,7 @@ QSslCertificate QSslConfiguration::peerCertificate() const
 */
 QList<QSslCertificate> QSslConfiguration::peerCertificateChain() const
 {
-    return d ? d->peerCertificateChain : QList<QSslCertificate>();
+    return d->peerCertificateChain;
 }
 
 /*!
@@ -411,7 +407,7 @@ QList<QSslCertificate> QSslConfiguration::peerCertificateChain() const
 */
 QSslCipher QSslConfiguration::sessionCipher() const
 {
-    return d ? d->sessionCipher : QSslCipher();
+    return d->sessionCipher;
 }
 
 /*!
@@ -422,7 +418,7 @@ QSslCipher QSslConfiguration::sessionCipher() const
 */
 QSslKey QSslConfiguration::privateKey() const
 {
-    return d ? d->privateKey : QSslKey();
+    return d->privateKey;
 }
 
 /*!
@@ -464,7 +460,7 @@ void QSslConfiguration::setPrivateKey(const QSslKey &key)
 */
 QList<QSslCipher> QSslConfiguration::ciphers() const
 {
-    return d ? d->ciphers : QList<QSslCipher>();
+    return d->ciphers;
 }
 
 /*!
@@ -494,7 +490,7 @@ void QSslConfiguration::setCiphers(const QList<QSslCipher> &ciphers)
 */
 QList<QSslCertificate> QSslConfiguration::caCertificates() const
 {
-    return d ? d->caCertificates : QList<QSslCertificate>();
+    return d->caCertificates;
 }
 
 /*!
diff --git a/src/network/ssl/qsslconfiguration.h b/src/network/ssl/qsslconfiguration.h
index 69dd145..143566b 100644
--- a/src/network/ssl/qsslconfiguration.h
+++ b/src/network/ssl/qsslconfiguration.h
@@ -86,7 +86,7 @@ public:
     inline bool operator!=(const QSslConfiguration &other) const
     { return !(*this == other); }
 
-    bool isNull() const;
+    bool isNull() const; // ### Qt 5: remove; who would need this?
 
     QSsl::SslProtocol protocol() const;
     void setProtocol(QSsl::SslProtocol protocol);
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 98e2dc5..a649758 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -902,6 +902,7 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
     d->configuration.peerVerifyDepth = configuration.peerVerifyDepth();
     d->configuration.peerVerifyMode = configuration.peerVerifyMode();
     d->configuration.protocol = configuration.protocol();
+    d->allowRootCertOnDemandLoading = false;
 }
 
 /*!
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 6ed8f16..650526e 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -87,6 +87,7 @@ Q_DECLARE_METATYPE(QNetworkReply::NetworkError)
 Q_DECLARE_METATYPE(QBuffer*)
 Q_DECLARE_METATYPE(QHttpMultiPart *)
 Q_DECLARE_METATYPE(QList<QFile*>) // for multiparts
+Q_DECLARE_METATYPE(QSslConfiguration)
 
 class QNetworkReplyPtr: public QSharedPointer<QNetworkReply>
 {
@@ -319,6 +320,8 @@ private Q_SLOTS:
     void ignoreSslErrorsList();
     void ignoreSslErrorsListWithSlot_data();
     void ignoreSslErrorsListWithSlot();
+    void sslConfiguration_data();
+    void sslConfiguration();
 #endif
 
     void getAndThenDeleteObject_data();
@@ -5370,6 +5373,37 @@ void tst_QNetworkReply::ignoreSslErrorsListWithSlot()
     QCOMPARE(reply->error(), expectedNetworkError);
 }
 
+void tst_QNetworkReply::sslConfiguration_data()
+{
+    QTest::addColumn<QSslConfiguration>("configuration");
+    QTest::addColumn<bool>("works");
+
+    QTest::newRow("empty") << QSslConfiguration() << false;
+    QSslConfiguration conf = QSslConfiguration::defaultConfiguration();
+    QTest::newRow("default") << conf << false; // does not contain test server cert
+    QList<QSslCertificate> testServerCert = QSslCertificate::fromPath(SRCDIR "/certs/qt-test-server-cacert.pem");
+    conf.setCaCertificates(testServerCert);
+    QTest::newRow("set-root-cert") << conf << true;
+    conf.setProtocol(QSsl::SecureProtocols);
+    QTest::newRow("secure") << conf << true;
+}
+
+void tst_QNetworkReply::sslConfiguration()
+{
+    QNetworkRequest request(QUrl("https://" + QtNetworkSettings::serverName() + "/index.html"));
+    QFETCH(QSslConfiguration, configuration);
+    request.setSslConfiguration(configuration);
+    QNetworkReplyPtr reply = manager.get(request);
+
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+
+    QFETCH(bool, works);
+    QNetworkReply::NetworkError expectedError = works ? QNetworkReply::NoError : QNetworkReply::SslHandshakeFailedError;
+    QCOMPARE(reply->error(), expectedError);
+}
+
 #endif // QT_NO_OPENSSL
 
 void tst_QNetworkReply::getAndThenDeleteObject_data()
diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index 472be69..8f62d87 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -67,6 +67,7 @@ typedef QList<QSslError::SslError> SslErrorList;
 Q_DECLARE_METATYPE(SslErrorList)
 Q_DECLARE_METATYPE(QSslError)
 Q_DECLARE_METATYPE(QSsl::SslProtocol)
+Q_DECLARE_METATYPE(QSslConfiguration)
 #endif
 
 #if defined Q_OS_HPUX && defined Q_CC_GNU
@@ -152,6 +153,8 @@ private slots:
     void setLocalCertificate();
     void setPrivateKey();
     void setSocketDescriptor();
+    void setSslConfiguration_data();
+    void setSslConfiguration();
     void waitForEncrypted();
     void waitForConnectedEncryptedReadyRead();
     void startClientEncryption();
@@ -1038,6 +1041,39 @@ void tst_QSslSocket::setSocketDescriptor()
     QVERIFY(client->localPort() != 0);
 }
 
+void tst_QSslSocket::setSslConfiguration_data()
+{
+    QTest::addColumn<QSslConfiguration>("configuration");
+    QTest::addColumn<bool>("works");
+
+    QTest::newRow("empty") << QSslConfiguration() << false;
+    QSslConfiguration conf = QSslConfiguration::defaultConfiguration();
+    QTest::newRow("default") << conf << false; // does not contain test server cert
+    QList<QSslCertificate> testServerCert = QSslCertificate::fromPath(SRCDIR "certs/qt-test-server-cacert.pem");
+    conf.setCaCertificates(testServerCert);
+    QTest::newRow("set-root-cert") << conf << true;
+    conf.setProtocol(QSsl::SecureProtocols);
+    QTest::newRow("secure") << conf << true;
+}
+
+void tst_QSslSocket::setSslConfiguration()
+{
+    if (!QSslSocket::supportsSsl())
+        return;
+
+    QSslSocketPtr socket = newSocket();
+    QFETCH(QSslConfiguration, configuration);
+    socket->setSslConfiguration(configuration);
+    this->socket = socket;
+    socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
+    QFETCH(bool, works);
+    QCOMPARE(socket->waitForEncrypted(10000), works);
+    if (works) {
+        socket->disconnectFromHost();
+        QVERIFY2(socket->waitForDisconnected(), qPrintable(socket->errorString()));
+    }
+}
+
 void tst_QSslSocket::waitForEncrypted()
 {
     if (!QSslSocket::supportsSsl())
@@ -1950,8 +1986,9 @@ void tst_QSslSocket::setEmptyDefaultConfiguration()
     QSslConfiguration::setDefaultConfiguration(emptyConf);
 
     QSslSocketPtr socket = newSocket();
+    connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(ignoreErrorSlot()));
     socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
-
+    QVERIFY2(!socket->waitForEncrypted(4000), qPrintable(socket->errorString()));
 }
 
 #endif // QT_NO_OPENSSL
diff --git a/tests/auto/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp b/tests/auto/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
index abdd550..6d3590a 100644
--- a/tests/auto/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
+++ b/tests/auto/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
@@ -217,6 +217,13 @@ void tst_QSslSocket_onDemandCertificates_member::onDemandRootCertLoadingMemberMe
     socket3->setCaCertificates(QList<QSslCertificate>());
     socket3->connectToHostEncrypted(host, 443);
     QVERIFY(!socket3->waitForEncrypted());
+
+    // setting empty SSL configuration explicitly -> should not work
+    QSslSocketPtr socket4 = newSocket();
+    this->socket = socket4;
+    socket4->setSslConfiguration(QSslConfiguration());
+    socket4->connectToHostEncrypted(host, 443);
+    QVERIFY(!socket4->waitForEncrypted());
 }
 
 #endif // QT_NO_OPENSSL
diff --git a/tests/auto/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp b/tests/auto/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
index 5003b5c..14a7c3b 100644
--- a/tests/auto/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
+++ b/tests/auto/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
@@ -218,6 +218,18 @@ void tst_QSslSocket_onDemandCertificates_static::onDemandRootCertLoadingStaticMe
     this->socket = socket3;
     socket3->connectToHostEncrypted(host, 443);
     QVERIFY(!socket3->waitForEncrypted());
+
+    QSslSocket::setDefaultCaCertificates(QSslSocket::systemCaCertificates());
+
+    // setting empty default configuration -> should not work
+    QSslConfiguration conf;
+    QSslConfiguration originalDefaultConf = QSslConfiguration::defaultConfiguration();
+    QSslConfiguration::setDefaultConfiguration(conf);
+    QSslSocketPtr socket4 = newSocket();
+    this->socket = socket4;
+    socket4->connectToHostEncrypted(host, 443);
+    QVERIFY(!socket4->waitForEncrypted(4000));
+    QSslConfiguration::setDefaultConfiguration(originalDefaultConf); // restore old behaviour for run with proxies etc.
 }
 
 #endif // QT_NO_OPENSSL
-- 
cgit v0.12


From 335fdd66947adadcdaaeb2896c42fba28d67843a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20OCHS?= <kervala@gmail.com>
Date: Mon, 28 Mar 2011 13:28:00 +0200
Subject: Fix errors when compiling Qt with STLport

Task-number: QTBUG-18374
Reviewed-by: Olivier Goffart
Merge-request: 1157
---
 src/3rdparty/clucene/src/CLucene/config/CompilerMsvc.h | 4 +++-
 tools/linguist/lupdate/qdeclarative.cpp                | 1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/3rdparty/clucene/src/CLucene/config/CompilerMsvc.h b/src/3rdparty/clucene/src/CLucene/config/CompilerMsvc.h
index 82ff9aa..0021ea3 100644
--- a/src/3rdparty/clucene/src/CLucene/config/CompilerMsvc.h
+++ b/src/3rdparty/clucene/src/CLucene/config/CompilerMsvc.h
@@ -22,7 +22,9 @@
 	# pragma warning(disable: 4512) // This would be very annoying
 	# pragma warning(disable: 4290) // Ignore exception specification warning
     # pragma warning(disable: 4250) // Ignore 'class1' : inherits 'class2::member' via dominance (e.g. in MultiReader)
-	#if (_MSC_VER < 1310)
+	// Check for STLport presence
+	#include <string>
+	#if (_MSC_VER < 1310) || defined(_STLPORT_VERSION)
 		#define CL_NS_HASHING(func) std::func //the namespace is different on VC 7.0
 	#else
 		#define CL_NS_HASHING(func) stdext::func
diff --git a/tools/linguist/lupdate/qdeclarative.cpp b/tools/linguist/lupdate/qdeclarative.cpp
index 1c1e9ad..6bf9cf4 100644
--- a/tools/linguist/lupdate/qdeclarative.cpp
+++ b/tools/linguist/lupdate/qdeclarative.cpp
@@ -62,6 +62,7 @@
 
 #include <iostream>
 #include <cstdlib>
+#include <cctype>
 
 QT_BEGIN_NAMESPACE
 
-- 
cgit v0.12


From bcbce977fa7a0d61de5f17e6727eba5a823bc3bb Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 25 Mar 2011 18:07:15 +0000
Subject: Performance: use select poll for timeout of 0ms

A timer of 0ms completes on the next kernel tick (up to 0.999ms)
There is a poll GetOpt we can use instead that doesn't require using
a timer to cancel the select ioctl.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 67 ++++++++++++++++-------------
 1 file changed, 37 insertions(+), 30 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 58e8d9f..af755a9 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1105,39 +1105,46 @@ int QSymbianSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool
         selectFlags() |= KSockSelectRead;
     if (checkWrite)
         selectFlags() |= KSockSelectWrite;
-    TRequestStatus selectStat;
-    nativeSocket.Ioctl(KIOctlSelect, selectStat, &selectFlags, KSOLSocket);
-
-    if (timeout < 0)
-        User::WaitForRequest(selectStat); //negative means no timeout
-    else {
-        if (!selectTimer.Handle())
-            qt_symbian_throwIfError(selectTimer.CreateLocal());
-        TRequestStatus timerStat;
-        selectTimer.HighRes(timerStat, timeout * 1000);
-        User::WaitForRequest(timerStat, selectStat);
-        if (selectStat == KRequestPending) {
-            nativeSocket.CancelIoctl();
-            //CancelIoctl completes the request (most likely with KErrCancel)
-            //We need to wait for this to keep the thread semaphore balanced (or active scheduler will panic)
-            User::WaitForRequest(selectStat);
-            //restart asynchronous notifier (only one IOCTL allowed at a time)
-            if (asyncSelect)
-                asyncSelect->IssueRequest();
-#ifdef QNATIVESOCKETENGINE_DEBUG
-            qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select timeout";
-#endif
-            return 0; //timeout
-        } else {
-            selectTimer.Cancel();
-            User::WaitForRequest(timerStat);
+    TInt err;
+    if (timeout == 0) {
+        //if timeout is zero, poll
+        err = nativeSocket.GetOpt(KSOSelectPoll, KSOLSocket, selectFlags);
+    } else {
+        TRequestStatus selectStat;
+        nativeSocket.Ioctl(KIOctlSelect, selectStat, &selectFlags, KSOLSocket);
+
+        if (timeout < 0)
+            User::WaitForRequest(selectStat); //negative means no timeout
+        else {
+            if (!selectTimer.Handle())
+                qt_symbian_throwIfError(selectTimer.CreateLocal());
+            TRequestStatus timerStat;
+            selectTimer.HighRes(timerStat, timeout * 1000);
+            User::WaitForRequest(timerStat, selectStat);
+            if (selectStat == KRequestPending) {
+                nativeSocket.CancelIoctl();
+                //CancelIoctl completes the request (most likely with KErrCancel)
+                //We need to wait for this to keep the thread semaphore balanced (or active scheduler will panic)
+                User::WaitForRequest(selectStat);
+                //restart asynchronous notifier (only one IOCTL allowed at a time)
+                if (asyncSelect)
+                    asyncSelect->IssueRequest();
+    #ifdef QNATIVESOCKETENGINE_DEBUG
+                qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select timeout";
+    #endif
+                return 0; //timeout
+            } else {
+                selectTimer.Cancel();
+                User::WaitForRequest(timerStat);
+            }
         }
+
+    #ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select status" << selectStat.Int() << (int)selectFlags();
+    #endif
+        err = selectStat.Int();
     }
 
-#ifdef QNATIVESOCKETENGINE_DEBUG
-    qDebug() << "QSymbianSocketEnginePrivate::nativeSelect: select status" << selectStat.Int() << (int)selectFlags();
-#endif
-    TInt err = selectStat.Int();
     if (!err && (selectFlags() & KSockSelectExcept)) {
         nativeSocket.GetOpt(KSOSelectLastError, KSOLSocket, err);
 #ifdef QNATIVESOCKETENGINE_DEBUG
-- 
cgit v0.12


From a970c3334bba3b7e1e27fa8b1b4ad4e4724ce015 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 15:58:34 +0100
Subject: Bearer support for autotests

Start default bearer when running network self test
Fix typo in qnetworkreply test

Reviewed-by: Markus Goetz
---
 tests/auto/networkselftest/tst_networkselftest.cpp | 26 ++++++++++++++++++++++
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp     |  2 +-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp
index 64de64a..ed070d7 100644
--- a/tests/auto/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/networkselftest/tst_networkselftest.cpp
@@ -44,6 +44,12 @@
 
 #include <time.h>
 
+#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtNetwork/qnetworkconfigmanager.h>
+#include <QtNetwork/qnetworkconfiguration.h>
+#include <QtNetwork/qnetworksession.h>
+#endif
+
 #ifdef Q_OS_SYMBIAN
 // In Symbian OS test data is located in applications private dir
 // Current path (C:\private\<UID>) contains only ascii chars
@@ -64,6 +70,7 @@ public:
     QHostAddress serverIpAddress();
 
 private slots:
+    void initTestCase();
     void hostTest();
     void dnsResolution_data();
     void dnsResolution();
@@ -91,6 +98,12 @@ private slots:
 
     // ssl supported test
     void supportsSsl();
+private:
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QScopedPointer<QNetworkSession> networkSession;
+#endif
 };
 
 class Chat
@@ -354,6 +367,19 @@ QHostAddress tst_NetworkSelfTest::serverIpAddress()
     return cachedIpAddress;
 }
 
+void tst_NetworkSelfTest::initTestCase()
+{
+#ifndef QT_NO_BEARERMANAGEMENT
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession.reset(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
+}
+
 void tst_NetworkSelfTest::hostTest()
 {
     // this is a localhost self-test
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 4b8dc3b..11f4fc3 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -143,7 +143,7 @@ class tst_QNetworkReply: public QObject
     QSslConfiguration storedSslConfiguration;
     QList<QSslError> storedExpectedSslErrors;
 #endif
-#ifndef QT_NO_BEARER_MANAGEMENT
+#ifndef QT_NO_BEARERMANAGEMENT
     QNetworkConfigurationManager *netConfMan;
     QNetworkConfiguration networkConfiguration;
     QScopedPointer<QNetworkSession> networkSession;
-- 
cgit v0.12


From aa67255608d7b752fcdd6fcbabf518dbdbf4f98e Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 16:02:10 +0100
Subject: Symbian workaround for networkselftest

The frox ftp proxy closes connections using TCP RST instead of a normal
TCP FIN. On symbian, this causes the received but unacknowledged
preceding packet to be discarded (the "221 Goodbye" ftp response).
As QNAM and QFTP don't care about this, the network self test won't
either. (only for symbian, as windows and unix TCP/IP stacks retain
the unacknowledged packet in the receive queue)

Reviewed-by: Markus Goetz
---
 tests/auto/networkselftest/tst_networkselftest.cpp | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp
index ed070d7..f40ea3e 100644
--- a/tests/auto/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/networkselftest/tst_networkselftest.cpp
@@ -495,7 +495,8 @@ void tst_NetworkSelfTest::fileLineEndingTest()
 
 static QList<Chat> ftpChat(const QByteArray &userSuffix = QByteArray())
 {
-    return QList<Chat>() << Chat::expect("220")
+    QList<Chat> rv;
+    rv << Chat::expect("220")
             << Chat::discardUntil("\r\n")
             << Chat::send("USER anonymous" + userSuffix + "\r\n")
             << Chat::expect("331")
@@ -530,10 +531,15 @@ static QList<Chat> ftpChat(const QByteArray &userSuffix = QByteArray())
 //            << Chat::send("SIZE nonASCII/german_\344\366\374\304\326\334\337\r\n")
 //            << Chat::expect("213 40\r\n")
 
-            << Chat::send("QUIT\r\n")
-            << Chat::expect("221")
-            << Chat::discardUntil("\r\n")
-            << Chat::RemoteDisconnect;
+            << Chat::send("QUIT\r\n");
+#ifdef Q_OS_SYMBIAN
+    if (userSuffix.length() == 0) // received but unacknowledged packets are discarded by TCP RST, so this doesn't work with frox proxy
+#endif
+        rv  << Chat::expect("221")
+            << Chat::discardUntil("\r\n");
+
+    rv << Chat::RemoteDisconnect;
+    return rv;
 }
 
 void tst_NetworkSelfTest::ftpServer()
-- 
cgit v0.12


From b58eb992f162efc9db6cada9f037f7a0acbe5c57 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 17:53:45 +0100
Subject: Ensure shared network session deleted from correct thread

Due to threaded http, the shared QNetworkSession can have its last
reference removed from a http delegate thread. To avoid this deadlocking
use a deleteLater custom deleter so that the QNS is deleted from the
thread it has affinity for.

Reviewed-by: Markus Goetz
---
 src/network/bearer/qsharednetworksession.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
index 28ca173..fcb0128 100644
--- a/src/network/bearer/qsharednetworksession.cpp
+++ b/src/network/bearer/qsharednetworksession.cpp
@@ -59,6 +59,11 @@ inline QSharedNetworkSessionManager* sharedNetworkSessionManager()
     return rv;
 }
 
+static void doDeleteLater(QObject* obj)
+{
+    obj->deleteLater();
+}
+
 QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetworkConfiguration config)
 {
     QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
@@ -69,7 +74,7 @@ QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetwor
             return p;
     }
     //otherwise make one
-    QSharedPointer<QNetworkSession> session(new QNetworkSession(config));
+    QSharedPointer<QNetworkSession> session(new QNetworkSession(config), doDeleteLater);
     m->sessions[config] = session;
     return session;
 }
-- 
cgit v0.12


From 917a1a04d7a507dbab4ae9e9983507870232a821 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 18:32:57 +0100
Subject: Make qhttpnetworkconnection autotest work with the new test server

Loosen requirements for generated error pages (these vary with exact
version and locale of the web server). Don't care what the length is,
but if a content-length header is sent then it should match the size
of the error page data. (apache2 does send content-length for errors)

Don't fail the gzip test if the server doesn't send a content-length
header. That's a server bug rather than Qt. (apache2 doesn't send)

Reviewed-by: Markus Goetz
---
 .../tst_qhttpnetworkconnection.cpp                 | 48 ++++++++++++++--------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
index 0b72139..ba1f8c8 100644
--- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
+++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
@@ -195,8 +195,8 @@ void tst_QHttpNetworkConnection::head()
 
     QCOMPARE(reply->statusCode(), statusCode);
     QCOMPARE(reply->reasonPhrase(), statusString);
-    // only check it if it is set
-    if (reply->contentLength() != -1)
+    // only check it if it is set and expected
+    if (reply->contentLength() != -1 && contentLength != -1)
         QCOMPARE(reply->contentLength(), qint64(contentLength));
 
     QVERIFY(reply->isFinished());
@@ -219,8 +219,8 @@ void tst_QHttpNetworkConnection::get_data()
     QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
     QTest::newRow("success-external") << "http://" << "www.ietf.org" << "/rfc/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
 
-    QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1 << 997 + QtNetworkSettings::serverName().size();
-    QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1 << 930 + QtNetworkSettings::serverName().size();
+    QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1 << -1;
+    QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1 << -1;
 }
 
 void tst_QHttpNetworkConnection::get()
@@ -255,8 +255,8 @@ void tst_QHttpNetworkConnection::get()
 
     QCOMPARE(reply->statusCode(), statusCode);
     QCOMPARE(reply->reasonPhrase(), statusString);
-    // only check it if it is set
-    if (reply->contentLength() != -1)
+    // only check it if it is set and expected
+    if (reply->contentLength() != -1 && contentLength != -1)
         QCOMPARE(reply->contentLength(), qint64(contentLength));
 
     stopWatch.start();
@@ -270,7 +270,12 @@ void tst_QHttpNetworkConnection::get()
     } while (!reply->isFinished());
 
     QVERIFY(reply->isFinished());
-    QCOMPARE(ba.size(), downloadSize);
+    //do not require server generated error pages to be a fixed size
+    if (downloadSize != -1)
+        QCOMPARE(ba.size(), downloadSize);
+    //but check against content length if it was sent
+    if (reply->contentLength() != -1)
+        QCOMPARE(ba.size(), (int)reply->contentLength());
 
     delete reply;
 }
@@ -385,7 +390,7 @@ void tst_QHttpNetworkConnection::post_data()
     QTest::addColumn<int>("downloadSize");
 
     QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/cgi-bin/echo.cgi" << ushort(80) << false << "7 bytes" << 200 << "OK" << 7 << 7;
-    QTest::newRow("failure-internal") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << "Hello World" << 404 << "Not Found" << -1 << 997 + QtNetworkSettings::serverName().size();
+    QTest::newRow("failure-internal") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << "Hello World" << 404 << "Not Found" << -1 << -1;
 }
 
 void tst_QHttpNetworkConnection::post()
@@ -429,13 +434,16 @@ void tst_QHttpNetworkConnection::post()
     QCOMPARE(reply->reasonPhrase(), statusString);
 
     qint64 cLen = reply->contentLength();
-    if (cLen==-1) {
-        // HTTP 1.1 server may respond with chunked encoding and in that
-        // case contentLength is not present in reply -> verify that it is the case
-        QByteArray transferEnc = reply->headerField("Transfer-Encoding");
-        QCOMPARE(transferEnc, QByteArray("chunked"));
-    } else {
-        QCOMPARE(cLen, qint64(contentLength));
+    if (contentLength != -1) {
+        // only check the content length if test expected it to be set
+        if (cLen==-1) {
+            // HTTP 1.1 server may respond with chunked encoding and in that
+            // case contentLength is not present in reply -> verify that it is the case
+            QByteArray transferEnc = reply->headerField("Transfer-Encoding");
+            QCOMPARE(transferEnc, QByteArray("chunked"));
+        } else {
+            QCOMPARE(cLen, qint64(contentLength));
+        }
     }
 
     stopWatch.start();
@@ -449,7 +457,12 @@ void tst_QHttpNetworkConnection::post()
     } while (!reply->isFinished());
 
     QVERIFY(reply->isFinished());
-    QCOMPARE(ba.size(), downloadSize);
+    //don't require fixed size for generated error pages
+    if (downloadSize != -1)
+        QCOMPARE(ba.size(), downloadSize);
+    //but do compare with content length if possible
+    if (cLen != -1)
+        QCOMPARE(ba.size(), (int)cLen);
 
     delete reply;
 }
@@ -630,7 +643,8 @@ void tst_QHttpNetworkConnection::compression()
     QCOMPARE(reply->statusCode(), statusCode);
     QCOMPARE(reply->reasonPhrase(), statusString);
     bool isLengthOk = (reply->contentLength() == qint64(contentLength)
-    				  || reply->contentLength() == qint64(downloadSize));
+                      || reply->contentLength() == qint64(downloadSize)
+                      || reply->contentLength() == -1); //apache2 does not send content-length for compressed pages
 
     QVERIFY(isLengthOk);
 
-- 
cgit v0.12


From 8c3c9742abb2d59daa0b9f8f18bd52d9f2bbdbbe Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 18:37:19 +0100
Subject: Add bearer startup to qabstractnetworkcache autotest

This avoids the test starting and stopping the WLAN for each test case

Reviewed-by: Markus Goetz
---
 .../tst_qabstractnetworkcache.cpp                  | 26 ++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index db0d0a7..76e6711 100644
--- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -45,6 +45,12 @@
 #include "../../shared/util.h"
 #include "../network-settings.h"
 
+#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtNetwork/qnetworkconfigmanager.h>
+#include <QtNetwork/qnetworkconfiguration.h>
+#include <QtNetwork/qnetworksession.h>
+#endif
+
 #define TESTFILE QString("http://%1/qtest/cgi-bin/").arg(QtNetworkSettings::serverName())
 
 class tst_QAbstractNetworkCache : public QObject
@@ -56,6 +62,7 @@ public:
     virtual ~tst_QAbstractNetworkCache();
 
 private slots:
+    void initTestCase();
     void expires_data();
     void expires();
     void expiresSynchronous_data();
@@ -81,6 +88,12 @@ private slots:
 private:
     void check();
     void checkSynchronous();
+
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QScopedPointer<QNetworkSession> networkSession;
+#endif
 };
 
 class NetworkDiskCache : public QNetworkDiskCache
@@ -124,6 +137,19 @@ static bool AlwaysFalse = false;
 
 Q_DECLARE_METATYPE(QNetworkRequest::CacheLoadControl)
 
+void tst_QAbstractNetworkCache::initTestCase()
+{
+#ifndef QT_NO_BEARERMANAGEMENT
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession.reset(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
+}
+
 void tst_QAbstractNetworkCache::expires_data()
 {
     QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
-- 
cgit v0.12


From da83fb86defd4e9773d56640e87da32c1e8c7f82 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 18:47:12 +0100
Subject: Remove 2 QSKIP from tst_qnetworkdiskcache

Skipped because of open C bug, but these tests are passing in N8 with
symbian socket & file engines

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index e974fcc..9e06cc4 100644
--- a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -309,9 +309,6 @@ void tst_QNetworkDiskCache::data_data()
 // public QIODevice* data(QUrl const& url)
 void tst_QNetworkDiskCache::data()
 {
-#ifdef Q_OS_SYMBIAN
-    QSKIP("Due to mmap(...) bug in Open C [Temtrack DEF142242]", SkipAll);
-#endif
     QFETCH(QNetworkCacheMetaData, data);
     SubQNetworkDiskCache cache;
     QUrl url(EXAMPLE_URL);
@@ -388,9 +385,6 @@ void tst_QNetworkDiskCache::setCacheDirectory()
 // public void updateMetaData(QNetworkCacheMetaData const& metaData)
 void tst_QNetworkDiskCache::updateMetaData()
 {
-#ifdef Q_OS_SYMBIAN
-    QSKIP("Due to mmap(...) bug in Open C [Temtrack DEF142242]", SkipAll);
-#endif
     QUrl url(EXAMPLE_URL);
     SubQNetworkDiskCache cache;
     cache.setupWithOne(url);
-- 
cgit v0.12


From 2c09d9c463aeff4888e7b694351d15cbb760ccdf Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 28 Mar 2011 19:49:12 +0100
Subject: Fix ssl autotest .pro files

ReadUserData needed to avoid platsec warnings accessing cert store.
Removed incorrect deployment from the two new on demand tests.

Reviewed-by: Markus Goetz
---
 tests/auto/qsslsocket/qsslsocket.pro                           |  2 +-
 .../qsslsocket_onDemandCertificates_member.pro                 | 10 +---------
 .../qsslsocket_onDemandCertificates_static.pro                 | 10 +---------
 3 files changed, 3 insertions(+), 19 deletions(-)

diff --git a/tests/auto/qsslsocket/qsslsocket.pro b/tests/auto/qsslsocket/qsslsocket.pro
index 154f9ca..77517e0 100644
--- a/tests/auto/qsslsocket/qsslsocket.pro
+++ b/tests/auto/qsslsocket/qsslsocket.pro
@@ -24,7 +24,7 @@ wince* {
 } else:symbian {
     DEFINES += QSSLSOCKET_CERTUNTRUSTED_WORKAROUND
     TARGET.EPOCHEAPSIZE="0x100 0x3000000"
-    TARGET.CAPABILITY=NetworkServices
+    TARGET.CAPABILITY=NetworkServices ReadUserData
 
     certFiles.files = certs ssl.tar.gz
     certFiles.path    = .
diff --git a/tests/auto/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro b/tests/auto/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
index ea62865..53020eb 100644
--- a/tests/auto/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
+++ b/tests/auto/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
@@ -17,17 +17,9 @@ win32 {
 
 wince* {
     DEFINES += SRCDIR=\\\"./\\\"
-
-    certFiles.files = certs ssl.tar.gz
-    certFiles.path    = .
-    DEPLOYMENT += certFiles
 } else:symbian {
     TARGET.EPOCHEAPSIZE="0x100 0x1000000"
-    TARGET.CAPABILITY=NetworkServices
-
-    certFiles.files = certs ssl.tar.gz
-    certFiles.path    = .
-    DEPLOYMENT += certFiles
+    TARGET.CAPABILITY=NetworkServices ReadUserData
     INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE  # Needed for e32svr.h in S^3 envs
 } else {
     DEFINES += SRCDIR=\\\"$$PWD/\\\"
diff --git a/tests/auto/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro b/tests/auto/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
index 13990cb..3452a92 100644
--- a/tests/auto/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
+++ b/tests/auto/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
@@ -17,17 +17,9 @@ win32 {
 
 wince* {
     DEFINES += SRCDIR=\\\"./\\\"
-
-    certFiles.files = certs ssl.tar.gz
-    certFiles.path    = .
-    DEPLOYMENT += certFiles
 } else:symbian {
     TARGET.EPOCHEAPSIZE="0x100 0x1000000"
-    TARGET.CAPABILITY=NetworkServices
-
-    certFiles.files = certs ssl.tar.gz
-    certFiles.path    = .
-    DEPLOYMENT += certFiles
+    TARGET.CAPABILITY=NetworkServices ReadUserData
     INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE  # Needed for e32svr.h in S^3 envs
 } else {
     DEFINES += SRCDIR=\\\"$$PWD/\\\"
-- 
cgit v0.12


From 26012845b8b12b2e4d3b6138124f8647a6144d3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 29 Mar 2011 14:32:48 +0200
Subject: Don't break on the first unhandled event in XCB plugin.

Prevent the XCB event queue from growing indefinitely.
---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 191699b..2bdd6d4 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -247,7 +247,7 @@ void QXcbConnection::eventDispatcher()
             break;
         default:
             handled = false;
-            return;
+            break;
         }
         if (handled)
             printXcbEvent("Handled XCB event", event);
-- 
cgit v0.12


From 7590288fd6419159116f4392389cb8ca9691fb06 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 12:50:24 +0200
Subject: Added native language and country names (endonyms) to QLocale.

Task-number: QTBUG-17092
Reviewed-by: Zeno Albisser
Reviewed-by: Liang Qi
---
 src/corelib/tools/qlocale.cpp          | 40 +++++++++++++++
 src/corelib/tools/qlocale.h            |  6 ++-
 src/corelib/tools/qlocale_p.h          |  3 ++
 src/corelib/tools/qlocale_win.cpp      | 27 ++++++++++
 tests/manual/qlocale/info.cpp          | 92 ++++++++++++++++++++++++++++++++++
 tests/manual/qlocale/info.h            | 72 ++++++++++++++++++++++++++
 tests/manual/qlocale/qlocale.pro       |  4 +-
 tests/manual/qlocale/window.cpp        |  3 ++
 tests/manual/qlocale/window.h          |  2 +
 util/local_database/cldr2qlocalexml.py | 16 ++++++
 util/local_database/qlocalexml2cpp.py  | 15 +++++-
 11 files changed, 275 insertions(+), 5 deletions(-)
 create mode 100644 tests/manual/qlocale/info.cpp
 create mode 100644 tests/manual/qlocale/info.h

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index af95a75..197c742 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -3224,4 +3224,44 @@ QStringList QLocale::uiLanguages() const
     return QStringList(bcp47Name());
 }
 
+/*!
+    \since 4.8
+
+    Returns a native name of the language for the locale. For example
+    "Schwiizertüütsch" for Swiss-German locale.
+
+    \sa nativeCountryName(), languageToString()
+*/
+QString QLocale::nativeLanguageName() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::NativeLanguageName, QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    return getLocaleData(endonyms_data + d()->m_language_endonym_idx, d()->m_language_endonym_size);
+}
+
+/*!
+    \since 4.8
+
+    Returns a native name of the country for the locale. For example
+    "España" for Spanish/Spain locale.
+
+    \sa nativeLanguageName(), countryToString()
+*/
+QString QLocale::nativeCountryName() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+    if (d() == systemPrivate()) {
+        QVariant res = systemLocale()->query(QSystemLocale::NativeCountryName, QVariant());
+        if (!res.isNull())
+            return res.toString();
+    }
+#endif
+    return getLocaleData(endonyms_data + d()->m_country_endonym_idx, d()->m_country_endonym_size);
+}
+
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 4ac7630..9f44e30 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -114,7 +114,9 @@ public:
         StringToAlternateQuotation, // QString in: QStringRef to quote
         ScriptId, // uint
         ListToSeparatedString, // QString
-        LocaleChanged // system locale changed
+        LocaleChanged, // system locale changed
+        NativeLanguageName, // QString
+        NativeCountryName // QString
     };
     virtual QVariant query(QueryType type, QVariant in) const;
     virtual QLocale fallbackLocale() const;
@@ -658,6 +660,8 @@ public:
     QString name() const;
 
     QString bcp47Name() const;
+    QString nativeLanguageName() const;
+    QString nativeCountryName() const;
 
     short toShort(const QString &s, bool *ok = 0, int base = 0) const;
     ushort toUShort(const QString &s, bool *ok = 0, int base = 0) const;
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index e600807..1b31929 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -211,11 +211,14 @@ public:
     quint16 m_currency_display_name_idx, m_currency_display_name_size;
     quint8 m_currency_format_idx, m_currency_format_size;
     quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
+    quint16 m_language_endonym_idx, m_language_endonym_size;
+    quint16 m_country_endonym_idx, m_country_endonym_size;
     quint16 m_currency_digits : 2;
     quint16 m_currency_rounding : 3;
     quint16 m_first_day_of_week : 3;
     quint16 m_weekend_start : 3;
     quint16 m_weekend_end : 3;
+
 };
 
 inline char QLocalePrivate::digitToCLocale(const QChar &in) const
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 0c2d039..3325419 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -76,6 +76,12 @@ static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
 #  define LOCALE_SSHORTESTDAYNAME6 0x0065
 #  define LOCALE_SSHORTESTDAYNAME7 0x0066
 #endif
+#ifndef LOCALE_SNATIVELANGUAGENAME
+#  define LOCALE_SNATIVELANGUAGENAME 0x00000004
+#endif
+#ifndef LOCALE_SNATIVECOUNTRYNAME
+#  define LOCALE_SNATIVECOUNTRYNAME 0x00000008
+#endif
 
 struct QSystemLocalePrivate
 {
@@ -101,6 +107,8 @@ struct QSystemLocalePrivate
     QVariant currencySymbol(QLocale::CurrencySymbolFormat);
     QVariant toCurrencyString(const QSystemLocale::CurrencyToStringArgument &);
     QVariant uiLanguages();
+    QVariant nativeLanguageName();
+    QVariant nativeCountryName();
 
     void update();
 
@@ -559,6 +567,21 @@ QVariant QSystemLocalePrivate::uiLanguages()
     return QStringList(QString::fromLatin1(winLangCodeToIsoName(GetUserDefaultUILanguage())));
 }
 
+QVariant QSystemLocalePrivate::nativeLanguageName()
+{
+    if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS7)
+        return getLocaleInfo(LOCALE_SNATIVELANGNAME);
+    return getLocaleInfo(LOCALE_SNATIVELANGUAGENAME);
+}
+
+QVariant QSystemLocalePrivate::nativeCountryName()
+{
+    if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS7)
+        return getLocaleInfo(LOCALE_SNATIVECTRYNAME);
+    return getLocaleInfo(LOCALE_SNATIVECOUNTRYNAME);
+}
+
+
 void QSystemLocalePrivate::update()
 {
     lcid = GetUserDefaultLCID();
@@ -713,6 +736,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case LocaleChanged:
         d->update();
         break;
+    case NativeLanguageName:
+        return d->nativeLanguageName();
+    case NativeCountryName:
+        return d->nativeCountryName();
     default:
         break;
     }
diff --git a/tests/manual/qlocale/info.cpp b/tests/manual/qlocale/info.cpp
new file mode 100644
index 0000000..a4f6adf
--- /dev/null
+++ b/tests/manual/qlocale/info.cpp
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "info.h"
+
+InfoWidget::InfoWidget()
+{
+    scrollArea = new QScrollArea;
+    scrollAreaWidget = new QWidget;
+    scrollArea->setWidget(scrollAreaWidget);
+    scrollArea->setWidgetResizable(true);
+    layout = new QGridLayout();
+    QVBoxLayout *v = new QVBoxLayout(scrollAreaWidget);
+    v->addLayout(layout);
+    v->addStretch();
+
+    QVBoxLayout *l = new QVBoxLayout(this);
+    l->addWidget(scrollArea);
+
+    name = addItem("Name:");
+    bcp47Name = addItem("Bcp47 name:");
+    languageName = addItem("Language name:");
+    nativeLanguageName = addItem("Native language name:");
+    scriptName = addItem("Script name:");
+    countryName = addItem("Country name:");
+    nativeCountryName = addItem("Native country name:");
+}
+
+void InfoWidget::localeChanged(QLocale locale)
+{
+    setLocale(locale);
+    name->setText(locale.name());
+    bcp47Name->setText(locale.bcp47Name());
+    languageName->setText(QLocale::languageToString(locale.language()));
+    nativeLanguageName->setText(locale.nativeLanguageName());
+    scriptName->setText(QLocale::scriptToString(locale.script()));
+    countryName->setText(QLocale::countryToString(locale.country()));
+    nativeCountryName->setText(locale.nativeCountryName());
+}
+
+void InfoWidget::addItem(const QString &label, QWidget *w)
+{
+    QLabel *lbl = new QLabel(label);
+    int row = layout->rowCount();
+    layout->addWidget(lbl, row, 0);
+    layout->addWidget(w, row, 1, 1, 2);
+}
+
+QLineEdit *InfoWidget::addItem(const QString &label)
+{
+    QLineEdit *le = new QLineEdit;
+    le->setReadOnly(true);
+    addItem(label, le);
+    return le;
+}
diff --git a/tests/manual/qlocale/info.h b/tests/manual/qlocale/info.h
new file mode 100644
index 0000000..b23ecf5
--- /dev/null
+++ b/tests/manual/qlocale/info.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INFO_H
+#define INFO_H
+
+#include <QtGui>
+
+class InfoWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    InfoWidget();
+
+private:
+    void addItem(const QString &label, QWidget *);
+    QLineEdit *addItem(const QString &label);
+
+    QScrollArea *scrollArea;
+    QWidget *scrollAreaWidget;
+    QGridLayout *layout;
+
+    QLineEdit *name;
+    QLineEdit *bcp47Name;
+    QLineEdit *languageName;
+    QLineEdit *nativeLanguageName;
+    QLineEdit *scriptName;
+    QLineEdit *countryName;
+    QLineEdit *nativeCountryName;
+
+private slots:
+    void localeChanged(QLocale locale);
+};
+
+#endif
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 6f0bf88..e9f17f4 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -4,5 +4,5 @@ DEPENDPATH += .
 INCLUDEPATH += .
 
 # Input
-HEADERS += currency.h calendar.h dateformats.h numberformats.h languages.h window.h miscellaneous.h
-SOURCES += currency.cpp main.cpp calendar.cpp dateformats.cpp numberformats.cpp languages.cpp window.cpp miscellaneous.cpp
+HEADERS += currency.h calendar.h dateformats.h numberformats.h languages.h window.h miscellaneous.h info.h
+SOURCES += currency.cpp main.cpp calendar.cpp dateformats.cpp numberformats.cpp languages.cpp window.cpp miscellaneous.cpp info.cpp
diff --git a/tests/manual/qlocale/window.cpp b/tests/manual/qlocale/window.cpp
index 38bbbe4..775023e 100644
--- a/tests/manual/qlocale/window.cpp
+++ b/tests/manual/qlocale/window.cpp
@@ -62,6 +62,8 @@ Window::Window()
             this, SLOT(localeChanged(int)));
 
     tabWidget = new QTabWidget;
+    info = new InfoWidget;
+    connect(this, SIGNAL(localeChanged(QLocale)), info, SLOT(localeChanged(QLocale)));
     calendar = new CalendarWidget;
     connect(this, SIGNAL(localeChanged(QLocale)), calendar, SLOT(localeChanged(QLocale)));
     currency = new CurrencyWidget;
@@ -87,6 +89,7 @@ Window::Window()
     l->addWidget(w);
     l->addWidget(tabWidget);
 
+    tabWidget->addTab(info, "Info");
     tabWidget->addTab(calendar, "Calendar");
     tabWidget->addTab(currency, "Currency");
     tabWidget->addTab(languages, "Languages");
diff --git a/tests/manual/qlocale/window.h b/tests/manual/qlocale/window.h
index dfef895..aee728f 100644
--- a/tests/manual/qlocale/window.h
+++ b/tests/manual/qlocale/window.h
@@ -49,6 +49,7 @@
 #include "dateformats.h"
 #include "numberformats.h"
 #include "miscellaneous.h"
+#include "info.h"
 
 class Window : public QMainWindow
 {
@@ -65,6 +66,7 @@ public:
     DateFormatsWidget *dateFormats;
     NumberFormatsWidget *numberFormats;
     MiscWidget *miscellaneous;
+    InfoWidget *info;
 
 private:
     bool event(QEvent *);
diff --git a/util/local_database/cldr2qlocalexml.py b/util/local_database/cldr2qlocalexml.py
index a67971b..f0f9cb1 100755
--- a/util/local_database/cldr2qlocalexml.py
+++ b/util/local_database/cldr2qlocalexml.py
@@ -234,6 +234,18 @@ def generateLocaleInfo(path):
     result['longTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[full]/timeFormat/pattern"))
     result['shortTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[short]/timeFormat/pattern"))
 
+    endonym = None
+    if country_code and script_code:
+        endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s_%s]" % (language_code, script_code, country_code))
+    if not endonym and script_code:
+        endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, script_code))
+    if not endonym and country_code:
+        endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, country_code))
+    if not endonym:
+        endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s]" % (language_code))
+    result['language_endonym'] = endonym
+    result['country_endonym'] = findEntryDef(path, "localeDisplayNames/territories/territory[type=%s]" % (country_code))
+
     currency_format = get_number_in_system(path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system)
     currency_format = parse_number_format(currency_format, result)
     result['currencyFormat'] = currency_format[0]
@@ -687,8 +699,10 @@ print "    <localeList>"
 print \
 "        <locale>\n\
             <language>C</language>\n\
+            <languageEndonym></languageEndonym>\n\
             <script>AnyScript</script>\n\
             <country>AnyCountry</country>\n\
+            <countryEndonym></countryEndonym>\n\
             <decimal>46</decimal>\n\
             <group>44</group>\n\
             <list>59</list>\n\
@@ -740,8 +754,10 @@ for key in locale_keys:
 
     print "        <locale>"
     print "            <language>" + l['language']        + "</language>"
+    print "            <languageEndonym>" + l['language_endonym'].encode('utf-8') + "</languageEndonym>"
     print "            <script>" + l['script']        + "</script>"
     print "            <country>"  + l['country']         + "</country>"
+    print "            <countryEndonym>"  + l['country_endonym'].encode('utf-8') + "</countryEndonym>"
     print "            <languagecode>" + l['language_code']        + "</languagecode>"
     print "            <scriptcode>" + l['script_code']        + "</scriptcode>"
     print "            <countrycode>"  + l['country_code']         + "</countrycode>"
diff --git a/util/local_database/qlocalexml2cpp.py b/util/local_database/qlocalexml2cpp.py
index f16ecbf..8907435 100755
--- a/util/local_database/qlocalexml2cpp.py
+++ b/util/local_database/qlocalexml2cpp.py
@@ -237,8 +237,10 @@ def assertSingleChar(string):
 class Locale:
     def __init__(self, elt):
         self.language = eltText(firstChildElt(elt, "language"))
+        self.languageEndonym = eltText(firstChildElt(elt, "languageEndonym"))
         self.script = eltText(firstChildElt(elt, "script"))
         self.country = eltText(firstChildElt(elt, "country"))
+        self.countryEndonym = eltText(firstChildElt(elt, "countryEndonym"))
         self.decimal = int(eltText(firstChildElt(elt, "decimal")))
         self.group = int(eltText(firstChildElt(elt, "group")))
         self.listDelim = int(eltText(firstChildElt(elt, "list")))
@@ -509,6 +511,7 @@ def main():
     currency_symbol_data = StringData()
     currency_display_name_data = StringData()
     currency_format_data = StringData()
+    endonyms_data = StringData()
 
     # Locale data
     data_temp_file.write("static const QLocalePrivate locale_data[] = {\n")
@@ -521,7 +524,7 @@ def main():
 
     for key in locale_keys:
         l = locale_map[key]
-        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s/%s\n" \
+        data_temp_file.write("    { %6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, {%s}, %s,%s,%s,%s,%s,%s,%6d,%6d,%6d,%6d,%6d }, // %s/%s/%s\n" \
                     % (key[0], key[1], key[2],
                         l.decimal,
                         l.group,
@@ -562,6 +565,8 @@ def main():
                         currency_display_name_data.append(l.currencyDisplayName),
                         currency_format_data.append(l.currencyFormat),
                         currency_format_data.append(l.currencyNegativeFormat),
+                        endonyms_data.append(l.languageEndonym),
+                        endonyms_data.append(l.countryEndonym),
                         l.currencyDigits,
                         l.currencyRounding,
                         l.firstDayOfWeek,
@@ -570,7 +575,7 @@ def main():
                         l.language,
                         l.script,
                         l.country))
-    data_temp_file.write("    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s\n")
+    data_temp_file.write("    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0, 0,0, 0,0 }  // trailing 0s\n")
     data_temp_file.write("};\n")
 
     data_temp_file.write("\n")
@@ -661,6 +666,12 @@ def main():
     data_temp_file.write(wrap_list(currency_format_data.data))
     data_temp_file.write("\n};\n")
 
+    # Endonyms data
+    #check_static_char_array_length("endonyms", endonyms_data.data)
+    data_temp_file.write("static const ushort endonyms_data[] = {\n")
+    data_temp_file.write(wrap_list(endonyms_data.data))
+    data_temp_file.write("\n};\n")
+
     data_temp_file.write("\n")
 
     # Language name list
-- 
cgit v0.12


From 65fba3f9e48a3fc89e10b15624d99493ad4a6bf7 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 13:44:28 +0200
Subject: Updated CLDR data for QLocale.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_data_p.h | 931 ++++++++++++++++++++++---------------
 1 file changed, 561 insertions(+), 370 deletions(-)

diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
index fadc72e..f3c1ed7 100644
--- a/src/corelib/tools/qlocale_data_p.h
+++ b/src/corelib/tools/qlocale_data_p.h
@@ -75,7 +75,7 @@ static const int ImperialMeasurementSystemsCount =
 // GENERATED PART STARTS HERE
 
 /*
-    This part of the file was generated on 2011-03-08 from the
+    This part of the file was generated on 2011-03-28 from the
     Common Locale Data Repository v1.8.1
 
     http://www.unicode.org/cldr/
@@ -306,375 +306,375 @@ static const quint16 locale_index[] = {
 
 static const QLocalePrivate locale_data[] = {
 //      lang   script terr    dec  group   list  prcnt   zero  minus  plus    exp quotStart quotEnd altQuotStart altQuotEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth  sMonth lMonth  sDays  lDays  am,len      pm,len
-    {      1,     0,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // C/AnyScript/AnyCountry
-    {      3,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Ethiopia
-    {      3,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Kenya
-    {      4,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Afar/AnyScript/Djibouti
-    {      4,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Eritrea
-    {      4,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Ethiopia
-    {      5,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/SouthAfrica
-    {      5,     0,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/Namibia
-    {      6,     0,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Albanian/AnyScript/Albania
-    {      7,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Amharic/AnyScript/Ethiopia
-    {      8,     0,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/SaudiArabia
-    {      8,     0,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/Algeria
-    {      8,     0,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Bahrain
-    {      8,     0,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Egypt
-    {      8,     0,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 ,     0,     0,     6,     5,     6 }, // Arabic/AnyScript/Iraq
-    {      8,     0,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Jordan
-    {      8,     0,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Kuwait
-    {      8,     0,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 ,     0,     0,     1,     6,     7 }, // Arabic/AnyScript/Lebanon
-    {      8,     0,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/LibyanArabJamahiriya
-    {      8,     0,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Morocco
-    {      8,     0,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 ,     3,     0,     6,     4,     5 }, // Arabic/AnyScript/Oman
-    {      8,     0,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Qatar
-    {      8,     0,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Sudan
-    {      8,     0,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 ,     0,     0,     7,     5,     6 }, // Arabic/AnyScript/SyrianArabRepublic
-    {      8,     0,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Tunisia
-    {      8,     0,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 ,     2,     1,     1,     5,     6 }, // Arabic/AnyScript/UnitedArabEmirates
-    {      8,     0,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 ,     0,     0,     6,     4,     5 }, // Arabic/AnyScript/Yemen
-    {      9,     0,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Armenian/AnyScript/Armenia
-    {     10,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Assamese/AnyScript/India
-    {     12,     0,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/AnyScript/Azerbaijan
-    {     12,     0,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/AnyScript/Iran
-    {     12,     1,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Arabic/Iran
-    {     12,     2,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1785,77 , 1483,27 , 1660,48 , 1785,77 , 134,27 , 907,26 , 1000,67 , 99,14 , 907,26 , 1000,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  109,4 , 1457,29 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Cyrillic/Azerbaijan
-    {     12,     7,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Latin/Azerbaijan
-    {     14,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 248,31 , 37,5 , 8,10 , 1862,48 , 1910,93 , 2003,24 , 1862,48 , 1910,93 , 2003,24 , 1067,21 , 1088,68 , 798,14 , 1067,21 , 1088,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Basque/AnyScript/Spain
-    {     15,     0,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {66,68,84},  114,1 , 1486,21 , 0,4 , 30,6 ,     2,     1,     1,     6,     7 }, // Bengali/AnyScript/Bangladesh
-    {     15,     0,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {73,78,82},  115,4 , 1507,19 , 0,4 , 30,6 ,     2,     1,     7,     7,     7 }, // Bengali/AnyScript/India
-    {     16,     0,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 285,29 , 93,22 , 115,35 , 2150,75 , 2225,205 , 1483,27 , 2150,75 , 2225,205 , 134,27 , 1269,34 , 1303,79 , 798,14 , 1269,34 , 1303,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  119,3 , 1526,16 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Bhutani/AnyScript/Bhutan
-    {     19,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Breton/AnyScript/France
-    {     20,     0,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 340,18 , 37,5 , 8,10 , 2430,59 , 2489,82 , 2571,24 , 2430,59 , 2489,82 , 2571,24 , 1382,21 , 1403,55 , 1458,14 , 1382,21 , 1403,55 , 1458,14 , 34,7 , 31,7 , {66,71,78},  122,3 , 1553,47 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bulgarian/AnyScript/Bulgaria
-    {     21,     0,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 2595,43 , 2638,88 , 2726,24 , 2595,43 , 2638,88 , 2726,24 , 1472,25 , 1497,54 , 1551,14 , 1472,25 , 1497,54 , 1551,14 , 0,2 , 0,2 , {77,77,75},  125,1 , 1600,18 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Burmese/AnyScript/Myanmar
-    {     22,     0,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 358,6 , 10,17 , 150,5 , 155,10 , 2750,48 , 2798,99 , 2897,24 , 2750,48 , 2798,95 , 2893,24 , 1565,21 , 1586,56 , 1642,14 , 1565,21 , 1586,56 , 1642,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1618,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Byelorussian/AnyScript/Belarus
-    {     23,     0,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 372,30 , 165,4 , 169,26 , 2921,27 , 2948,71 , 1483,27 , 2917,27 , 2944,71 , 134,27 , 1656,19 , 1675,76 , 798,14 , 1656,19 , 1675,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  126,1 , 1641,11 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cambodian/AnyScript/Cambodia
-    {     24,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 27,8 , 402,21 , 165,4 , 195,9 , 3019,60 , 3079,82 , 3161,24 , 3015,93 , 3108,115 , 3223,24 , 1751,21 , 1772,60 , 1832,14 , 1846,28 , 1874,60 , 1934,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Catalan/AnyScript/Spain
-    {     25,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/China
-    {     25,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/HongKong
-    {     25,     0,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Macau
-    {     25,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Singapore
-    {     25,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Taiwan
-    {     25,     5,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/China
-    {     25,     5,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/HongKong
-    {     25,     5,   126,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1722,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Macau
-    {     25,     5,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Singapore
-    {     25,     6,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/HongKong
-    {     25,     6,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Macau
-    {     25,     6,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Taiwan
-    {     27,     0,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 470,13 , 483,19 , 37,5 , 8,10 , 3262,49 , 3311,94 , 3405,39 , 3286,49 , 3335,98 , 3433,39 , 2032,28 , 2060,58 , 2118,14 , 2032,28 , 2060,58 , 2118,14 , 0,2 , 0,2 , {72,82,75},  138,2 , 1732,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Croatian/AnyScript/Croatia
-    {     28,     0,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 78,7 , 78,7 , 358,6 , 502,18 , 165,4 , 195,9 , 3405,39 , 3444,82 , 3526,24 , 134,27 , 3472,84 , 3556,24 , 2132,21 , 2153,49 , 2202,14 , 2132,21 , 2153,49 , 2202,14 , 62,4 , 62,4 , {67,90,75},  140,2 , 1759,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Czech/AnyScript/CzechRepublic
-    {     29,     0,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 27,8 , 520,23 , 150,5 , 155,10 , 3550,48 , 3598,84 , 134,24 , 3580,59 , 3639,84 , 320,24 , 2216,28 , 2244,51 , 2295,14 , 2216,28 , 2244,51 , 2295,14 , 66,4 , 66,4 , {68,75,75},  142,2 , 1778,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Danish/AnyScript/Denmark
-    {     30,     0,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 543,8 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 8,5 , 19,6 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Netherlands
-    {     30,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 551,7 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Belgium
-    {     31,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStates
-    {     31,     0,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/AmericanSamoa
-    {     31,     0,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  128,1 , 1874,59 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Australia
-    {     31,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belgium
-    {     31,     0,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  128,1 , 1953,47 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belize
-    {     31,     0,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  144,1 , 2000,50 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Botswana
-    {     31,     0,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2050,53 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Canada
-    {     31,     0,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Guam
-    {     31,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  128,1 , 2103,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/HongKong
-    {     31,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 2159,44 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // English/AnyScript/India
-    {     31,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Ireland
-    {     31,     0,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  128,1 , 2203,53 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Jamaica
-    {     31,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Malta
-    {     31,     0,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/MarshallIslands
-    {     31,     0,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 2256,53 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // English/AnyScript/Mauritius
-    {     31,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  128,1 , 2309,53 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Namibia
-    {     31,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  128,1 , 2362,62 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NewZealand
-    {     31,     0,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NorthernMarianaIslands
-    {     31,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  151,1 , 2424,53 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // English/AnyScript/Pakistan
-    {     31,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 2477,42 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Philippines
-    {     31,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  128,1 , 2519,56 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Singapore
-    {     31,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2575,61 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/SouthAfrica
-    {     31,     0,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  128,1 , 2636,86 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/TrinidadAndTobago
-    {     31,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 2722,74 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // English/AnyScript/UnitedKingdom
-    {     31,     0,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStatesMinorOutlyingIslands
-    {     31,     0,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/USVirginIslands
-    {     31,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Zimbabwe
-    {     31,     3,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 3818,80 , 3898,154 , 4052,36 , 3870,80 , 3950,154 , 4104,36 , 2403,49 , 2452,85 , 2537,21 , 2403,49 , 2452,85 , 2537,21 , 70,4 , 70,4 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // English/Deseret/UnitedStates
-    {     33,     0,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 112,8 , 112,8 , 332,8 , 502,18 , 165,4 , 263,9 , 4088,59 , 4147,91 , 4238,24 , 4140,59 , 4199,91 , 4290,24 , 2558,14 , 2572,63 , 2558,14 , 2558,14 , 2572,63 , 2558,14 , 74,14 , 74,16 , {69,69,75},  142,2 , 2796,41 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Estonian/AnyScript/Estonia
-    {     34,     0,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 543,8 , 82,17 , 37,5 , 8,10 , 4262,48 , 4310,83 , 134,24 , 4314,48 , 4362,83 , 320,24 , 2635,28 , 2663,74 , 2737,14 , 2635,28 , 2663,74 , 2737,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 2837,42 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Faroese/AnyScript/FaroeIslands
-    {     36,     0,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 586,8 , 594,17 , 272,4 , 276,9 , 4393,69 , 4462,105 , 4567,24 , 4445,129 , 4445,129 , 4574,24 , 2751,21 , 2772,67 , 2839,14 , 2751,21 , 2853,81 , 2839,14 , 88,3 , 90,3 , {69,85,82},  113,1 , 2879,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Finnish/AnyScript/Finland
-    {     37,     0,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/France
-    {     37,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 551,7 , 99,16 , 37,5 , 285,23 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Belgium
-    {     37,     0,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Cameroon
-    {     37,     0,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 115,8 , 99,16 , 37,5 , 239,24 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2955,54 , 25,5 , 41,7 ,     2,     1,     7,     6,     7 }, // French/AnyScript/Canada
-    {     37,     0,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/CentralAfricanRepublic
-    {     37,     0,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/IvoryCoast
-    {     37,     0,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Guadeloupe
-    {     37,     0,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {71,78,70},  160,3 , 3068,48 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Guinea
-    {     37,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Luxembourg
-    {     37,     0,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3116,54 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Madagascar
-    {     37,     0,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Mali
-    {     37,     0,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Martinique
-    {     37,     0,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Monaco
-    {     37,     0,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Niger
-    {     37,     0,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Reunion
-    {     37,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Senegal
-    {     37,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 120,8 , 120,8 , 332,8 , 10,17 , 37,5 , 308,14 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,72,70},  163,3 , 3170,45 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // French/AnyScript/Switzerland
-    {     37,     0,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Barthelemy
-    {     37,     0,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Martin
-    {     40,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 4739,48 , 4787,87 , 4874,24 , 4746,48 , 4794,87 , 4881,24 , 3035,28 , 3063,49 , 3112,14 , 3035,28 , 3063,49 , 3112,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Galician/AnyScript/Spain
-    {     41,     0,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 4898,48 , 4946,99 , 5045,24 , 4905,48 , 4953,99 , 5052,24 , 3126,28 , 3154,62 , 3216,14 , 3126,28 , 3154,62 , 3216,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3215,19 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Georgian/AnyScript/Georgia
-    {     42,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Germany
-    {     42,     0,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 611,19 , 37,5 , 8,10 , 5069,52 , 5204,83 , 134,24 , 5207,48 , 5255,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Austria
-    {     42,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 551,7 , 99,16 , 37,5 , 239,24 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3353,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Belgium
-    {     42,     0,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 4,0 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Liechtenstein
-    {     42,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Luxembourg
-    {     42,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Switzerland
-    {     43,     0,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Greece
-    {     43,     0,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Cyprus
-    {     44,     0,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 146,11 , 0,6 , 0,6 , 146,11 , 72,10 , 82,17 , 18,7 , 25,12 , 3550,48 , 5476,96 , 134,24 , 5527,48 , 5575,96 , 320,24 , 3478,28 , 3506,98 , 3604,14 , 3478,28 , 3506,98 , 3604,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 3313,24 , 4,4 , 36,5 ,     2,     1,     7,     6,     7 }, // Greenlandic/AnyScript/Greenland
-    {     46,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 157,9 , 157,9 , 630,7 , 203,18 , 322,8 , 330,13 , 5572,67 , 5639,87 , 5726,31 , 5671,67 , 5738,87 , 5825,31 , 3618,32 , 3650,53 , 3703,19 , 3618,32 , 3650,53 , 3703,19 , 100,14 , 103,14 , {73,78,82},  166,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Gujarati/AnyScript/India
-    {     47,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Ghana
-    {     47,     0,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/AnyScript/Niger
-    {     47,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Nigeria
-    {     47,     0,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/AnyScript/Sudan
-    {     47,     1,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3405,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Arabic/Nigeria
-    {     47,     1,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Hausa/Arabic/Sudan
-    {     47,     7,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Ghana
-    {     47,     7,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hausa/Latin/Niger
-    {     47,     7,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Nigeria
-    {     48,     0,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 637,18 , 37,5 , 8,10 , 6068,58 , 6126,72 , 1483,27 , 6167,48 , 6215,72 , 134,27 , 3897,46 , 3943,65 , 4008,14 , 3897,46 , 3943,65 , 4008,14 , 114,6 , 117,5 , {73,76,83},  172,1 , 3418,21 , 25,5 , 4,0 ,     2,     1,     7,     5,     6 }, // Hebrew/AnyScript/Israel
-    {     49,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 166,8 , 166,8 , 655,6 , 10,17 , 18,7 , 25,12 , 6198,75 , 6198,75 , 6273,30 , 6287,75 , 6287,75 , 6362,30 , 4022,38 , 4060,57 , 4117,19 , 4022,38 , 4060,57 , 4117,19 , 120,9 , 122,7 , {73,78,82},  173,3 , 3439,19 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Hindi/AnyScript/India
-    {     50,     0,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 0,6 , 0,6 , 174,8 , 174,8 , 661,11 , 672,19 , 165,4 , 195,9 , 6303,64 , 6367,98 , 6465,25 , 6392,64 , 6456,98 , 6554,25 , 4136,19 , 4155,52 , 4207,17 , 4136,19 , 4155,52 , 4207,17 , 129,3 , 129,3 , {72,85,70},  176,2 , 3458,20 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Hungarian/AnyScript/Hungary
-    {     51,     0,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 85,8 , 85,8 , 586,8 , 502,18 , 37,5 , 8,10 , 6490,48 , 6538,82 , 6620,24 , 6579,48 , 6627,82 , 6709,24 , 4224,28 , 4252,81 , 4333,14 , 4224,28 , 4252,81 , 4347,14 , 132,4 , 132,4 , {73,83,75},  142,2 , 3478,48 , 25,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Icelandic/AnyScript/Iceland
-    {     52,     0,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 182,11 , 193,9 , 27,8 , 123,18 , 150,5 , 276,9 , 6644,48 , 6692,87 , 134,24 , 6733,48 , 6781,87 , 320,24 , 4361,28 , 4389,43 , 4432,14 , 4361,28 , 4389,43 , 4432,14 , 0,2 , 0,2 , {73,68,82},  178,2 , 3526,23 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Indonesian/AnyScript/Indonesia
-    {     57,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 6779,62 , 6841,107 , 6948,24 , 6868,62 , 6930,107 , 7037,24 , 4446,37 , 4483,75 , 4558,14 , 4446,37 , 4483,75 , 4558,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 3549,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Irish/AnyScript/Ireland
-    {     58,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 99,16 , 37,5 , 8,10 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Italian/AnyScript/Italy
-    {     58,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 202,8 , 210,7 , 332,8 , 10,17 , 37,5 , 308,14 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {67,72,70},  0,0 , 3560,22 , 8,5 , 48,5 ,     2,     5,     1,     6,     7 }, // Italian/AnyScript/Switzerland
-    {     59,     0,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 68,5 , 68,5 , 221,8 , 429,13 , 165,4 , 343,10 , 3223,39 , 3223,39 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 4728,14 , 4742,28 , 4728,14 , 4728,14 , 4742,28 , 4728,14 , 138,2 , 138,2 , {74,80,89},  127,1 , 3582,10 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Japanese/AnyScript/Japan
-    {     61,     0,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 217,11 , 217,11 , 655,6 , 99,16 , 322,8 , 330,13 , 7138,86 , 7138,86 , 7224,31 , 7227,86 , 7227,86 , 7313,31 , 4770,28 , 4798,53 , 4851,19 , 4770,28 , 4798,53 , 4851,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Kannada/AnyScript/India
-    {     63,     0,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/AnyScript/Kazakhstan
-    {     63,     2,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kazakh/Cyrillic/Kazakhstan
-    {     64,     0,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 7399,60 , 7459,101 , 1483,27 , 7488,60 , 7548,101 , 134,27 , 4952,35 , 4987,84 , 798,14 , 4952,35 , 4987,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  186,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/AnyScript/Rwanda
-    {     65,     0,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  188,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Kirghiz/AnyScript/Kyrgyzstan
-    {     66,     0,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 713,9 , 722,16 , 353,7 , 360,13 , 7560,39 , 7560,39 , 7560,39 , 7649,39 , 7649,39 , 7649,39 , 5071,14 , 5085,28 , 5071,14 , 5071,14 , 5085,28 , 5071,14 , 142,2 , 142,2 , {75,82,87},  191,1 , 3592,13 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Korean/AnyScript/RepublicOfKorea
-    {     67,     0,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/AnyScript/Iran
-    {     67,     0,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/AnyScript/Iraq
-    {     67,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/AnyScript/SyrianArabRepublic
-    {     67,     0,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/AnyScript/Turkey
-    {     67,     1,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Arabic/Iran
-    {     67,     1,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 ,     0,     0,     6,     5,     6 }, // Kurdish/Arabic/Iraq
-    {     67,     7,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     5,     6 }, // Kurdish/Latin/SyrianArabRepublic
-    {     67,     7,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kurdish/Latin/Turkey
-    {     69,     0,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 738,18 , 165,4 , 373,21 , 7718,63 , 7781,75 , 1483,27 , 7807,63 , 7870,75 , 134,27 , 5242,24 , 5266,57 , 798,14 , 5242,24 , 5266,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  197,1 , 3605,10 , 4,4 , 48,5 ,     0,     0,     7,     6,     7 }, // Laothian/AnyScript/Lao
-    {     71,     0,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 228,8 , 228,8 , 332,8 , 756,26 , 37,5 , 8,10 , 7856,65 , 7921,101 , 134,24 , 7945,65 , 8010,101 , 320,24 , 5323,21 , 5344,72 , 5416,14 , 5323,21 , 5344,72 , 5416,14 , 144,14 , 144,11 , {76,86,76},  198,2 , 3615,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Latvian/AnyScript/Latvia
-    {     72,     0,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  200,1 , 3635,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lingala/AnyScript/DemocraticRepublicOfCongo
-    {     72,     0,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  201,4 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Lingala/AnyScript/PeoplesRepublicOfCongo
-    {     73,     0,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 236,8 , 236,8 , 72,10 , 782,26 , 37,5 , 8,10 , 8264,69 , 8333,96 , 8429,24 , 8353,48 , 8401,96 , 8497,24 , 5551,17 , 5568,89 , 5657,14 , 5671,21 , 5568,89 , 5657,14 , 158,9 , 155,6 , {76,84,76},  205,2 , 3657,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Lithuanian/AnyScript/Lithuania
-    {     74,     0,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 808,7 , 123,18 , 37,5 , 8,10 , 8453,63 , 8516,85 , 8601,24 , 8521,63 , 8584,85 , 8669,24 , 5692,34 , 5726,54 , 1458,14 , 5692,34 , 5726,54 , 1458,14 , 167,10 , 161,8 , {77,75,68},  0,0 , 3711,23 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Macedonian/AnyScript/Macedonia
-    {     75,     0,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 8625,48 , 8673,92 , 134,24 , 8693,48 , 8741,92 , 320,24 , 5780,34 , 5814,60 , 5874,14 , 5780,34 , 5814,60 , 5874,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3734,13 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Malagasy/AnyScript/Madagascar
-    {     76,     0,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 815,16 , 394,4 , 25,12 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  207,2 , 3747,23 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/Malaysia
-    {     76,     0,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 564,12 , 165,4 , 398,14 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/BruneiDarussalam
-    {     77,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 244,12 , 244,12 , 27,8 , 831,18 , 18,7 , 25,12 , 8896,66 , 8962,101 , 9063,31 , 8964,66 , 9030,101 , 9131,31 , 5959,47 , 6006,70 , 6076,22 , 5959,47 , 6006,70 , 6076,22 , 177,6 , 169,10 , {73,78,82},  209,2 , 3770,46 , 0,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Malayalam/AnyScript/India
-    {     78,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 849,23 , 37,5 , 8,10 , 9094,48 , 9142,86 , 9228,24 , 9162,48 , 9210,86 , 9296,24 , 6098,28 , 6126,63 , 6189,14 , 6098,28 , 6126,63 , 6189,14 , 183,2 , 179,2 , {69,85,82},  113,1 , 3816,11 , 4,4 , 4,0 ,     2,     1,     7,     6,     7 }, // Maltese/AnyScript/Malta
-    {     79,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9252,83 , 9252,83 , 1483,27 , 9320,83 , 9320,83 , 134,27 , 6203,48 , 6203,48 , 798,14 , 6203,48 , 6203,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  211,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Maori/AnyScript/NewZealand
-    {     80,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 256,11 , 267,9 , 655,6 , 99,16 , 412,7 , 419,12 , 9335,86 , 9335,86 , 9421,32 , 9403,86 , 9403,86 , 9489,32 , 6251,32 , 6283,53 , 4117,19 , 6251,32 , 6283,53 , 4117,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Marathi/AnyScript/India
-    {     82,     0,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/AnyScript/Mongolia
-    {     82,     0,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/AnyScript/China
-    {     82,     2,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Mongolian/Cyrillic/Mongolia
-    {     82,     8,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Mongolian/Mongolian/China
-    {     84,     0,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9623,85 , 9708,27 , 9635,56 , 9691,85 , 9776,27 , 6400,33 , 6433,54 , 6487,14 , 6400,33 , 6433,54 , 6487,14 , 185,14 , 181,14 , {78,80,82},  218,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nepali/AnyScript/Nepal
-    {     84,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9735,80 , 9708,27 , 9635,56 , 9803,80 , 9776,27 , 6400,33 , 6501,54 , 6487,14 , 6400,33 , 6501,54 , 6487,14 , 120,9 , 122,7 , {73,78,82},  145,2 , 3827,49 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Nepali/AnyScript/India
-    {     85,     0,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 9815,59 , 9874,83 , 134,24 , 9883,59 , 9942,83 , 320,24 , 6555,28 , 2244,51 , 2295,14 , 6583,35 , 2244,51 , 2295,14 , 0,2 , 0,2 , {78,79,75},  142,2 , 3876,44 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Norwegian/AnyScript/Norway
-    {     86,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9957,83 , 9957,83 , 1483,27 , 10025,83 , 10025,83 , 134,27 , 6618,57 , 6618,57 , 798,14 , 6618,57 , 6618,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Occitan/AnyScript/France
-    {     87,     0,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 10,17 , 18,7 , 25,12 , 10040,89 , 10040,89 , 10129,32 , 10108,89 , 10108,89 , 10197,32 , 6675,33 , 6708,54 , 6762,18 , 6675,33 , 6708,54 , 6762,18 , 140,2 , 140,2 , {73,78,82},  145,2 , 3920,11 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Oriya/AnyScript/India
-    {     88,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 872,20 , 165,4 , 447,11 , 10161,68 , 10161,68 , 1483,27 , 10229,68 , 10229,68 , 134,27 , 6780,49 , 6780,49 , 798,14 , 6780,49 , 6780,49 , 798,14 , 199,4 , 195,4 , {65,70,78},  222,1 , 3931,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Pashto/AnyScript/Afghanistan
-    {     89,     0,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10229,71 , 10300,70 , 10370,25 , 10297,71 , 10368,73 , 10441,25 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {73,82,82},  223,1 , 3944,17 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Iran
-    {     89,     0,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10395,63 , 10300,70 , 10458,24 , 10466,63 , 10529,68 , 10597,24 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {65,70,78},  222,1 , 3961,23 , 25,5 , 53,8 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Afghanistan
-    {     90,     0,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 892,10 , 10,17 , 37,5 , 8,10 , 10482,48 , 10530,97 , 10627,24 , 10621,48 , 10669,99 , 10768,24 , 6843,34 , 6877,59 , 6936,14 , 6843,34 , 6877,59 , 6936,14 , 0,2 , 0,2 , {80,76,78},  224,2 , 3984,60 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Polish/AnyScript/Poland
-    {     91,     0,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10651,48 , 10699,89 , 134,24 , 10792,48 , 10840,89 , 320,24 , 6950,28 , 6978,79 , 7057,14 , 6950,28 , 6978,79 , 7057,14 , 213,17 , 209,18 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Portugal
-    {     91,     0,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {66,82,76},  226,2 , 4044,54 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Brazil
-    {     91,     0,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 4098,62 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Portuguese/AnyScript/GuineaBissau
-    {     91,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 4160,72 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Mozambique
-    {     92,     0,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/AnyScript/India
-    {     92,     0,   163,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/AnyScript/Pakistan
-    {     92,     1,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Punjabi/Arabic/Pakistan
-    {     92,     4,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Punjabi/Gurmukhi/India
-    {     94,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 502,18 , 37,5 , 8,10 , 11087,67 , 11154,92 , 11246,24 , 11228,67 , 11295,92 , 11387,24 , 7303,23 , 7326,56 , 7382,14 , 7303,23 , 7326,56 , 7382,14 , 140,2 , 231,2 , {67,72,70},  0,0 , 4257,20 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/AnyScript/Switzerland
-    {     95,     0,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4277,54 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Moldova
-    {     95,     0,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {82,79,78},  235,3 , 4331,16 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Romania
-    {     96,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {82,85,66},  238,4 , 4347,89 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/RussianFederation
-    {     96,     0,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4436,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Moldova
-    {     96,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 37,5 , 8,10 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {85,65,72},  242,1 , 4457,24 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Ukraine
-    {     98,     0,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 11618,48 , 11666,91 , 11757,24 , 11762,48 , 11810,91 , 11901,24 , 7624,28 , 7652,66 , 7718,14 , 7624,28 , 7652,66 , 7718,14 , 235,2 , 233,2 , {88,65,70},  201,4 , 4481,25 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Sangho/AnyScript/CentralAfricanRepublic
-    {     99,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  180,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     7,     7,     7 }, // Sanskrit/AnyScript/India
-    {    100,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/SerbiaAndMontenegro
-    {    100,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/BosniaAndHerzegowina
-    {    100,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Yugoslavia
-    {    100,     0,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Montenegro
-    {    100,     0,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/AnyScript/Serbia
-    {    100,     2,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/BosniaAndHerzegowina
-    {    100,     2,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Yugoslavia
-    {    100,     2,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/SerbiaAndMontenegro
-    {    100,     2,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {69,85,82},  113,1 , 4799,27 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Montenegro
-    {    100,     2,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Cyrillic/Serbia
-    {    100,     7,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/BosniaAndHerzegowina
-    {    100,     7,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Yugoslavia
-    {    100,     7,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/SerbiaAndMontenegro
-    {    100,     7,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Montenegro
-    {    100,     7,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {82,83,68},  252,4 , 5044,71 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Serbian/Latin/Serbia
-    {    101,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/SerbiaAndMontenegro
-    {    101,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/BosniaAndHerzegowina
-    {    101,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/Yugoslavia
-    {    102,     0,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/Lesotho
-    {    102,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/SouthAfrica
-    {    103,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12299,48 , 12347,117 , 1483,27 , 12443,48 , 12491,117 , 134,27 , 8078,27 , 8105,64 , 798,14 , 8078,27 , 8105,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Setswana/AnyScript/SouthAfrica
-    {    104,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 12464,47 , 12511,100 , 12611,24 , 12608,47 , 12655,100 , 12755,24 , 8169,32 , 8201,55 , 8256,14 , 8169,32 , 8201,55 , 8256,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 5115,22 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Shona/AnyScript/Zimbabwe
-    {    106,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 576,10 , 988,17 , 18,7 , 25,12 , 12635,54 , 12689,92 , 12781,32 , 12779,54 , 12833,92 , 12925,32 , 8270,30 , 8300,62 , 8362,19 , 8270,30 , 8300,62 , 8362,19 , 255,5 , 249,4 , {76,75,82},  259,5 , 5137,19 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Singhalese/AnyScript/SriLanka
-    {    107,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/SouthAfrica
-    {    107,     0,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  264,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/Swaziland
-    {    108,     0,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 0,6 , 0,6 , 78,7 , 78,7 , 586,8 , 502,18 , 165,4 , 195,9 , 12975,48 , 13023,82 , 12122,24 , 13119,48 , 13167,89 , 12266,24 , 8476,21 , 8497,52 , 8549,14 , 8476,21 , 8497,52 , 8549,14 , 260,10 , 253,9 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovak/AnyScript/Slovakia
-    {    109,     0,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 0,6 , 0,6 , 276,8 , 276,8 , 1005,9 , 611,19 , 37,5 , 8,10 , 11993,48 , 13105,86 , 12122,24 , 12137,48 , 13256,86 , 12266,24 , 8563,28 , 8591,52 , 8643,14 , 8563,28 , 8591,52 , 8643,14 , 62,4 , 262,4 , {69,85,82},  113,1 , 5156,28 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Slovenian/AnyScript/Slovenia
-    {    110,     0,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {83,79,83},  265,3 , 5184,22 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Somalia
-    {    110,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {68,74,70},  5,3 , 5206,21 , 4,4 , 4,0 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Djibouti
-    {    110,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {69,84,66},  0,2 , 5227,22 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Ethiopia
-    {    110,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Kenya
-    {    111,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Spain
-    {    111,     0,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 517,14 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {65,82,83},  128,1 , 5249,51 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/Argentina
-    {    111,     0,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {66,79,66},  268,2 , 5300,35 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Bolivia
-    {    111,     0,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 543,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,76,80},  128,1 , 5335,45 , 4,4 , 48,5 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Chile
-    {    111,     0,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,79,80},  128,1 , 5380,54 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Colombia
-    {    111,     0,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,82,67},  270,1 , 5434,67 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/CostaRica
-    {    111,     0,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {68,79,80},  271,3 , 5501,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/DominicanRepublic
-    {    111,     0,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Ecuador
-    {    111,     0,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  256,3 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/ElSalvador
-    {    111,     0,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {88,65,70},  201,4 , 5625,22 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/EquatorialGuinea
-    {    111,     0,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {71,84,81},  274,1 , 5647,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Guatemala
-    {    111,     0,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1040,27 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {72,78,76},  275,1 , 5717,60 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Honduras
-    {    111,     0,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {77,88,78},  128,1 , 5777,48 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Mexico
-    {    111,     0,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {78,73,79},  276,2 , 5825,81 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Nicaragua
-    {    111,     0,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,65,66},  278,3 , 5906,54 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Panama
-    {    111,     0,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,89,71},  281,1 , 5960,61 , 8,5 , 61,6 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Paraguay
-    {    111,     0,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 531,15 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,69,78},  282,3 , 6021,62 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Peru
-    {    111,     0,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/PuertoRico
-    {    111,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 558,6 , 1014,26 , 18,7 , 25,12 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/UnitedStates
-    {    111,     0,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,89,85},  128,1 , 6083,48 , 8,5 , 67,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Uruguay
-    {    111,     0,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {86,69,70},  285,5 , 6131,86 , 4,4 , 48,5 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Venezuela
-    {    111,     0,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4506,0 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/LatinAmericaAndTheCaribbean
-    {    113,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {75,69,83},  2,3 , 6217,24 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Swahili/AnyScript/Kenya
-    {    113,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {84,90,83},  290,3 , 6241,27 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Swahili/AnyScript/Tanzania
-    {    114,     0,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {83,69,75},  142,2 , 6268,45 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Sweden
-    {    114,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {69,85,82},  113,1 , 6313,19 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Finland
-    {    116,     0,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/AnyScript/Tajikistan
-    {    116,     2,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tajik/Cyrillic/Tajikistan
-    {    117,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {73,78,82},  293,2 , 6345,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tamil/AnyScript/India
-    {    117,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {76,75,82},  295,4 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tamil/AnyScript/SriLanka
-    {    118,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tatar/AnyScript/RussianFederation
-    {    119,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 313,12 , 325,11 , 543,8 , 99,16 , 18,7 , 25,12 , 14127,86 , 14127,86 , 14213,30 , 14278,86 , 14278,86 , 14364,30 , 9154,32 , 9186,60 , 9246,18 , 9154,32 , 9186,60 , 9246,18 , 282,1 , 278,2 , {73,78,82},  299,3 , 6358,13 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Telugu/AnyScript/India
-    {    120,     0,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 336,5 , 336,5 , 341,8 , 349,7 , 364,8 , 1108,19 , 165,4 , 546,27 , 14243,63 , 14306,98 , 14243,63 , 14394,63 , 14457,98 , 14555,24 , 9264,23 , 9287,68 , 9355,14 , 9264,23 , 9287,68 , 9355,14 , 283,10 , 280,10 , {84,72,66},  302,1 , 6371,13 , 4,4 , 48,5 ,     2,     1,     7,     6,     7 }, // Thai/AnyScript/Thailand
-    {    121,     0,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {67,78,89},  215,3 , 6384,13 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Tibetan/AnyScript/China
-    {    121,     0,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {73,78,82},  145,2 , 6397,22 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Tibetan/AnyScript/India
-    {    122,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1127,23 , 18,7 , 25,12 , 14625,46 , 14671,54 , 1034,24 , 14800,46 , 14846,54 , 1061,24 , 9516,29 , 9516,29 , 9545,14 , 9516,29 , 9516,29 , 9545,14 , 300,7 , 298,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Eritrea
-    {    122,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9559,29 , 9559,29 , 9545,14 , 9559,29 , 9559,29 , 9545,14 , 300,7 , 298,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Ethiopia
-    {    123,     0,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 99,16 , 37,5 , 8,10 , 14725,51 , 14776,87 , 14863,24 , 14900,51 , 14951,87 , 15038,24 , 9588,29 , 9617,60 , 9677,14 , 9588,29 , 9617,60 , 9677,14 , 0,2 , 0,2 , {84,79,80},  303,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tonga/AnyScript/Tonga
-    {    124,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14887,48 , 14935,122 , 1483,27 , 15062,48 , 15110,122 , 134,27 , 9691,27 , 9718,72 , 798,14 , 9691,27 , 9718,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Tsonga/AnyScript/SouthAfrica
-    {    125,     0,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 356,8 , 356,8 , 929,10 , 1173,17 , 37,5 , 8,10 , 15057,48 , 15105,75 , 15180,24 , 15232,48 , 15280,75 , 15355,24 , 9790,28 , 9818,54 , 9872,14 , 9790,28 , 9818,54 , 9872,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 6419,18 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Turkish/AnyScript/Turkey
-    {    128,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/AnyScript/China
-    {    128,     1,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Uigur/Arabic/China
-    {    129,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 364,8 , 364,8 , 332,8 , 1190,22 , 37,5 , 8,10 , 15204,48 , 15252,95 , 15347,24 , 15379,67 , 15446,87 , 15533,24 , 9886,21 , 9907,56 , 9963,14 , 9886,21 , 9907,56 , 9963,14 , 307,2 , 305,2 , {85,65,72},  242,1 , 6437,49 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ukrainian/AnyScript/Ukraine
-    {    130,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 6486,18 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Urdu/AnyScript/India
-    {    130,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {80,75,82},  305,4 , 6504,21 , 4,4 , 4,0 ,     0,     0,     7,     6,     7 }, // Urdu/AnyScript/Pakistan
-    {    131,     0,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/AnyScript/Uzbekistan
-    {    131,     0,     1,    44,    46,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/AnyScript/Afghanistan
-    {    131,     1,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 ,     0,     0,     6,     4,     5 }, // Uzbek/Arabic/Afghanistan
-    {    131,     2,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Cyrillic/Uzbekistan
-    {    131,     7,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 15669,52 , 15438,115 , 15721,24 , 15787,52 , 15624,115 , 15839,24 , 10143,34 , 10177,61 , 10238,14 , 10143,34 , 10177,61 , 10238,14 , 0,2 , 0,2 , {85,90,83},  314,4 , 6559,23 , 8,5 , 4,0 ,     0,     0,     7,     6,     7 }, // Uzbek/Latin/Uzbekistan
-    {    132,     0,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 372,8 , 372,8 , 141,10 , 1263,31 , 37,5 , 8,10 , 15745,75 , 15820,130 , 1483,27 , 15863,75 , 15938,130 , 134,27 , 10252,33 , 10285,55 , 10340,21 , 10252,33 , 10285,55 , 10340,21 , 309,2 , 307,2 , {86,78,68},  318,1 , 6582,11 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Vietnamese/AnyScript/VietNam
-    {    134,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 15950,53 , 16003,87 , 16090,24 , 16068,62 , 16130,86 , 16216,24 , 10361,29 , 10390,77 , 10467,14 , 10481,30 , 10390,77 , 10467,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 6593,28 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Welsh/AnyScript/UnitedKingdom
-    {    135,     0,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/AnyScript/Senegal
-    {    135,     7,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Wolof/Latin/Senegal
-    {    136,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 16114,48 , 16162,91 , 1483,27 , 16240,48 , 16288,91 , 134,27 , 10511,28 , 10539,61 , 798,14 , 10511,28 , 10539,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Xhosa/AnyScript/SouthAfrica
-    {    138,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 16253,73 , 16326,121 , 1483,27 , 16379,73 , 16452,121 , 134,27 , 10600,44 , 10644,69 , 798,14 , 10600,44 , 10644,69 , 798,14 , 311,5 , 309,5 , {78,71,78},  171,1 , 6621,34 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Yoruba/AnyScript/Nigeria
-    {    140,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 82,17 , 18,7 , 25,12 , 16447,48 , 16495,104 , 134,24 , 16573,48 , 16621,90 , 320,24 , 10713,28 , 10741,68 , 10809,14 , 10713,28 , 10741,68 , 10809,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Zulu/AnyScript/SouthAfrica
-    {    141,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 4262,48 , 9874,83 , 134,24 , 4314,48 , 9942,83 , 320,24 , 10823,28 , 10851,51 , 2295,14 , 10823,28 , 10851,51 , 2295,14 , 316,9 , 314,11 , {78,79,75},  142,2 , 6655,42 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Nynorsk/AnyScript/Norway
-    {    142,     0,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 16599,48 , 16647,83 , 1483,27 , 16711,48 , 16759,83 , 134,27 , 10902,28 , 10930,58 , 798,14 , 10902,28 , 10930,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  250,2 , 6697,26 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Bosnian/AnyScript/BosniaAndHerzegowina
-    {    143,     0,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  319,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     5,     6,     7 }, // Divehi/AnyScript/Maldives
-    {    144,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 16730,102 , 16832,140 , 1483,27 , 16842,102 , 16944,140 , 134,27 , 10988,30 , 11018,57 , 798,14 , 10988,30 , 11018,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Manx/AnyScript/UnitedKingdom
-    {    145,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 16972,46 , 17018,124 , 1483,27 , 17084,46 , 17130,124 , 134,27 , 11075,28 , 11103,60 , 798,14 , 11075,28 , 11103,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Cornish/AnyScript/UnitedKingdom
-    {    146,     0,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17142,48 , 17190,192 , 1483,27 , 17254,48 , 17302,192 , 134,27 , 11163,28 , 11191,49 , 11240,14 , 11163,28 , 11191,49 , 11240,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Akan/AnyScript/Ghana
-    {    147,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 18,7 , 25,12 , 17382,87 , 17382,87 , 1483,27 , 17494,87 , 17494,87 , 134,27 , 6251,32 , 11254,55 , 798,14 , 6251,32 , 11254,55 , 798,14 , 327,5 , 327,5 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     7,     7 }, // Konkani/AnyScript/India
-    {    148,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17469,48 , 17517,94 , 1483,27 , 17581,48 , 17629,94 , 134,27 , 11309,26 , 11335,34 , 798,14 , 11309,26 , 11335,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Ga/AnyScript/Ghana
-    {    149,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17611,48 , 17659,86 , 1483,27 , 17723,48 , 17771,86 , 134,27 , 11369,29 , 11398,57 , 798,14 , 11369,29 , 11398,57 , 798,14 , 332,4 , 332,4 , {78,71,78},  171,1 , 6723,12 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Igbo/AnyScript/Nigeria
-    {    150,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17745,48 , 17793,189 , 17982,24 , 17857,48 , 17905,189 , 18094,24 , 11455,28 , 11483,74 , 11557,14 , 11455,28 , 11483,74 , 11557,14 , 336,9 , 336,7 , {75,69,83},  2,3 , 6735,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kamba/AnyScript/Kenya
-    {    151,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 1294,13 , 394,4 , 25,12 , 18006,65 , 18006,65 , 1483,27 , 18118,65 , 18118,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 ,     0,     0,     7,     5,     6 }, // Syriac/AnyScript/SyrianArabRepublic
-    {    152,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1307,22 , 18,7 , 25,12 , 18071,47 , 18118,77 , 18195,24 , 18183,47 , 18230,77 , 18307,24 , 11571,26 , 11597,43 , 11640,14 , 11571,26 , 11597,43 , 11640,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Blin/AnyScript/Eritrea
-    {    153,     0,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Eritrea
-    {    153,     0,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Ethiopia
-    {    154,     0,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18292,48 , 18340,124 , 1483,27 , 18404,48 , 18452,124 , 134,27 , 11697,28 , 11725,54 , 798,14 , 11697,28 , 11725,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Koro/AnyScript/IvoryCoast
-    {    155,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11779,28 , 11807,51 , 11858,14 , 11779,28 , 11807,51 , 11858,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Sidamo/AnyScript/Ethiopia
-    {    156,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18464,59 , 18523,129 , 1483,27 , 18576,59 , 18635,129 , 134,27 , 11872,35 , 11907,87 , 798,14 , 11872,35 , 11907,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6758,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Atsam/AnyScript/Nigeria
-    {    157,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11994,27 , 12021,41 , 12062,14 , 11994,27 , 12021,41 , 12062,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Tigre/AnyScript/Eritrea
-    {    158,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18652,57 , 18709,178 , 1483,27 , 18764,57 , 18821,178 , 134,27 , 12076,28 , 12104,44 , 798,14 , 12076,28 , 12104,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6769,14 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Jju/AnyScript/Nigeria
-    {    159,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1373,27 , 37,5 , 8,10 , 18887,48 , 18935,77 , 19012,24 , 18999,48 , 19047,77 , 19124,24 , 12148,28 , 12176,50 , 3021,14 , 12148,28 , 12176,50 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Friulian/AnyScript/Italy
-    {    160,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19036,48 , 19084,111 , 1483,27 , 19148,48 , 19196,111 , 134,27 , 12226,27 , 12253,70 , 798,14 , 12226,27 , 12253,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Venda/AnyScript/SouthAfrica
-    {    161,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     1,     6,     7 }, // Ewe/AnyScript/Ghana
-    {    161,     0,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {88,79,70},  157,3 , 6783,11 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Ewe/AnyScript/Togo
-    {    162,     0,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12413,27 , 12413,27 , 12440,14 , 12413,27 , 12413,27 , 12440,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Walamo/AnyScript/Ethiopia
-    {    163,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 10,17 , 18,7 , 25,12 , 19354,59 , 19413,95 , 1483,27 , 19466,59 , 19525,95 , 134,27 , 12454,21 , 12475,57 , 798,14 , 12454,21 , 12475,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 0,7 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Hawaiian/AnyScript/UnitedStates
-    {    164,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 19508,48 , 19556,153 , 1483,27 , 19620,48 , 19668,153 , 134,27 , 12532,28 , 12560,42 , 798,14 , 12532,28 , 12560,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6794,11 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Tyap/AnyScript/Nigeria
-    {    165,     0,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19709,48 , 19757,91 , 1483,27 , 19821,48 , 19869,91 , 134,27 , 12602,28 , 12630,67 , 798,14 , 12602,28 , 12630,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6805,22 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Chewa/AnyScript/Malawi
-    {    166,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 380,8 , 380,8 , 558,6 , 1422,18 , 37,5 , 8,10 , 19848,48 , 19896,88 , 19984,24 , 19960,48 , 20008,88 , 20096,24 , 12697,28 , 12725,55 , 12780,14 , 12794,28 , 12725,55 , 12780,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 6827,22 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Filipino/AnyScript/Philippines
-    {    167,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 20008,48 , 20056,86 , 134,24 , 5076,48 , 20120,86 , 320,24 , 12822,28 , 12850,63 , 3311,14 , 12822,28 , 12850,63 , 3311,14 , 91,5 , 343,4 , {67,72,70},  0,0 , 6849,39 , 25,5 , 4,0 ,     2,     5,     1,     6,     7 }, // Swiss German/AnyScript/Switzerland
-    {    168,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 20142,38 , 1483,27 , 134,27 , 20206,38 , 134,27 , 12913,21 , 12934,28 , 12962,14 , 12913,21 , 12934,28 , 12962,14 , 345,2 , 347,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/AnyScript/China
-    {    169,     0,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  321,2 , 0,7 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Kpelle/AnyScript/Guinea
-    {    169,     0,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  128,1 , 0,7 , 8,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Kpelle/AnyScript/Liberia
-    {    170,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Low German/AnyScript/Germany
-    {    171,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20180,48 , 20228,100 , 1483,27 , 20244,48 , 20292,100 , 134,27 , 12976,27 , 13003,66 , 798,14 , 12976,27 , 13003,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/AnyScript/SouthAfrica
-    {    172,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20328,48 , 20376,94 , 1483,27 , 20392,48 , 20440,94 , 134,27 , 13069,27 , 13096,63 , 798,14 , 13069,27 , 13096,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/AnyScript/SouthAfrica
-    {    173,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20470,85 , 20555,145 , 20700,24 , 20534,85 , 20619,145 , 20764,24 , 13159,33 , 13192,65 , 13257,14 , 13159,33 , 13192,65 , 13257,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 6888,23 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Finland
-    {    173,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20724,59 , 20555,145 , 20700,24 , 20788,59 , 20619,145 , 20764,24 , 13159,33 , 13271,75 , 13346,14 , 13159,33 , 13271,75 , 13346,14 , 0,2 , 0,2 , {78,79,75},  323,3 , 6911,21 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Norway
-    {    174,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20783,48 , 20831,142 , 20973,24 , 20847,48 , 20895,142 , 21037,24 , 13360,28 , 13388,172 , 13560,14 , 13360,28 , 13388,172 , 13560,14 , 0,2 , 0,2 , {84,87,68},  135,3 , 6932,18 , 8,5 , 4,0 ,     2,     1,     7,     6,     7 }, // Taroko/AnyScript/Taiwan
-    {    175,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 20997,48 , 21045,88 , 21133,24 , 21061,48 , 21109,88 , 21197,24 , 13574,28 , 13602,62 , 13664,14 , 13574,28 , 13602,62 , 13664,14 , 347,5 , 349,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Gusii/AnyScript/Kenya
-    {    176,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21157,48 , 21205,221 , 21426,24 , 21221,48 , 21269,221 , 21490,24 , 13678,28 , 13706,106 , 13812,14 , 13678,28 , 13706,106 , 13812,14 , 352,10 , 359,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Taita/AnyScript/Kenya
-    {    177,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 21450,48 , 21498,77 , 21575,24 , 21514,48 , 21562,77 , 21639,24 , 13826,28 , 13854,59 , 13913,14 , 13826,28 , 13854,59 , 13913,14 , 362,6 , 369,7 , {88,79,70},  157,3 , 6974,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Fulah/AnyScript/Senegal
-    {    178,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21599,48 , 21647,185 , 21832,24 , 21663,48 , 21711,185 , 21896,24 , 13927,28 , 13955,63 , 14018,14 , 13927,28 , 13955,63 , 14018,14 , 368,6 , 376,8 , {75,69,83},  2,3 , 7000,23 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kikuyu/AnyScript/Kenya
-    {    179,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21856,48 , 21904,173 , 22077,24 , 21920,48 , 21968,173 , 22141,24 , 14032,28 , 14060,105 , 14165,14 , 14032,28 , 14060,105 , 14165,14 , 374,7 , 384,5 , {75,69,83},  2,3 , 7023,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Samburu/AnyScript/Kenya
-    {    180,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 22101,48 , 22149,88 , 134,24 , 22165,48 , 22213,88 , 320,24 , 14179,28 , 14207,55 , 14262,14 , 14179,28 , 14207,55 , 14262,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 0,7 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Sena/AnyScript/Mozambique
-    {    181,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22237,48 , 22285,112 , 22397,24 , 22301,48 , 22349,112 , 22461,24 , 14276,28 , 14304,50 , 14354,14 , 14276,28 , 14304,50 , 14354,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 7048,24 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // North Ndebele/AnyScript/Zimbabwe
-    {    182,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22421,39 , 22460,194 , 22654,24 , 22485,39 , 22524,194 , 22718,24 , 14368,28 , 14396,65 , 14461,14 , 14368,28 , 14396,65 , 14461,14 , 381,8 , 389,7 , {84,90,83},  290,3 , 7072,25 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rombo/AnyScript/Tanzania
-    {    183,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/AnyScript/Morocco
-    {    183,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Latin/Morocco
-    {    183,     9,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22831,48 , 22879,81 , 22960,24 , 22895,48 , 22943,81 , 23024,24 , 14553,30 , 14583,47 , 798,14 , 14553,30 , 14583,47 , 798,14 , 395,6 , 404,8 , {77,65,68},  0,0 , 7118,21 , 0,4 , 4,0 ,     2,     1,     6,     5,     6 }, // Tachelhit/Tifinagh/Morocco
-    {    184,     0,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22984,48 , 23032,84 , 23116,24 , 23048,48 , 23096,84 , 23180,24 , 14630,30 , 14660,51 , 14711,14 , 14630,30 , 14660,51 , 14711,14 , 401,7 , 412,9 , {68,90,68},  326,2 , 7139,21 , 0,4 , 4,0 ,     2,     1,     6,     4,     5 }, // Kabyle/AnyScript/Algeria
-    {    185,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Nyankole/AnyScript/Uganda
-    {    186,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,254 , 23642,24 , 23404,48 , 23452,254 , 23706,24 , 14841,28 , 14869,82 , 14951,14 , 14841,28 , 14869,82 , 14951,14 , 408,7 , 421,7 , {84,90,83},  290,3 , 7186,29 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Bena/AnyScript/Tanzania
-    {    187,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Vunjo/AnyScript/Tanzania
-    {    188,     0,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 23753,47 , 23800,92 , 23892,24 , 23817,47 , 23864,92 , 23956,24 , 15069,28 , 15097,44 , 15141,14 , 15069,28 , 15097,44 , 15141,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 7242,24 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bambara/AnyScript/Mali
-    {    189,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23916,48 , 23964,207 , 24171,24 , 23980,48 , 24028,207 , 24235,24 , 15155,28 , 15183,64 , 15247,14 , 15155,28 , 15183,64 , 15247,14 , 420,2 , 437,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Embu/AnyScript/Kenya
-    {    190,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 18,7 , 25,12 , 24195,36 , 24231,58 , 24289,24 , 24259,36 , 24295,58 , 24353,24 , 15261,28 , 15289,49 , 15338,14 , 15261,28 , 15289,49 , 15338,14 , 422,3 , 439,6 , {85,83,68},  128,1 , 7266,19 , 4,4 , 13,6 ,     2,     1,     7,     6,     7 }, // Cherokee/AnyScript/UnitedStates
-    {    191,     0,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 24313,47 , 24360,68 , 24428,24 , 24377,47 , 24424,68 , 24492,24 , 15352,27 , 15379,48 , 15427,14 , 15352,27 , 15379,48 , 15427,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 7285,21 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Morisyen/AnyScript/Mauritius
-    {    192,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 24452,264 , 134,24 , 13764,48 , 24516,264 , 320,24 , 15441,28 , 15469,133 , 14461,14 , 15441,28 , 15469,133 , 14461,14 , 425,4 , 445,5 , {84,90,83},  290,3 , 7215,27 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Makonde/AnyScript/Tanzania
-    {    193,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24716,83 , 24799,111 , 24910,24 , 24780,83 , 24863,111 , 24974,24 , 15602,36 , 15638,63 , 15701,14 , 15602,36 , 15638,63 , 15701,14 , 429,3 , 450,3 , {84,90,83},  290,3 , 7306,29 , 8,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Langi/AnyScript/Tanzania
-    {    194,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 15715,28 , 15743,66 , 15809,14 , 15715,28 , 15743,66 , 15809,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7335,26 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Ganda/AnyScript/Uganda
-    {    195,     0,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25079,48 , 25127,83 , 25210,24 , 25143,48 , 25191,83 , 25274,24 , 15823,80 , 15823,80 , 798,14 , 15823,80 , 15823,80 , 798,14 , 432,8 , 453,7 , {90,77,75},  331,2 , 0,7 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Bemba/AnyScript/Zambia
-    {    196,     0,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 25234,48 , 25282,86 , 134,24 , 25298,48 , 25346,86 , 320,24 , 15903,28 , 15931,73 , 16004,14 , 15903,28 , 15931,73 , 16004,14 , 140,2 , 140,2 , {67,86,69},  333,3 , 7361,25 , 0,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/AnyScript/CapeVerde
-    {    197,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25368,48 , 25416,86 , 25502,24 , 25432,48 , 25480,86 , 25566,24 , 16018,28 , 16046,51 , 16097,14 , 16018,28 , 16046,51 , 16097,14 , 440,2 , 460,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Meru/AnyScript/Kenya
-    {    198,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25526,48 , 25574,111 , 25685,24 , 25590,48 , 25638,111 , 25749,24 , 16111,28 , 16139,93 , 16232,14 , 16111,28 , 16139,93 , 16232,14 , 442,4 , 462,4 , {75,69,83},  2,3 , 7386,26 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Kalenjin/AnyScript/Kenya
-    {    199,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25709,136 , 134,24 , 0,48 , 25773,136 , 320,24 , 16246,23 , 16269,92 , 16361,14 , 16246,23 , 16269,92 , 16361,14 , 446,7 , 466,5 , {78,65,68},  12,2 , 7412,22 , 4,4 , 4,0 ,     2,     1,     1,     6,     7 }, // Nama/AnyScript/Namibia
-    {    200,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Machame/AnyScript/Tanzania
-    {    201,     0,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 228,8 , 228,8 , 1440,10 , 1450,23 , 37,5 , 8,10 , 25845,59 , 25904,87 , 134,24 , 25909,59 , 25968,87 , 320,24 , 16375,28 , 16403,72 , 3311,14 , 16375,28 , 16403,72 , 3311,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 ,     2,     1,     1,     6,     7 }, // Colognian/AnyScript/Germany
-    {    202,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {75,69,83},  2,3 , 7434,25 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Masai/AnyScript/Kenya
-    {    202,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {84,90,83},  290,3 , 7459,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Masai/AnyScript/Tanzania
-    {    203,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 16533,35 , 16568,65 , 16633,14 , 16533,35 , 16568,65 , 16633,14 , 462,6 , 477,6 , {85,71,88},  328,3 , 7335,26 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Soga/AnyScript/Uganda
-    {    204,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26174,48 , 13661,84 , 134,24 , 26238,48 , 13812,84 , 320,24 , 16647,21 , 16668,75 , 85,14 , 16647,21 , 16668,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7487,23 , 4,4 , 79,6 ,     2,     1,     6,     6,     7 }, // Luyia/AnyScript/Kenya
-    {    205,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26222,48 , 13661,84 , 134,24 , 26286,48 , 13812,84 , 320,24 , 16743,28 , 8849,60 , 15055,14 , 16743,28 , 8849,60 , 15055,14 , 468,9 , 483,8 , {84,90,83},  290,3 , 7510,28 , 25,5 , 4,0 ,     0,     0,     1,     6,     7 }, // Asu/AnyScript/Tanzania
-    {    206,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {75,69,83},  2,3 , 7538,27 , 4,4 , 13,6 ,     2,     1,     6,     6,     7 }, // Teso/AnyScript/Kenya
-    {    206,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {85,71,88},  328,3 , 7565,28 , 4,4 , 13,6 ,     0,     0,     1,     6,     7 }, // Teso/AnyScript/Uganda
-    {    207,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16882,28 , 16910,56 , 16966,14 , 16882,28 , 16910,56 , 16966,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Saho/AnyScript/Eritrea
-    {    208,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 16980,28 , 17008,53 , 17061,14 , 16980,28 , 17008,53 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/AnyScript/Mali
-    {    209,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Rwa/AnyScript/Tanzania
-    {    210,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26594,48 , 26642,186 , 26828,24 , 26658,48 , 26706,186 , 26892,24 , 17075,28 , 17103,69 , 17172,14 , 17075,28 , 17103,69 , 17172,14 , 492,2 , 503,2 , {75,69,83},  2,3 , 7616,23 , 0,4 , 4,0 ,     2,     1,     6,     6,     7 }, // Luo/AnyScript/Kenya
-    {    211,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 ,     0,     0,     1,     6,     7 }, // Chiga/AnyScript/Uganda
-    {    212,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/AnyScript/Morocco
-    {    212,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Latin/Morocco
-    {    213,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 17276,28 , 17304,54 , 17061,14 , 17276,28 , 17304,54 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/AnyScript/Mali
-    {    214,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 27010,84 , 134,24 , 13764,48 , 27074,84 , 320,24 , 17358,28 , 17386,63 , 8909,14 , 17358,28 , 17386,63 , 8909,14 , 503,5 , 515,8 , {84,90,83},  290,3 , 6241,27 , 0,4 , 4,0 ,     0,     0,     1,     6,     7 }, // Shambala/AnyScript/Tanzania
-    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 }  // trailing 0s
+    {      1,     0,     0,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , {0,0,0},  0,0 , 0,7 , 0,4 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // C/AnyScript/AnyCountry
+    {      3,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {69,84,66},  0,2 , 7,24 , 4,4 , 4,0 , 0,6 , 6,10 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Ethiopia
+    {      3,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 158,48 , 206,111 , 134,24 , 161,48 , 209,111 , 320,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 , 0,6 , 16,8 ,     2,     1,     6,     6,     7 }, // Afan/AnyScript/Kenya
+    {      4,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 365,129 , 494,24 , 344,48 , 392,129 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {68,74,70},  5,3 , 0,7 , 4,4 , 4,0 , 24,5 , 29,7 ,     0,     0,     6,     6,     7 }, // Afar/AnyScript/Djibouti
+    {      4,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 24,5 , 36,7 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Eritrea
+    {      4,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 196,28 , 224,52 , 276,14 , 196,28 , 224,52 , 276,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 , 24,5 , 43,7 ,     2,     1,     6,     6,     7 }, // Afar/AnyScript/Ethiopia
+    {      5,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 82,17 , 18,7 , 25,12 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {90,65,82},  11,1 , 31,27 , 4,4 , 4,0 , 50,9 , 59,11 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/SouthAfrica
+    {      5,     0,   148,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 72,10 , 99,16 , 37,5 , 8,10 , 636,48 , 684,92 , 134,24 , 663,48 , 711,92 , 320,24 , 290,21 , 311,58 , 369,14 , 290,21 , 311,58 , 369,14 , 4,3 , 4,3 , {78,65,68},  12,2 , 58,23 , 8,5 , 4,0 , 50,9 , 70,7 ,     2,     1,     1,     6,     7 }, // Afrikaans/AnyScript/Namibia
+    {      6,     0,     2,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 115,8 , 123,18 , 42,7 , 49,12 , 776,48 , 824,78 , 902,24 , 803,48 , 851,78 , 929,24 , 383,28 , 411,58 , 469,14 , 383,28 , 411,58 , 469,14 , 7,2 , 7,2 , {65,76,76},  14,3 , 0,7 , 4,4 , 4,0 , 77,6 , 83,9 ,     0,     0,     1,     6,     7 }, // Albanian/AnyScript/Albania
+    {      7,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 483,27 , 510,28 , 538,14 , 483,27 , 510,28 , 538,14 , 9,3 , 9,4 , {69,84,66},  17,2 , 81,16 , 4,4 , 13,6 , 92,4 , 96,5 ,     2,     1,     6,     6,     7 }, // Amharic/AnyScript/Ethiopia
+    {      8,     0,   186,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,65,82},  19,5 , 97,77 , 4,4 , 4,0 , 101,7 , 108,24 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/SaudiArabia
+    {      8,     0,     3,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {68,90,68},  24,5 , 174,91 , 8,5 , 19,6 , 101,7 , 132,7 ,     2,     1,     6,     4,     5 }, // Arabic/AnyScript/Algeria
+    {      8,     0,    17,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {66,72,68},  29,5 , 265,91 , 8,5 , 19,6 , 101,7 , 139,7 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Bahrain
+    {      8,     0,    64,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {69,71,80},  34,5 , 356,70 , 8,5 , 19,6 , 101,7 , 146,3 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Egypt
+    {      8,     0,   103,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {73,81,68},  39,5 , 426,84 , 8,5 , 19,6 , 101,7 , 149,6 ,     0,     0,     6,     5,     6 }, // Arabic/AnyScript/Iraq
+    {      8,     0,   109,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1157,92 , 1157,92 , 1133,24 , 1184,92 , 1184,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {74,79,68},  44,5 , 510,84 , 8,5 , 19,6 , 101,7 , 155,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Jordan
+    {      8,     0,   115,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {75,87,68},  49,5 , 594,84 , 8,5 , 19,6 , 101,7 , 161,6 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Kuwait
+    {      8,     0,   119,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {76,66,80},  54,5 , 678,84 , 8,5 , 19,6 , 101,7 , 167,5 ,     0,     0,     1,     6,     7 }, // Arabic/AnyScript/Lebanon
+    {      8,     0,   122,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {76,89,68},  59,5 , 762,77 , 8,5 , 19,6 , 101,7 , 172,5 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/LibyanArabJamahiriya
+    {      8,     0,   145,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {77,65,68},  64,5 , 839,77 , 8,5 , 19,6 , 101,7 , 177,6 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Morocco
+    {      8,     0,   162,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {79,77,82},  69,5 , 916,77 , 8,5 , 19,6 , 101,7 , 183,5 ,     3,     0,     6,     4,     5 }, // Arabic/AnyScript/Oman
+    {      8,     0,   175,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {81,65,82},  74,5 , 993,70 , 4,4 , 4,0 , 101,7 , 188,3 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Qatar
+    {      8,     0,   201,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {83,68,71},  0,0 , 1063,18 , 8,5 , 19,6 , 101,7 , 191,7 ,     2,     1,     6,     5,     6 }, // Arabic/AnyScript/Sudan
+    {      8,     0,   207,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1249,92 , 1249,92 , 1133,24 , 1276,92 , 1276,92 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {83,89,80},  79,5 , 1081,70 , 4,4 , 4,0 , 101,7 , 198,5 ,     0,     0,     7,     5,     6 }, // Arabic/AnyScript/SyrianArabRepublic
+    {      8,     0,   216,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 179,8 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {84,78,68},  84,5 , 1151,77 , 4,4 , 4,0 , 101,7 , 203,4 ,     3,     0,     6,     5,     6 }, // Arabic/AnyScript/Tunisia
+    {      8,     0,   223,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 670,38 , 604,52 , 656,14 , 670,38 , 604,52 , 656,14 , 12,1 , 13,1 , {65,69,68},  89,5 , 1228,91 , 8,5 , 19,6 , 101,7 , 207,24 ,     2,     1,     1,     5,     6 }, // Arabic/AnyScript/UnitedArabEmirates
+    {      8,     0,   237,  1643,  1644,  1563,  1642,  1632,    45,    43,   101,  8220,  8221,  8216,  8217, 14,6 , 14,6 , 20,8 , 28,7 , 151,10 , 161,18 , 18,7 , 61,12 , 1058,75 , 1058,75 , 1133,24 , 1085,75 , 1085,75 , 1160,24 , 552,52 , 604,52 , 656,14 , 552,52 , 604,52 , 656,14 , 12,1 , 13,1 , {89,69,82},  94,5 , 1319,70 , 4,4 , 4,0 , 101,7 , 231,5 ,     0,     0,     6,     4,     5 }, // Arabic/AnyScript/Yemen
+    {      9,     0,    11,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 187,8 , 35,18 , 37,5 , 8,10 , 1341,48 , 1389,94 , 1483,27 , 1368,48 , 1416,94 , 134,27 , 708,28 , 736,62 , 798,14 , 708,28 , 736,62 , 798,14 , 13,3 , 14,3 , {65,77,68},  99,3 , 0,7 , 25,5 , 4,0 , 236,7 , 243,24 ,     0,     0,     1,     6,     7 }, // Armenian/AnyScript/Armenia
+    {     10,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 195,8 , 203,18 , 73,8 , 81,12 , 1510,62 , 1572,88 , 1483,27 , 1510,62 , 1572,88 , 134,27 , 812,37 , 849,58 , 798,14 , 812,37 , 849,58 , 798,14 , 16,9 , 17,7 , {73,78,82},  102,3 , 0,7 , 8,5 , 4,0 , 267,6 , 273,4 ,     2,     1,     7,     7,     7 }, // Assamese/AnyScript/India
+    {     12,     0,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 , 277,12 , 289,10 ,     2,     1,     7,     6,     7 }, // Azerbaijani/AnyScript/Azerbaijan
+    {     12,     0,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 , 277,12 , 299,4 ,     0,     0,     6,     4,     5 }, // Azerbaijani/AnyScript/Iran
+    {     12,     1,   102,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 1430,27 , 8,5 , 4,0 , 277,12 , 299,4 ,     0,     0,     6,     4,     5 }, // Azerbaijani/Arabic/Iran
+    {     12,     2,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1785,77 , 1483,27 , 1660,48 , 1785,77 , 134,27 , 907,26 , 1000,67 , 99,14 , 907,26 , 1000,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  109,4 , 1457,29 , 8,5 , 4,0 , 303,10 , 303,10 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Cyrillic/Azerbaijan
+    {     12,     7,    15,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 229,19 , 37,5 , 8,10 , 1660,48 , 1708,77 , 1483,27 , 1660,48 , 1708,77 , 134,27 , 907,26 , 933,67 , 99,14 , 907,26 , 933,67 , 99,14 , 0,2 , 0,2 , {65,90,78},  105,4 , 1389,41 , 8,5 , 4,0 , 277,12 , 289,10 ,     2,     1,     7,     6,     7 }, // Azerbaijani/Latin/Azerbaijan
+    {     14,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 248,31 , 37,5 , 8,10 , 1862,48 , 1910,93 , 2003,24 , 1862,48 , 1910,93 , 2003,24 , 1067,21 , 1088,68 , 798,14 , 1067,21 , 1088,68 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 , 313,7 , 320,8 ,     2,     1,     1,     6,     7 }, // Basque/AnyScript/Spain
+    {     15,     0,    18,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {66,68,84},  114,1 , 1486,21 , 0,4 , 30,6 , 328,5 , 333,8 ,     2,     1,     1,     6,     7 }, // Bengali/AnyScript/Bangladesh
+    {     15,     0,   100,    46,    44,    59,    37,  2534,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 35,10 , 45,9 , 279,6 , 203,18 , 18,7 , 25,12 , 2027,90 , 2027,90 , 2117,33 , 2027,90 , 2027,90 , 2117,33 , 1156,37 , 1193,58 , 1251,18 , 1156,37 , 1193,58 , 1251,18 , 25,9 , 24,7 , {73,78,82},  115,4 , 1507,19 , 0,4 , 30,6 , 328,5 , 341,4 ,     2,     1,     7,     7,     7 }, // Bengali/AnyScript/India
+    {     16,     0,    25,    46,    44,    59,    37,    48,    45,    43,   101,    34,    34,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 285,29 , 93,22 , 115,35 , 2150,75 , 2225,205 , 1483,27 , 2150,75 , 2225,205 , 134,27 , 1269,34 , 1303,79 , 798,14 , 1269,34 , 1303,79 , 798,14 , 0,2 , 0,2 , {66,84,78},  119,3 , 1526,16 , 4,4 , 4,0 , 345,6 , 351,5 ,     2,     1,     1,     6,     7 }, // Bhutani/AnyScript/Bhutan
+    {     19,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 , 0,0 , 356,5 ,     2,     1,     1,     6,     7 }, // Breton/AnyScript/France
+    {     20,     0,    33,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 340,18 , 37,5 , 8,10 , 2430,59 , 2489,82 , 2571,24 , 2430,59 , 2489,82 , 2571,24 , 1382,21 , 1403,55 , 1458,14 , 1382,21 , 1403,55 , 1458,14 , 34,7 , 31,7 , {66,71,78},  122,3 , 1553,47 , 25,5 , 4,0 , 361,9 , 370,8 ,     2,     1,     1,     6,     7 }, // Bulgarian/AnyScript/Bulgaria
+    {     21,     0,   147,    46,    44,  4170,    37,  4160,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 2595,43 , 2638,88 , 2726,24 , 2595,43 , 2638,88 , 2726,24 , 1472,25 , 1497,54 , 1551,14 , 1472,25 , 1497,54 , 1551,14 , 0,2 , 0,2 , {77,77,75},  125,1 , 1600,18 , 8,5 , 4,0 , 378,3 , 381,6 ,     0,     0,     1,     6,     7 }, // Burmese/AnyScript/Myanmar
+    {     22,     0,    20,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 358,6 , 10,17 , 150,5 , 155,10 , 2750,48 , 2798,99 , 2897,24 , 2750,48 , 2798,95 , 2893,24 , 1565,21 , 1586,56 , 1642,14 , 1565,21 , 1586,56 , 1642,14 , 41,10 , 38,13 , {66,89,82},  0,0 , 1618,23 , 4,4 , 4,0 , 387,10 , 397,8 ,     0,     0,     1,     6,     7 }, // Byelorussian/AnyScript/Belarus
+    {     23,     0,    36,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 372,30 , 165,4 , 169,26 , 2921,27 , 2948,71 , 1483,27 , 2917,27 , 2944,71 , 134,27 , 1656,19 , 1675,76 , 798,14 , 1656,19 , 1675,76 , 798,14 , 51,5 , 51,5 , {75,72,82},  126,1 , 1641,11 , 0,4 , 4,0 , 405,9 , 414,7 ,     2,     1,     1,     6,     7 }, // Cambodian/AnyScript/Cambodia
+    {     24,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 27,8 , 402,21 , 165,4 , 195,9 , 3019,60 , 3079,82 , 3161,24 , 3015,93 , 3108,115 , 3223,24 , 1751,21 , 1772,60 , 1832,14 , 1846,28 , 1874,60 , 1934,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 421,6 , 427,7 ,     2,     1,     1,     6,     7 }, // Catalan/AnyScript/Spain
+    {     25,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 , 434,2 , 436,2 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/China
+    {     25,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 , 434,2 , 438,14 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/HongKong
+    {     25,     0,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 , 434,2 , 452,14 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Macau
+    {     25,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 , 434,2 , 466,3 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Singapore
+    {     25,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 , 434,2 , 469,2 ,     2,     1,     7,     6,     7 }, // Chinese/AnyScript/Taiwan
+    {     25,     5,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {67,78,89},  127,1 , 1672,10 , 4,4 , 4,0 , 471,6 , 436,2 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/China
+    {     25,     5,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 4,0 , 471,6 , 477,9 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/HongKong
+    {     25,     5,   126,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 423,6 , 429,13 , 204,6 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1722,10 , 4,4 , 4,0 , 471,6 , 486,9 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Macau
+    {     25,     5,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 68,5 , 68,5 , 73,5 , 73,5 , 27,8 , 429,13 , 232,7 , 210,11 , 3185,38 , 3185,38 , 3223,39 , 3247,39 , 3247,39 , 3247,39 , 1948,21 , 1969,28 , 1997,14 , 1948,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {83,71,68},  133,2 , 1701,11 , 4,4 , 4,0 , 471,6 , 466,3 ,     2,     1,     7,     6,     7 }, // Chinese/Simplified Han/Singapore
+    {     25,     6,    97,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {72,75,68},  128,1 , 1682,9 , 4,4 , 13,6 , 495,4 , 438,14 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/HongKong
+    {     25,     6,   126,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 442,7 , 449,15 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {77,79,80},  129,4 , 1691,10 , 4,4 , 4,0 , 495,4 , 452,14 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Macau
+    {     25,     6,   208,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 73,5 , 73,5 , 464,6 , 429,13 , 204,6 , 221,11 , 3185,38 , 3185,38 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 2011,21 , 1969,28 , 1997,14 , 2011,21 , 1969,28 , 1997,14 , 60,2 , 60,2 , {84,87,68},  135,3 , 1712,10 , 4,4 , 4,0 , 495,4 , 469,2 ,     2,     1,     7,     6,     7 }, // Chinese/Traditional Han/Taiwan
+    {     27,     0,    54,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 470,13 , 483,19 , 37,5 , 8,10 , 3262,49 , 3311,94 , 3405,39 , 3286,49 , 3335,98 , 3433,39 , 2032,28 , 2060,58 , 2118,14 , 2032,28 , 2060,58 , 2118,14 , 0,2 , 0,2 , {72,82,75},  138,2 , 1732,27 , 25,5 , 4,0 , 499,8 , 507,8 ,     2,     1,     1,     6,     7 }, // Croatian/AnyScript/Croatia
+    {     28,     0,    57,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 78,7 , 78,7 , 358,6 , 502,18 , 165,4 , 195,9 , 3405,39 , 3444,82 , 3526,24 , 134,27 , 3472,84 , 3556,24 , 2132,21 , 2153,49 , 2202,14 , 2132,21 , 2153,49 , 2202,14 , 62,4 , 62,4 , {67,90,75},  140,2 , 1759,19 , 25,5 , 4,0 , 515,7 , 522,15 ,     2,     1,     1,     6,     7 }, // Czech/AnyScript/CzechRepublic
+    {     29,     0,    58,    44,    46,    44,    37,    48,    45,    43,   101,  8221,  8221,  8221,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 27,8 , 520,23 , 150,5 , 155,10 , 3550,48 , 3598,84 , 134,24 , 3580,59 , 3639,84 , 320,24 , 2216,28 , 2244,51 , 2295,14 , 2216,28 , 2244,51 , 2295,14 , 66,4 , 66,4 , {68,75,75},  142,2 , 1778,42 , 25,5 , 4,0 , 537,5 , 542,7 ,     2,     1,     1,     6,     7 }, // Danish/AnyScript/Denmark
+    {     30,     0,   151,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 543,8 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 8,5 , 19,6 , 549,10 , 559,9 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Netherlands
+    {     30,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 6,8 , 6,8 , 551,7 , 99,16 , 37,5 , 8,10 , 3682,48 , 3730,88 , 134,24 , 3723,59 , 3782,88 , 320,24 , 2309,21 , 2330,59 , 2389,14 , 2309,21 , 2330,59 , 2389,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1820,19 , 25,5 , 4,0 , 568,6 , 574,6 ,     2,     1,     1,     6,     7 }, // Dutch/AnyScript/Belgium
+    {     31,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 580,12 , 592,13 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStates
+    {     31,     0,     4,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 612,14 ,     2,     1,     7,     6,     7 }, // English/AnyScript/AmericanSamoa
+    {     31,     0,    13,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {65,85,68},  128,1 , 1874,59 , 4,4 , 4,0 , 626,18 , 644,9 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Australia
+    {     31,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 37,5 , 239,24 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 , 605,7 , 653,7 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belgium
+    {     31,     0,    22,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 564,12 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,90,68},  128,1 , 1953,47 , 4,4 , 4,0 , 605,7 , 660,6 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Belize
+    {     31,     0,    28,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {66,87,80},  144,1 , 2000,50 , 4,4 , 4,0 , 605,7 , 666,8 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Botswana
+    {     31,     0,    38,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 115,8 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2050,53 , 4,4 , 13,6 , 674,16 , 690,6 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Canada
+    {     31,     0,    89,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 696,4 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Guam
+    {     31,     0,    97,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 203,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {72,75,68},  128,1 , 2103,56 , 4,4 , 13,6 , 605,7 , 700,19 ,     2,     1,     7,     6,     7 }, // English/AnyScript/HongKong
+    {     31,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 2159,44 , 8,5 , 4,0 , 605,7 , 719,5 ,     2,     1,     7,     7,     7 }, // English/AnyScript/India
+    {     31,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 99,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 , 605,7 , 724,7 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Ireland
+    {     31,     0,   107,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {74,77,68},  128,1 , 2203,53 , 4,4 , 4,0 , 605,7 , 731,7 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Jamaica
+    {     31,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 4,4 , 4,0 , 605,7 , 738,5 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Malta
+    {     31,     0,   134,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 743,16 ,     2,     1,     7,     6,     7 }, // English/AnyScript/MarshallIslands
+    {     31,     0,   137,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 2256,53 , 4,4 , 13,6 , 605,7 , 759,9 ,     0,     0,     1,     6,     7 }, // English/AnyScript/Mauritius
+    {     31,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,65,68},  128,1 , 2309,53 , 4,4 , 4,0 , 605,7 , 768,7 ,     2,     1,     1,     6,     7 }, // English/AnyScript/Namibia
+    {     31,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 551,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {78,90,68},  128,1 , 2362,62 , 4,4 , 4,0 , 605,7 , 775,11 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NewZealand
+    {     31,     0,   160,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 786,24 ,     2,     1,     7,     6,     7 }, // English/AnyScript/NorthernMarianaIslands
+    {     31,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 27,8 , 99,16 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,75,82},  151,1 , 2424,53 , 8,5 , 4,0 , 605,7 , 810,8 ,     0,     0,     7,     6,     7 }, // English/AnyScript/Pakistan
+    {     31,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 2477,42 , 4,4 , 13,6 , 605,7 , 818,11 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Philippines
+    {     31,     0,   190,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 279,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {83,71,68},  128,1 , 2519,56 , 4,4 , 13,6 , 605,7 , 829,9 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Singapore
+    {     31,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 576,10 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 2575,61 , 4,4 , 4,0 , 605,7 , 838,12 ,     2,     1,     1,     6,     7 }, // English/AnyScript/SouthAfrica
+    {     31,     0,   215,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {84,84,68},  128,1 , 2636,86 , 4,4 , 4,0 , 605,7 , 850,19 ,     2,     1,     7,     6,     7 }, // English/AnyScript/TrinidadAndTobago
+    {     31,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 93,10 , 103,9 , 141,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 2722,74 , 4,4 , 4,0 , 869,15 , 884,14 ,     2,     1,     1,     6,     7 }, // English/AnyScript/UnitedKingdom
+    {     31,     0,   226,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 898,27 ,     2,     1,     7,     6,     7 }, // English/AnyScript/UnitedStatesMinorOutlyingIslands
+    {     31,     0,   234,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 605,7 , 925,19 ,     2,     1,     7,     6,     7 }, // English/AnyScript/USVirginIslands
+    {     31,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 364,8 , 82,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 320,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , {85,83,68},  128,1 , 1839,35 , 4,4 , 4,0 , 605,7 , 944,8 ,     2,     1,     7,     6,     7 }, // English/AnyScript/Zimbabwe
+    {     31,     3,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 93,10 , 103,9 , 558,6 , 35,18 , 18,7 , 25,12 , 3818,80 , 3898,154 , 4052,36 , 3870,80 , 3950,154 , 4104,36 , 2403,49 , 2452,85 , 2537,21 , 2403,49 , 2452,85 , 2537,21 , 70,4 , 70,4 , {85,83,68},  128,1 , 1839,35 , 4,4 , 13,6 , 580,12 , 952,25 ,     2,     1,     7,     6,     7 }, // English/Deseret/UnitedStates
+    {     33,     0,    68,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 112,8 , 112,8 , 332,8 , 502,18 , 165,4 , 263,9 , 4088,59 , 4147,91 , 4238,24 , 4140,59 , 4199,91 , 4290,24 , 2558,14 , 2572,63 , 2558,14 , 2558,14 , 2572,63 , 2558,14 , 74,14 , 74,16 , {69,69,75},  142,2 , 2796,41 , 25,5 , 4,0 , 977,5 , 982,5 ,     2,     1,     1,     6,     7 }, // Estonian/AnyScript/Estonia
+    {     34,     0,    71,    44,    46,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 543,8 , 82,17 , 37,5 , 8,10 , 4262,48 , 4310,83 , 134,24 , 4314,48 , 4362,83 , 320,24 , 2635,28 , 2663,74 , 2737,14 , 2635,28 , 2663,74 , 2737,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 2837,42 , 4,4 , 36,5 , 987,8 , 995,7 ,     2,     1,     7,     6,     7 }, // Faroese/AnyScript/FaroeIslands
+    {     36,     0,    73,    44,   160,    59,    37,    48,    45,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 586,8 , 594,17 , 272,4 , 276,9 , 4393,69 , 4462,105 , 4567,24 , 4445,129 , 4445,129 , 4574,24 , 2751,21 , 2772,67 , 2839,14 , 2751,21 , 2853,81 , 2839,14 , 88,3 , 90,3 , {69,85,82},  113,1 , 2879,20 , 25,5 , 4,0 , 1002,5 , 1007,5 ,     2,     1,     1,     6,     7 }, // Finnish/AnyScript/Finland
+    {     37,     0,    74,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1020,6 ,     2,     1,     1,     6,     7 }, // French/AnyScript/France
+    {     37,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 551,7 , 99,16 , 37,5 , 285,23 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1026,8 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Belgium
+    {     37,     0,    37,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 , 1012,8 , 1034,8 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Cameroon
+    {     37,     0,    38,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 115,8 , 99,16 , 37,5 , 239,24 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,65,68},  128,1 , 2955,54 , 25,5 , 41,7 , 1042,17 , 690,6 ,     2,     1,     7,     6,     7 }, // French/AnyScript/Canada
+    {     37,     0,    41,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,65,70},  154,3 , 2899,56 , 25,5 , 4,0 , 1012,8 , 1059,25 ,     0,     0,     1,     6,     7 }, // French/AnyScript/CentralAfricanRepublic
+    {     37,     0,    53,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 , 1012,8 , 1084,13 ,     0,     0,     1,     6,     7 }, // French/AnyScript/IvoryCoast
+    {     37,     0,    88,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1097,10 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Guadeloupe
+    {     37,     0,    91,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {71,78,70},  160,3 , 3068,48 , 25,5 , 4,0 , 1012,8 , 1107,6 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Guinea
+    {     37,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1113,10 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Luxembourg
+    {     37,     0,   128,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3116,54 , 25,5 , 4,0 , 1012,8 , 1123,10 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Madagascar
+    {     37,     0,   132,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 , 1012,8 , 1133,4 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Mali
+    {     37,     0,   135,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1137,10 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Martinique
+    {     37,     0,   142,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1147,6 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Monaco
+    {     37,     0,   156,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 , 1012,8 , 1153,5 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Niger
+    {     37,     0,   176,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1158,7 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Reunion
+    {     37,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3009,59 , 25,5 , 4,0 , 1012,8 , 1165,7 ,     0,     0,     1,     6,     7 }, // French/AnyScript/Senegal
+    {     37,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 120,8 , 120,8 , 332,8 , 10,17 , 37,5 , 308,14 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {67,72,70},  163,3 , 3170,45 , 8,5 , 48,5 , 1172,15 , 1187,6 ,     2,     5,     1,     6,     7 }, // French/AnyScript/Switzerland
+    {     37,     0,   244,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1193,16 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Barthelemy
+    {     37,     0,   245,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 120,8 , 120,8 , 27,8 , 99,16 , 37,5 , 8,10 , 4591,63 , 4654,85 , 134,24 , 4598,63 , 4661,85 , 320,24 , 2934,35 , 2969,52 , 3021,14 , 2934,35 , 2969,52 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1652,20 , 25,5 , 4,0 , 1012,8 , 1209,12 ,     2,     1,     1,     6,     7 }, // French/AnyScript/Saint Martin
+    {     40,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 4739,48 , 4787,87 , 4874,24 , 4746,48 , 4794,87 , 4881,24 , 3035,28 , 3063,49 , 3112,14 , 3035,28 , 3063,49 , 3112,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 , 1221,6 , 1227,6 ,     2,     1,     1,     6,     7 }, // Galician/AnyScript/Spain
+    {     41,     0,    81,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 4898,48 , 4946,99 , 5045,24 , 4905,48 , 4953,99 , 5052,24 , 3126,28 , 3154,62 , 3216,14 , 3126,28 , 3154,62 , 3216,14 , 0,2 , 0,2 , {71,69,76},  0,0 , 3215,19 , 8,5 , 4,0 , 1233,7 , 1240,10 ,     2,     1,     7,     6,     7 }, // Georgian/AnyScript/Georgia
+    {     42,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 , 1250,7 , 1257,11 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Germany
+    {     42,     0,    14,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 611,19 , 37,5 , 8,10 , 5069,52 , 5204,83 , 134,24 , 5207,48 , 5255,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 8,5 , 4,0 , 1268,24 , 1292,10 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Austria
+    {     42,     0,    21,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 551,7 , 99,16 , 37,5 , 239,24 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3353,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 , 1250,7 , 1302,7 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Belgium
+    {     42,     0,   123,    46,    39,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 4,0 , 1250,7 , 1309,13 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Liechtenstein
+    {     42,     0,   125,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {69,85,82},  113,1 , 3234,19 , 25,5 , 4,0 , 1250,7 , 1322,9 ,     2,     1,     1,     6,     7 }, // German/AnyScript/Luxembourg
+    {     42,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 5069,52 , 5121,83 , 134,24 , 5076,48 , 5124,83 , 320,24 , 3230,21 , 3251,60 , 3311,14 , 3325,28 , 3251,60 , 3311,14 , 91,5 , 93,6 , {67,72,70},  0,0 , 3253,41 , 8,5 , 48,5 , 1331,21 , 1352,7 ,     2,     5,     1,     6,     7 }, // German/AnyScript/Switzerland
+    {     43,     0,    85,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 25,5 , 4,0 , 1359,8 , 1367,6 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Greece
+    {     43,     0,    56,    44,    46,    44,    37,    48,    45,    43,   101,   171,   187,  8216,  8217, 0,6 , 0,6 , 137,9 , 137,9 , 279,6 , 10,17 , 18,7 , 25,12 , 5287,50 , 5337,115 , 5452,24 , 5338,50 , 5388,115 , 5503,24 , 3381,28 , 3409,55 , 3464,14 , 3381,28 , 3409,55 , 3464,14 , 96,4 , 99,4 , {69,85,82},  113,1 , 3294,19 , 4,4 , 4,0 , 1359,8 , 1373,6 ,     2,     1,     1,     6,     7 }, // Greek/AnyScript/Cyprus
+    {     44,     0,    86,    44,    46,    59,    37,    48,  8722,    43,   101,   187,   171,  8250,  8249, 146,11 , 0,6 , 0,6 , 146,11 , 72,10 , 82,17 , 18,7 , 25,12 , 3550,48 , 5476,96 , 134,24 , 5527,48 , 5575,96 , 320,24 , 3478,28 , 3506,98 , 3604,14 , 3478,28 , 3506,98 , 3604,14 , 0,2 , 0,2 , {68,75,75},  142,2 , 3313,24 , 4,4 , 36,5 , 1379,11 , 1390,16 ,     2,     1,     7,     6,     7 }, // Greenlandic/AnyScript/Greenland
+    {     46,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 157,9 , 157,9 , 630,7 , 203,18 , 322,8 , 330,13 , 5572,67 , 5639,87 , 5726,31 , 5671,67 , 5738,87 , 5825,31 , 3618,32 , 3650,53 , 3703,19 , 3618,32 , 3650,53 , 3703,19 , 100,14 , 103,14 , {73,78,82},  166,2 , 0,7 , 8,5 , 4,0 , 1406,7 , 1413,4 ,     2,     1,     7,     7,     7 }, // Gujarati/AnyScript/India
+    {     47,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 , 1417,5 , 1422,4 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Ghana
+    {     47,     0,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 , 1417,5 , 1426,5 ,     0,     0,     1,     6,     7 }, // Hausa/AnyScript/Niger
+    {     47,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 , 1417,5 , 1431,8 ,     2,     1,     1,     6,     7 }, // Hausa/AnyScript/Nigeria
+    {     47,     0,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 , 1417,5 , 1439,5 ,     2,     1,     6,     5,     6 }, // Hausa/AnyScript/Sudan
+    {     47,     1,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3405,13 , 8,5 , 4,0 , 1417,5 , 1431,8 ,     2,     1,     1,     6,     7 }, // Hausa/Arabic/Nigeria
+    {     47,     1,   201,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5914,55 , 5969,99 , 5890,24 , 6013,55 , 6068,99 , 5989,24 , 3809,31 , 3840,57 , 3795,14 , 3809,31 , 3840,57 , 3795,14 , 0,2 , 0,2 , {83,68,71},  0,0 , 3385,20 , 8,5 , 4,0 , 1417,5 , 1439,5 ,     2,     1,     6,     5,     6 }, // Hausa/Arabic/Sudan
+    {     47,     7,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 , 1417,5 , 1422,4 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Ghana
+    {     47,     7,   156,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 3337,36 , 8,5 , 4,0 , 1417,5 , 1426,5 ,     0,     0,     1,     6,     7 }, // Hausa/Latin/Niger
+    {     47,     7,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 203,18 , 37,5 , 8,10 , 5757,48 , 5805,85 , 5890,24 , 5856,48 , 5904,85 , 5989,24 , 3722,21 , 3743,52 , 3795,14 , 3722,21 , 3743,52 , 3795,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 3373,12 , 8,5 , 4,0 , 1417,5 , 1431,8 ,     2,     1,     1,     6,     7 }, // Hausa/Latin/Nigeria
+    {     48,     0,   105,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 637,18 , 37,5 , 8,10 , 6068,58 , 6126,72 , 1483,27 , 6167,48 , 6215,72 , 134,27 , 3897,46 , 3943,65 , 4008,14 , 3897,46 , 3943,65 , 4008,14 , 114,6 , 117,5 , {73,76,83},  172,1 , 3418,21 , 25,5 , 4,0 , 1444,5 , 1449,5 ,     2,     1,     7,     5,     6 }, // Hebrew/AnyScript/Israel
+    {     49,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 166,8 , 166,8 , 655,6 , 10,17 , 18,7 , 25,12 , 6198,75 , 6198,75 , 6273,30 , 6287,75 , 6287,75 , 6362,30 , 4022,38 , 4060,57 , 4117,19 , 4022,38 , 4060,57 , 4117,19 , 120,9 , 122,7 , {73,78,82},  173,3 , 3439,19 , 8,5 , 4,0 , 1454,6 , 1460,4 ,     2,     1,     7,     7,     7 }, // Hindi/AnyScript/India
+    {     50,     0,    98,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,  8222,  8221, 0,6 , 0,6 , 174,8 , 174,8 , 661,11 , 672,19 , 165,4 , 195,9 , 6303,64 , 6367,98 , 6465,25 , 6392,64 , 6456,98 , 6554,25 , 4136,19 , 4155,52 , 4207,17 , 4136,19 , 4155,52 , 4207,17 , 129,3 , 129,3 , {72,85,70},  176,2 , 3458,20 , 25,5 , 4,0 , 1464,6 , 1470,12 ,     0,     0,     1,     6,     7 }, // Hungarian/AnyScript/Hungary
+    {     51,     0,    99,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 85,8 , 85,8 , 586,8 , 502,18 , 37,5 , 8,10 , 6490,48 , 6538,82 , 6620,24 , 6579,48 , 6627,82 , 6709,24 , 4224,28 , 4252,81 , 4333,14 , 4224,28 , 4252,81 , 4347,14 , 132,4 , 132,4 , {73,83,75},  142,2 , 3478,48 , 25,5 , 4,0 , 1482,8 , 1490,6 ,     0,     0,     7,     6,     7 }, // Icelandic/AnyScript/Iceland
+    {     52,     0,   101,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 182,11 , 193,9 , 27,8 , 123,18 , 150,5 , 276,9 , 6644,48 , 6692,87 , 134,24 , 6733,48 , 6781,87 , 320,24 , 4361,28 , 4389,43 , 4432,14 , 4361,28 , 4389,43 , 4432,14 , 0,2 , 0,2 , {73,68,82},  178,2 , 3526,23 , 4,4 , 4,0 , 1496,16 , 1512,9 ,     0,     0,     1,     6,     7 }, // Indonesian/AnyScript/Indonesia
+    {     57,     0,   104,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 6779,62 , 6841,107 , 6948,24 , 6868,62 , 6930,107 , 7037,24 , 4446,37 , 4483,75 , 4558,14 , 4446,37 , 4483,75 , 4558,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 3549,11 , 4,4 , 4,0 , 1521,7 , 1528,4 ,     2,     1,     7,     6,     7 }, // Irish/AnyScript/Ireland
+    {     58,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 99,16 , 37,5 , 8,10 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 , 1532,8 , 1540,6 ,     2,     1,     1,     6,     7 }, // Italian/AnyScript/Italy
+    {     58,     0,   206,    46,    39,    59,    37,    48,    45,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 202,8 , 210,7 , 332,8 , 10,17 , 37,5 , 308,14 , 6972,48 , 7020,94 , 7114,24 , 7061,48 , 7109,94 , 7203,24 , 4572,28 , 4600,57 , 4657,14 , 4572,28 , 4671,57 , 4657,14 , 136,2 , 136,2 , {67,72,70},  0,0 , 3560,22 , 8,5 , 48,5 , 1532,8 , 1546,8 ,     2,     5,     1,     6,     7 }, // Italian/AnyScript/Switzerland
+    {     59,     0,   108,    46,    44,    59,    37,    48,    45,    43,   101, 12300, 12301, 12302, 12303, 68,5 , 68,5 , 68,5 , 68,5 , 221,8 , 429,13 , 165,4 , 343,10 , 3223,39 , 3223,39 , 1483,27 , 3247,39 , 3247,39 , 134,27 , 4728,14 , 4742,28 , 4728,14 , 4728,14 , 4742,28 , 4728,14 , 138,2 , 138,2 , {74,80,89},  127,1 , 3582,10 , 4,4 , 4,0 , 1554,3 , 1557,2 ,     0,     0,     7,     6,     7 }, // Japanese/AnyScript/Japan
+    {     61,     0,   100,    46,    44,    59,    37,  3302,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 217,11 , 217,11 , 655,6 , 99,16 , 322,8 , 330,13 , 7138,86 , 7138,86 , 7224,31 , 7227,86 , 7227,86 , 7313,31 , 4770,28 , 4798,53 , 4851,19 , 4770,28 , 4798,53 , 4851,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 , 1559,5 , 1564,4 ,     2,     1,     7,     7,     7 }, // Kannada/AnyScript/India
+    {     63,     0,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 , 1568,5 , 1573,9 ,     2,     1,     1,     6,     7 }, // Kazakh/AnyScript/Kazakhstan
+    {     63,     2,   110,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 691,22 , 37,5 , 8,10 , 7255,61 , 7316,83 , 1483,27 , 7344,61 , 7405,83 , 134,27 , 4870,28 , 4898,54 , 798,14 , 4870,28 , 4898,54 , 798,14 , 0,2 , 0,2 , {75,90,84},  182,4 , 0,7 , 25,5 , 4,0 , 1568,5 , 1573,9 ,     2,     1,     1,     6,     7 }, // Kazakh/Cyrillic/Kazakhstan
+    {     64,     0,   179,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 7399,60 , 7459,101 , 1483,27 , 7488,60 , 7548,101 , 134,27 , 4952,35 , 4987,84 , 798,14 , 4952,35 , 4987,84 , 798,14 , 0,2 , 0,2 , {82,87,70},  186,2 , 0,7 , 8,5 , 4,0 , 1582,11 , 1593,6 ,     0,     0,     1,     6,     7 }, // Kinyarwanda/AnyScript/Rwanda
+    {     65,     0,   116,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {75,71,83},  188,3 , 0,7 , 8,5 , 4,0 , 1599,6 , 1605,10 ,     2,     1,     7,     6,     7 }, // Kirghiz/AnyScript/Kyrgyzstan
+    {     66,     0,   114,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 713,9 , 722,16 , 353,7 , 360,13 , 7560,39 , 7560,39 , 7560,39 , 7649,39 , 7649,39 , 7649,39 , 5071,14 , 5085,28 , 5071,14 , 5071,14 , 5085,28 , 5071,14 , 142,2 , 142,2 , {75,82,87},  191,1 , 3592,13 , 4,4 , 4,0 , 1615,3 , 1618,4 ,     0,     0,     7,     6,     7 }, // Korean/AnyScript/RepublicOfKorea
+    {     67,     0,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 , 1622,5 , 0,0 ,     0,     0,     6,     4,     5 }, // Kurdish/AnyScript/Iran
+    {     67,     0,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 , 1622,5 , 1627,5 ,     0,     0,     6,     5,     6 }, // Kurdish/AnyScript/Iraq
+    {     67,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 , 1632,5 , 0,0 ,     0,     0,     7,     5,     6 }, // Kurdish/AnyScript/SyrianArabRepublic
+    {     67,     0,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 , 1632,5 , 1637,7 ,     2,     1,     1,     6,     7 }, // Kurdish/AnyScript/Turkey
+    {     67,     1,   102,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,82,82},  0,0 , 0,7 , 8,5 , 4,0 , 1622,5 , 0,0 ,     0,     0,     6,     4,     5 }, // Kurdish/Arabic/Iran
+    {     67,     1,   103,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 5113,42 , 5113,42 , 5155,14 , 5113,42 , 5113,42 , 5155,14 , 0,2 , 0,2 , {73,81,68},  0,0 , 0,7 , 8,5 , 4,0 , 1622,5 , 1627,5 ,     0,     0,     6,     5,     6 }, // Kurdish/Arabic/Iraq
+    {     67,     7,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {83,89,80},  192,3 , 0,7 , 8,5 , 4,0 , 1632,5 , 0,0 ,     0,     0,     7,     5,     6 }, // Kurdish/Latin/SyrianArabRepublic
+    {     67,     7,   217,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 7599,41 , 7640,51 , 7691,27 , 7688,41 , 7729,51 , 7780,27 , 5169,20 , 5189,39 , 5228,14 , 5169,20 , 5189,39 , 5228,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 0,7 , 8,5 , 4,0 , 1632,5 , 1637,7 ,     2,     1,     1,     6,     7 }, // Kurdish/Latin/Turkey
+    {     69,     0,   117,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 738,18 , 165,4 , 373,21 , 7718,63 , 7781,75 , 1483,27 , 7807,63 , 7870,75 , 134,27 , 5242,24 , 5266,57 , 798,14 , 5242,24 , 5266,57 , 798,14 , 0,2 , 0,2 , {76,65,75},  197,1 , 3605,10 , 4,4 , 48,5 , 1644,3 , 1644,3 ,     0,     0,     7,     6,     7 }, // Laothian/AnyScript/Lao
+    {     71,     0,   118,    44,   160,    59,    37,    48,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 228,8 , 228,8 , 332,8 , 756,26 , 37,5 , 8,10 , 7856,65 , 7921,101 , 134,24 , 7945,65 , 8010,101 , 320,24 , 5323,21 , 5344,72 , 5416,14 , 5323,21 , 5344,72 , 5416,14 , 144,14 , 144,11 , {76,86,76},  198,2 , 3615,20 , 25,5 , 4,0 , 1647,8 , 1655,7 ,     2,     1,     1,     6,     7 }, // Latvian/AnyScript/Latvia
+    {     72,     0,    49,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {67,68,70},  200,1 , 3635,22 , 8,5 , 4,0 , 1662,7 , 1669,13 ,     2,     1,     1,     6,     7 }, // Lingala/AnyScript/DemocraticRepublicOfCongo
+    {     72,     0,    50,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 8022,39 , 8061,203 , 1483,27 , 8111,39 , 8150,203 , 134,27 , 5430,23 , 5453,98 , 798,14 , 5430,23 , 5453,98 , 798,14 , 0,2 , 0,2 , {88,65,70},  201,4 , 0,7 , 8,5 , 4,0 , 1662,7 , 1682,17 ,     0,     0,     1,     6,     7 }, // Lingala/AnyScript/PeoplesRepublicOfCongo
+    {     73,     0,   124,    44,    46,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8222,  8220, 0,6 , 0,6 , 236,8 , 236,8 , 72,10 , 782,26 , 37,5 , 8,10 , 8264,69 , 8333,96 , 8429,24 , 8353,48 , 8401,96 , 8497,24 , 5551,17 , 5568,89 , 5657,14 , 5671,21 , 5568,89 , 5657,14 , 158,9 , 155,6 , {76,84,76},  205,2 , 3657,54 , 25,5 , 4,0 , 1699,8 , 1707,7 ,     2,     1,     1,     6,     7 }, // Lithuanian/AnyScript/Lithuania
+    {     74,     0,   127,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 808,7 , 123,18 , 37,5 , 8,10 , 8453,63 , 8516,85 , 8601,24 , 8521,63 , 8584,85 , 8669,24 , 5692,34 , 5726,54 , 1458,14 , 5692,34 , 5726,54 , 1458,14 , 167,10 , 161,8 , {77,75,68},  0,0 , 3711,23 , 8,5 , 4,0 , 1714,10 , 1724,10 ,     2,     1,     1,     6,     7 }, // Macedonian/AnyScript/Macedonia
+    {     75,     0,   128,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 8625,48 , 8673,92 , 134,24 , 8693,48 , 8741,92 , 320,24 , 5780,34 , 5814,60 , 5874,14 , 5780,34 , 5814,60 , 5874,14 , 0,2 , 0,2 , {77,71,65},  0,0 , 3734,13 , 4,4 , 4,0 , 1734,8 , 1742,12 ,     0,     0,     1,     6,     7 }, // Malagasy/AnyScript/Madagascar
+    {     76,     0,   130,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 815,16 , 394,4 , 25,12 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {77,89,82},  207,2 , 3747,23 , 4,4 , 13,6 , 1754,13 , 1767,8 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/Malaysia
+    {     76,     0,    32,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 564,12 , 165,4 , 398,14 , 8765,49 , 8814,82 , 1483,27 , 8833,49 , 8882,82 , 134,27 , 5888,28 , 5916,43 , 798,14 , 5888,28 , 5916,43 , 798,14 , 0,2 , 0,2 , {66,78,68},  128,1 , 0,7 , 8,5 , 4,0 , 1754,13 , 1775,6 ,     2,     1,     1,     6,     7 }, // Malay/AnyScript/BruneiDarussalam
+    {     77,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 244,12 , 244,12 , 27,8 , 831,18 , 18,7 , 25,12 , 8896,66 , 8962,101 , 9063,31 , 8964,66 , 9030,101 , 9131,31 , 5959,47 , 6006,70 , 6076,22 , 5959,47 , 6006,70 , 6076,22 , 177,6 , 169,10 , {73,78,82},  209,2 , 3770,46 , 0,4 , 4,0 , 1781,6 , 1787,6 ,     2,     1,     7,     7,     7 }, // Malayalam/AnyScript/India
+    {     78,     0,   133,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 849,23 , 37,5 , 8,10 , 9094,48 , 9142,86 , 9228,24 , 9162,48 , 9210,86 , 9296,24 , 6098,28 , 6126,63 , 6189,14 , 6098,28 , 6126,63 , 6189,14 , 183,2 , 179,2 , {69,85,82},  113,1 , 3816,11 , 4,4 , 4,0 , 1793,5 , 738,5 ,     2,     1,     7,     6,     7 }, // Maltese/AnyScript/Malta
+    {     79,     0,   154,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9252,83 , 9252,83 , 1483,27 , 9320,83 , 9320,83 , 134,27 , 6203,48 , 6203,48 , 798,14 , 6203,48 , 6203,48 , 798,14 , 0,2 , 0,2 , {78,90,68},  211,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     7,     6,     7 }, // Maori/AnyScript/NewZealand
+    {     80,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 256,11 , 267,9 , 655,6 , 99,16 , 412,7 , 419,12 , 9335,86 , 9335,86 , 9421,32 , 9403,86 , 9403,86 , 9489,32 , 6251,32 , 6283,53 , 4117,19 , 6251,32 , 6283,53 , 4117,19 , 140,2 , 140,2 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 , 1798,5 , 1460,4 ,     2,     1,     7,     7,     7 }, // Marathi/AnyScript/India
+    {     82,     0,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 , 1803,6 , 1809,10 ,     0,     0,     7,     6,     7 }, // Mongolian/AnyScript/Mongolia
+    {     82,     0,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 , 1803,6 , 0,0 ,     2,     1,     7,     6,     7 }, // Mongolian/AnyScript/China
+    {     82,     2,   143,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {77,78,84},  214,1 , 0,7 , 8,5 , 4,0 , 1803,6 , 1809,10 ,     0,     0,     7,     6,     7 }, // Mongolian/Cyrillic/Mongolia
+    {     82,     8,    44,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9453,48 , 9501,66 , 1483,27 , 9521,48 , 9569,66 , 134,27 , 6336,21 , 6357,43 , 798,14 , 6336,21 , 6357,43 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 , 1803,6 , 0,0 ,     2,     1,     7,     6,     7 }, // Mongolian/Mongolian/China
+    {     84,     0,   150,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9623,85 , 9708,27 , 9635,56 , 9691,85 , 9776,27 , 6400,33 , 6433,54 , 6487,14 , 6400,33 , 6433,54 , 6487,14 , 185,14 , 181,14 , {78,80,82},  218,4 , 0,7 , 8,5 , 4,0 , 1819,6 , 1825,5 ,     2,     1,     1,     6,     7 }, // Nepali/AnyScript/Nepal
+    {     84,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9567,56 , 9735,80 , 9708,27 , 9635,56 , 9803,80 , 9776,27 , 6400,33 , 6501,54 , 6487,14 , 6400,33 , 6501,54 , 6487,14 , 120,9 , 122,7 , {73,78,82},  145,2 , 3827,49 , 8,5 , 4,0 , 1819,6 , 1460,4 ,     2,     1,     7,     7,     7 }, // Nepali/AnyScript/India
+    {     85,     0,   161,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 9815,59 , 9874,83 , 134,24 , 9883,59 , 9942,83 , 320,24 , 6555,28 , 2244,51 , 2295,14 , 6583,35 , 2244,51 , 2295,14 , 0,2 , 0,2 , {78,79,75},  142,2 , 3876,44 , 8,5 , 4,0 , 1830,12 , 1842,5 ,     2,     1,     1,     6,     7 }, // Norwegian/AnyScript/Norway
+    {     86,     0,    74,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 9957,83 , 9957,83 , 1483,27 , 10025,83 , 10025,83 , 134,27 , 6618,57 , 6618,57 , 798,14 , 6618,57 , 6618,57 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 1542,11 , 8,5 , 4,0 , 1847,7 , 1854,6 ,     2,     1,     1,     6,     7 }, // Occitan/AnyScript/France
+    {     87,     0,   100,    46,    44,    59,    37,  2918,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 10,17 , 18,7 , 25,12 , 10040,89 , 10040,89 , 10129,32 , 10108,89 , 10108,89 , 10197,32 , 6675,33 , 6708,54 , 6762,18 , 6675,33 , 6708,54 , 6762,18 , 140,2 , 140,2 , {73,78,82},  145,2 , 3920,11 , 8,5 , 4,0 , 1860,5 , 1865,4 ,     2,     1,     7,     7,     7 }, // Oriya/AnyScript/India
+    {     88,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 872,20 , 165,4 , 447,11 , 10161,68 , 10161,68 , 1483,27 , 10229,68 , 10229,68 , 134,27 , 6780,49 , 6780,49 , 798,14 , 6780,49 , 6780,49 , 798,14 , 199,4 , 195,4 , {65,70,78},  222,1 , 3931,13 , 25,5 , 4,0 , 1869,4 , 1873,9 ,     0,     0,     6,     4,     5 }, // Pashto/AnyScript/Afghanistan
+    {     89,     0,   102,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10229,71 , 10300,70 , 10370,25 , 10297,71 , 10368,73 , 10441,25 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {73,82,82},  223,1 , 3944,17 , 25,5 , 53,8 , 1882,5 , 1887,5 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Iran
+    {     89,     0,     1,  1643,  1644,  1563,  1642,  1776,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 165,4 , 447,11 , 10395,63 , 10300,70 , 10458,24 , 10466,63 , 10529,68 , 10597,24 , 6780,49 , 6780,49 , 6829,14 , 6780,49 , 6780,49 , 6829,14 , 203,10 , 199,10 , {65,70,78},  222,1 , 3961,23 , 25,5 , 53,8 , 1892,3 , 1873,9 ,     0,     0,     6,     4,     5 }, // Persian/AnyScript/Afghanistan
+    {     90,     0,   172,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8222,  8221, 0,6 , 0,6 , 61,7 , 61,7 , 892,10 , 10,17 , 37,5 , 8,10 , 10482,48 , 10530,97 , 10627,24 , 10621,48 , 10669,99 , 10768,24 , 6843,34 , 6877,59 , 6936,14 , 6843,34 , 6877,59 , 6936,14 , 0,2 , 0,2 , {80,76,78},  224,2 , 3984,60 , 25,5 , 4,0 , 1895,6 , 1901,6 ,     2,     1,     1,     6,     7 }, // Polish/AnyScript/Poland
+    {     91,     0,   173,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 202,8 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10651,48 , 10699,89 , 134,24 , 10792,48 , 10840,89 , 320,24 , 6950,28 , 6978,79 , 7057,14 , 6950,28 , 6978,79 , 7057,14 , 213,17 , 209,18 , {69,85,82},  113,1 , 1933,20 , 25,5 , 4,0 , 1907,17 , 1924,8 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Portugal
+    {     91,     0,    30,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {66,82,76},  226,2 , 4044,54 , 4,4 , 13,6 , 1932,19 , 1951,6 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Brazil
+    {     91,     0,    92,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 4098,62 , 4,4 , 13,6 , 1957,9 , 1966,12 ,     0,     0,     1,     6,     7 }, // Portuguese/AnyScript/GuineaBissau
+    {     91,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 210,7 , 210,7 , 27,8 , 902,27 , 37,5 , 458,19 , 10788,48 , 10836,89 , 134,24 , 10929,48 , 10977,89 , 320,24 , 6950,28 , 7071,79 , 7057,14 , 6950,28 , 7071,79 , 7057,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 4160,72 , 4,4 , 13,6 , 1957,9 , 1978,10 ,     2,     1,     1,     6,     7 }, // Portuguese/AnyScript/Mozambique
+    {     92,     0,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 , 1988,6 , 1994,4 ,     2,     1,     7,     7,     7 }, // Punjabi/AnyScript/India
+    {     92,     0,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 , 1998,5 , 2003,6 ,     0,     0,     7,     6,     7 }, // Punjabi/AnyScript/Pakistan
+    {     92,     1,   163,    46,    44,    59,    37,  1632,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 11020,67 , 11020,67 , 10993,27 , 11161,67 , 11161,67 , 11134,27 , 7150,38 , 7266,37 , 7243,23 , 7150,38 , 7266,37 , 7243,23 , 230,5 , 227,4 , {80,75,82},  234,1 , 4244,13 , 8,5 , 4,0 , 1998,5 , 2003,6 ,     0,     0,     7,     6,     7 }, // Punjabi/Arabic/Pakistan
+    {     92,     4,   100,    46,    44,    59,    37,  2662,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 10925,68 , 10925,68 , 10993,27 , 11066,68 , 11066,68 , 11134,27 , 7150,38 , 7188,55 , 7243,23 , 7150,38 , 7188,55 , 7243,23 , 230,5 , 227,4 , {73,78,82},  231,3 , 4232,12 , 8,5 , 4,0 , 1988,6 , 1994,4 ,     2,     1,     7,     7,     7 }, // Punjabi/Gurmukhi/India
+    {     94,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 0,6 , 0,6 , 332,8 , 502,18 , 37,5 , 8,10 , 11087,67 , 11154,92 , 11246,24 , 11228,67 , 11295,92 , 11387,24 , 7303,23 , 7326,56 , 7382,14 , 7303,23 , 7326,56 , 7382,14 , 140,2 , 231,2 , {67,72,70},  0,0 , 4257,20 , 25,5 , 4,0 , 2009,9 , 2018,6 ,     2,     5,     1,     6,     7 }, // RhaetoRomance/AnyScript/Switzerland
+    {     95,     0,   141,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4277,54 , 25,5 , 4,0 , 2024,6 , 2030,17 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Moldova
+    {     95,     0,   177,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 10,17 , 37,5 , 8,10 , 11270,60 , 11330,98 , 11428,24 , 11411,60 , 11471,98 , 11569,24 , 7396,21 , 7417,48 , 3021,14 , 7396,21 , 7417,48 , 3021,14 , 0,2 , 0,2 , {82,79,78},  235,3 , 4331,16 , 25,5 , 4,0 , 2024,6 , 2047,7 ,     2,     1,     1,     6,     7 }, // Romanian/AnyScript/Romania
+    {     96,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {82,85,66},  238,4 , 4347,89 , 25,5 , 4,0 , 2054,7 , 2061,6 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/RussianFederation
+    {     96,     0,   141,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 165,4 , 195,9 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {77,68,76},  0,0 , 4436,21 , 25,5 , 4,0 , 2054,7 , 2067,7 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Moldova
+    {     96,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 54,7 , 54,7 , 332,8 , 939,22 , 37,5 , 8,10 , 11452,62 , 11514,80 , 11594,24 , 11593,63 , 11656,82 , 11738,24 , 7465,21 , 7486,62 , 7548,14 , 7465,21 , 7562,62 , 7548,14 , 0,2 , 0,2 , {85,65,72},  242,1 , 4457,24 , 25,5 , 4,0 , 2054,7 , 2074,7 ,     2,     1,     1,     6,     7 }, // Russian/AnyScript/Ukraine
+    {     98,     0,    41,    44,    46,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 11618,48 , 11666,91 , 11757,24 , 11762,48 , 11810,91 , 11901,24 , 7624,28 , 7652,66 , 7718,14 , 7624,28 , 7652,66 , 7718,14 , 235,2 , 233,2 , {88,65,70},  201,4 , 4481,25 , 4,4 , 48,5 , 2081,5 , 2086,22 ,     0,     0,     1,     6,     7 }, // Sangho/AnyScript/CentralAfricanRepublic
+    {     99,     0,   100,    46,    44,    59,    37,  2406,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 630,7 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {73,78,82},  180,2 , 0,7 , 4,4 , 4,0 , 2108,12 , 2120,6 ,     2,     1,     7,     7,     7 }, // Sanskrit/AnyScript/India
+    {    100,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2126,6 , 2132,18 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/SerbiaAndMontenegro
+    {    100,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 , 2150,6 , 2156,19 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/BosniaAndHerzegowina
+    {    100,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2126,6 , 0,0 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Yugoslavia
+    {    100,     0,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 , 2175,6 , 2181,9 ,     2,     1,     1,     6,     7 }, // Serbian/AnyScript/Montenegro
+    {    100,     0,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 , 2126,6 , 2190,6 ,     0,     0,     1,     6,     7 }, // Serbian/AnyScript/Serbia
+    {    100,     2,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 115,8 , 968,20 , 37,5 , 477,40 , 11781,48 , 11910,83 , 8601,24 , 11925,48 , 12054,83 , 8669,24 , 7826,28 , 7854,54 , 7812,14 , 7826,28 , 7854,54 , 7812,14 , 237,9 , 235,7 , {66,65,77},  243,3 , 4506,195 , 25,5 , 4,0 , 2150,6 , 2156,19 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/BosniaAndHerzegowina
+    {    100,     2,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2126,6 , 0,0 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Yugoslavia
+    {    100,     2,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2126,6 , 2132,18 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/SerbiaAndMontenegro
+    {    100,     2,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {69,85,82},  113,1 , 4799,27 , 25,5 , 4,0 , 2126,6 , 2196,9 ,     2,     1,     1,     6,     7 }, // Serbian/Cyrillic/Montenegro
+    {    100,     2,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 54,7 , 54,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11781,48 , 11829,81 , 8601,24 , 11925,48 , 11973,81 , 8669,24 , 7732,28 , 7760,52 , 7812,14 , 7732,28 , 7760,52 , 7812,14 , 237,9 , 235,7 , {82,83,68},  246,4 , 4728,71 , 25,5 , 4,0 , 2126,6 , 2190,6 ,     0,     0,     1,     6,     7 }, // Serbian/Cyrillic/Serbia
+    {    100,     7,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 , 2175,6 , 2205,19 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/BosniaAndHerzegowina
+    {    100,     7,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2175,6 , 0,0 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Yugoslavia
+    {    100,     7,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2175,6 , 2224,18 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/SerbiaAndMontenegro
+    {    100,     7,   242,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {69,85,82},  113,1 , 4701,27 , 8,5 , 4,0 , 2175,6 , 2181,9 ,     2,     1,     1,     6,     7 }, // Serbian/Latin/Montenegro
+    {    100,     7,   243,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {82,83,68},  252,4 , 5044,71 , 25,5 , 4,0 , 2175,6 , 2242,6 ,     0,     0,     1,     6,     7 }, // Serbian/Latin/Serbia
+    {    101,     0,   241,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2248,14 , 2224,18 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/SerbiaAndMontenegro
+    {    101,     0,    27,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {66,65,77},  250,2 , 4826,218 , 25,5 , 4,0 , 2248,14 , 2205,19 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/BosniaAndHerzegowina
+    {    101,     0,   238,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 61,7 , 61,7 , 961,7 , 968,20 , 150,5 , 155,10 , 11993,48 , 12041,81 , 12122,24 , 12137,48 , 12185,81 , 12266,24 , 7908,28 , 7936,54 , 2118,14 , 7908,28 , 7936,54 , 2118,14 , 246,9 , 242,7 , {0,0,0},  0,0 , 4506,0 , 25,5 , 4,0 , 2248,14 , 0,0 ,     2,     1,     1,     6,     7 }, // SerboCroatian/AnyScript/Yugoslavia
+    {    102,     0,   120,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2262,7 , 0,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/Lesotho
+    {    102,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12146,48 , 12194,105 , 1483,27 , 12290,48 , 12338,105 , 134,27 , 7990,27 , 8017,61 , 798,14 , 7990,27 , 8017,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2262,7 , 0,0 ,     2,     1,     1,     6,     7 }, // Sesotho/AnyScript/SouthAfrica
+    {    103,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12299,48 , 12347,117 , 1483,27 , 12443,48 , 12491,117 , 134,27 , 8078,27 , 8105,64 , 798,14 , 8078,27 , 8105,64 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2269,8 , 0,0 ,     2,     1,     1,     6,     7 }, // Setswana/AnyScript/SouthAfrica
+    {    104,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 12464,47 , 12511,100 , 12611,24 , 12608,47 , 12655,100 , 12755,24 , 8169,32 , 8201,55 , 8256,14 , 8169,32 , 8201,55 , 8256,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 5115,22 , 4,4 , 13,6 , 2277,8 , 944,8 ,     2,     1,     7,     6,     7 }, // Shona/AnyScript/Zimbabwe
+    {    106,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 576,10 , 988,17 , 18,7 , 25,12 , 12635,54 , 12689,92 , 12781,32 , 12779,54 , 12833,92 , 12925,32 , 8270,30 , 8300,62 , 8362,19 , 8270,30 , 8300,62 , 8362,19 , 255,5 , 249,4 , {76,75,82},  259,5 , 5137,19 , 4,4 , 13,6 , 2285,5 , 2290,11 ,     2,     1,     1,     6,     7 }, // Singhalese/AnyScript/SriLanka
+    {    107,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2301,7 , 0,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/SouthAfrica
+    {    107,     0,   204,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 12813,48 , 12861,114 , 1483,27 , 12957,48 , 13005,114 , 134,27 , 8381,27 , 8408,68 , 798,14 , 8381,27 , 8408,68 , 798,14 , 0,2 , 0,2 , {83,90,76},  264,1 , 0,7 , 4,4 , 4,0 , 2301,7 , 0,0 ,     2,     1,     1,     6,     7 }, // Siswati/AnyScript/Swaziland
+    {    108,     0,   191,    44,   160,    59,    37,    48,    45,    43,   101,  8218,  8216,  8222,  8220, 0,6 , 0,6 , 78,7 , 78,7 , 586,8 , 502,18 , 165,4 , 195,9 , 12975,48 , 13023,82 , 12122,24 , 13119,48 , 13167,89 , 12266,24 , 8476,21 , 8497,52 , 8549,14 , 8476,21 , 8497,52 , 8549,14 , 260,10 , 253,9 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 , 2308,10 , 2318,19 ,     2,     1,     1,     6,     7 }, // Slovak/AnyScript/Slovakia
+    {    109,     0,   192,    44,    46,    59,    37,    48,    45,    43,   101,   187,   171,  8222,  8220, 0,6 , 0,6 , 276,8 , 276,8 , 1005,9 , 611,19 , 37,5 , 8,10 , 11993,48 , 13105,86 , 12122,24 , 12137,48 , 13256,86 , 12266,24 , 8563,28 , 8591,52 , 8643,14 , 8563,28 , 8591,52 , 8643,14 , 62,4 , 262,4 , {69,85,82},  113,1 , 5156,28 , 25,5 , 4,0 , 2337,11 , 2348,9 ,     2,     1,     1,     6,     7 }, // Slovenian/AnyScript/Slovenia
+    {    110,     0,   194,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {83,79,83},  265,3 , 5184,22 , 4,4 , 4,0 , 2357,8 , 2365,10 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Somalia
+    {    110,     0,    59,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {68,74,70},  5,3 , 5206,21 , 4,4 , 4,0 , 2357,8 , 2375,7 ,     0,     0,     6,     6,     7 }, // Somali/AnyScript/Djibouti
+    {    110,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {69,84,66},  0,2 , 5227,22 , 4,4 , 4,0 , 2357,8 , 2382,8 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Ethiopia
+    {    110,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 13191,48 , 13239,189 , 13428,24 , 13342,48 , 13390,189 , 13579,24 , 8657,28 , 8685,47 , 8732,14 , 8657,28 , 8685,47 , 8732,14 , 270,3 , 266,3 , {75,69,83},  2,3 , 0,7 , 4,4 , 4,0 , 2357,8 , 2390,7 ,     2,     1,     6,     6,     7 }, // Somali/AnyScript/Kenya
+    {    111,     0,   197,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {69,85,82},  113,1 , 1652,20 , 8,5 , 4,0 , 2397,17 , 1227,6 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Spain
+    {    111,     0,    10,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 517,14 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {65,82,83},  128,1 , 5249,51 , 8,5 , 4,0 , 2414,7 , 2421,9 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/Argentina
+    {    111,     0,    26,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {66,79,66},  268,2 , 5300,35 , 8,5 , 4,0 , 2414,7 , 2430,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Bolivia
+    {    111,     0,    43,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 543,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,76,80},  128,1 , 5335,45 , 4,4 , 48,5 , 2414,7 , 2437,5 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Chile
+    {    111,     0,    47,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,79,80},  128,1 , 5380,54 , 8,5 , 4,0 , 2414,7 , 2442,8 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Colombia
+    {    111,     0,    52,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {67,82,67},  270,1 , 5434,67 , 8,5 , 4,0 , 2414,7 , 2450,10 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/CostaRica
+    {    111,     0,    61,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {68,79,80},  271,3 , 5501,54 , 8,5 , 4,0 , 2414,7 , 2460,20 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/DominicanRepublic
+    {    111,     0,    63,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 165,4 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 4,4 , 48,5 , 2414,7 , 2480,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Ecuador
+    {    111,     0,    65,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  256,3 , 5555,70 , 8,5 , 4,0 , 2414,7 , 2487,11 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/ElSalvador
+    {    111,     0,    66,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {88,65,70},  201,4 , 5625,22 , 8,5 , 4,0 , 2414,7 , 2498,17 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/EquatorialGuinea
+    {    111,     0,    90,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {71,84,81},  274,1 , 5647,70 , 8,5 , 4,0 , 2414,7 , 2515,9 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Guatemala
+    {    111,     0,    96,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1040,27 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {72,78,76},  275,1 , 5717,60 , 8,5 , 4,0 , 2414,7 , 2524,8 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Honduras
+    {    111,     0,   139,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {77,88,78},  128,1 , 5777,48 , 8,5 , 4,0 , 2414,7 , 2532,6 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Mexico
+    {    111,     0,   155,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {78,73,79},  276,2 , 5825,81 , 8,5 , 4,0 , 2414,7 , 2538,9 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Nicaragua
+    {    111,     0,   166,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,65,66},  278,3 , 5906,54 , 8,5 , 4,0 , 2414,7 , 2547,6 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Panama
+    {    111,     0,   168,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,89,71},  281,1 , 5960,61 , 8,5 , 61,6 , 2414,7 , 2553,8 ,     0,     0,     1,     6,     7 }, // Spanish/AnyScript/Paraguay
+    {    111,     0,   169,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 551,7 , 1014,26 , 37,5 , 531,15 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {80,69,78},  282,3 , 6021,62 , 8,5 , 4,0 , 2414,7 , 2561,4 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Peru
+    {    111,     0,   174,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 187,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 , 2414,7 , 2565,11 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/PuertoRico
+    {    111,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 558,6 , 1014,26 , 18,7 , 25,12 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,83,68},  128,1 , 5555,70 , 8,5 , 4,0 , 2414,7 , 2576,14 ,     2,     1,     7,     6,     7 }, // Spanish/AnyScript/UnitedStates
+    {    111,     0,   227,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {85,89,85},  128,1 , 6083,48 , 8,5 , 67,7 , 2414,7 , 2590,7 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Uruguay
+    {    111,     0,   231,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {86,69,70},  285,5 , 6131,86 , 4,4 , 48,5 , 2414,7 , 2597,9 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/Venezuela
+    {    111,     0,   246,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 284,7 , 284,7 , 27,8 , 1014,26 , 37,5 , 8,10 , 13452,48 , 13500,89 , 13589,24 , 13603,48 , 13651,89 , 13740,24 , 8746,28 , 8774,53 , 3021,14 , 8746,28 , 8774,53 , 3021,14 , 56,4 , 56,4 , {0,0,0},  0,0 , 4506,0 , 8,5 , 4,0 , 2606,23 , 2629,25 ,     2,     1,     1,     6,     7 }, // Spanish/AnyScript/LatinAmericaAndTheCaribbean
+    {    113,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {75,69,83},  2,3 , 6217,24 , 4,4 , 4,0 , 2654,9 , 2663,5 ,     2,     1,     6,     6,     7 }, // Swahili/AnyScript/Kenya
+    {    113,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 13661,84 , 134,24 , 13764,48 , 13812,84 , 320,24 , 8827,22 , 8849,60 , 8909,14 , 8827,22 , 8849,60 , 8909,14 , 273,7 , 269,7 , {84,90,83},  290,3 , 6241,27 , 25,5 , 4,0 , 2654,9 , 2668,8 ,     0,     0,     1,     6,     7 }, // Swahili/AnyScript/Tanzania
+    {    114,     0,   205,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {83,69,75},  142,2 , 6268,45 , 25,5 , 4,0 , 2676,7 , 2683,7 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Sweden
+    {    114,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 291,9 , 291,9 , 72,10 , 1067,30 , 37,5 , 431,16 , 3550,48 , 13745,86 , 134,24 , 5527,48 , 13896,86 , 320,24 , 8923,29 , 8952,50 , 2295,14 , 8923,29 , 8952,50 , 2295,14 , 280,2 , 276,2 , {69,85,82},  113,1 , 6313,19 , 25,5 , 4,0 , 2676,7 , 2690,7 ,     2,     1,     1,     6,     7 }, // Swedish/AnyScript/Finland
+    {    116,     0,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Tajik/AnyScript/Tajikistan
+    {    116,     2,   209,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,   171,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 13879,71 , 1483,27 , 13982,48 , 14030,71 , 134,27 , 9002,28 , 9030,55 , 798,14 , 9002,28 , 9030,55 , 798,14 , 0,2 , 0,2 , {84,74,83},  188,3 , 6332,13 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Tajik/Cyrillic/Tajikistan
+    {    117,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {73,78,82},  293,2 , 6345,13 , 8,5 , 4,0 , 2697,5 , 2702,7 ,     2,     1,     7,     7,     7 }, // Tamil/AnyScript/India
+    {    117,     0,   198,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 300,13 , 300,13 , 655,6 , 203,18 , 18,7 , 25,12 , 13950,58 , 14008,88 , 14096,31 , 14101,58 , 14159,88 , 14247,31 , 9085,20 , 9105,49 , 9085,20 , 9085,20 , 9105,49 , 9085,20 , 140,2 , 140,2 , {76,75,82},  295,4 , 0,7 , 8,5 , 4,0 , 2697,5 , 2709,6 ,     2,     1,     1,     6,     7 }, // Tamil/AnyScript/SriLanka
+    {    118,     0,   178,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 929,10 , 1097,11 , 165,4 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {82,85,66},  0,0 , 0,7 , 0,4 , 4,0 , 2715,5 , 2061,6 ,     2,     1,     1,     6,     7 }, // Tatar/AnyScript/RussianFederation
+    {    119,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 313,12 , 325,11 , 543,8 , 99,16 , 18,7 , 25,12 , 14127,86 , 14127,86 , 14213,30 , 14278,86 , 14278,86 , 14364,30 , 9154,32 , 9186,60 , 9246,18 , 9154,32 , 9186,60 , 9246,18 , 282,1 , 278,2 , {73,78,82},  299,3 , 6358,13 , 8,5 , 4,0 , 2720,6 , 2726,9 ,     2,     1,     7,     7,     7 }, // Telugu/AnyScript/India
+    {    120,     0,   211,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 336,5 , 336,5 , 341,8 , 349,7 , 364,8 , 1108,19 , 165,4 , 546,27 , 14243,63 , 14306,98 , 14243,63 , 14394,63 , 14457,98 , 14555,24 , 9264,23 , 9287,68 , 9355,14 , 9264,23 , 9287,68 , 9355,14 , 283,10 , 280,10 , {84,72,66},  302,1 , 6371,13 , 4,4 , 48,5 , 2735,3 , 2735,3 ,     2,     1,     7,     6,     7 }, // Thai/AnyScript/Thailand
+    {    121,     0,    44,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {67,78,89},  215,3 , 6384,13 , 8,5 , 4,0 , 2738,8 , 2746,6 ,     2,     1,     7,     6,     7 }, // Tibetan/AnyScript/China
+    {    121,     0,   100,    46,    44,    59,    37,  3872,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14404,63 , 14467,158 , 1483,27 , 14579,63 , 14642,158 , 134,27 , 9369,49 , 9418,77 , 9495,21 , 9369,49 , 9418,77 , 9495,21 , 293,7 , 290,8 , {73,78,82},  145,2 , 6397,22 , 8,5 , 4,0 , 2738,8 , 2752,7 ,     2,     1,     7,     7,     7 }, // Tibetan/AnyScript/India
+    {    122,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1127,23 , 18,7 , 25,12 , 14625,46 , 14671,54 , 1034,24 , 14800,46 , 14846,54 , 1061,24 , 9516,29 , 9516,29 , 9545,14 , 9516,29 , 9516,29 , 9545,14 , 300,7 , 298,7 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 2759,4 , 0,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Eritrea
+    {    122,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1150,23 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 9559,29 , 9559,29 , 9545,14 , 9559,29 , 9559,29 , 9545,14 , 300,7 , 298,7 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 , 2759,4 , 0,0 ,     2,     1,     6,     6,     7 }, // Tigrinya/AnyScript/Ethiopia
+    {    123,     0,   214,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 99,16 , 37,5 , 8,10 , 14725,51 , 14776,87 , 14863,24 , 14900,51 , 14951,87 , 15038,24 , 9588,29 , 9617,60 , 9677,14 , 9588,29 , 9617,60 , 9677,14 , 0,2 , 0,2 , {84,79,80},  303,2 , 0,7 , 8,5 , 4,0 , 2763,13 , 2776,5 ,     2,     1,     1,     6,     7 }, // Tonga/AnyScript/Tonga
+    {    124,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 14887,48 , 14935,122 , 1483,27 , 15062,48 , 15110,122 , 134,27 , 9691,27 , 9718,72 , 798,14 , 9691,27 , 9718,72 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2781,8 , 0,0 ,     2,     1,     1,     6,     7 }, // Tsonga/AnyScript/SouthAfrica
+    {    125,     0,   217,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 356,8 , 356,8 , 929,10 , 1173,17 , 37,5 , 8,10 , 15057,48 , 15105,75 , 15180,24 , 15232,48 , 15280,75 , 15355,24 , 9790,28 , 9818,54 , 9872,14 , 9790,28 , 9818,54 , 9872,14 , 0,2 , 0,2 , {84,82,89},  195,2 , 6419,18 , 25,5 , 4,0 , 2789,6 , 2795,7 ,     2,     1,     1,     6,     7 }, // Turkish/AnyScript/Turkey
+    {    128,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     7,     6,     7 }, // Uigur/AnyScript/China
+    {    128,     1,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     7,     6,     7 }, // Uigur/Arabic/China
+    {    129,     0,   222,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8220, 0,6 , 0,6 , 364,8 , 364,8 , 332,8 , 1190,22 , 37,5 , 8,10 , 15204,48 , 15252,95 , 15347,24 , 15379,67 , 15446,87 , 15533,24 , 9886,21 , 9907,56 , 9963,14 , 9886,21 , 9907,56 , 9963,14 , 307,2 , 305,2 , {85,65,72},  242,1 , 6437,49 , 25,5 , 4,0 , 2802,10 , 2812,7 ,     2,     1,     1,     6,     7 }, // Ukrainian/AnyScript/Ukraine
+    {    130,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {73,78,82},  145,2 , 6486,18 , 8,5 , 4,0 , 2819,4 , 2823,5 ,     2,     1,     7,     7,     7 }, // Urdu/AnyScript/India
+    {    130,     0,   163,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 1212,18 , 18,7 , 25,12 , 15371,67 , 15371,67 , 10458,24 , 15557,67 , 15557,67 , 10597,24 , 9977,36 , 9977,36 , 10013,14 , 9977,36 , 9977,36 , 10013,14 , 0,2 , 0,2 , {80,75,82},  305,4 , 6504,21 , 4,4 , 4,0 , 2819,4 , 2828,7 ,     0,     0,     7,     6,     7 }, // Urdu/AnyScript/Pakistan
+    {    131,     0,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 , 2835,5 , 2840,10 ,     0,     0,     7,     6,     7 }, // Uzbek/AnyScript/Uzbekistan
+    {    131,     0,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 , 2850,6 , 1873,9 ,     0,     0,     6,     4,     5 }, // Uzbek/AnyScript/Afghanistan
+    {    131,     1,     1,  1643,  1644,    59,  1642,  1776,  8722,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 179,8 , 1230,33 , 165,4 , 447,11 , 15553,48 , 15601,68 , 11594,24 , 15739,48 , 10529,68 , 11738,24 , 10122,21 , 6780,49 , 10108,14 , 10122,21 , 6780,49 , 10108,14 , 0,2 , 0,2 , {65,70,78},  312,2 , 6546,13 , 25,5 , 4,0 , 2850,6 , 1873,9 ,     0,     0,     6,     4,     5 }, // Uzbek/Arabic/Afghanistan
+    {    131,     2,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 13831,48 , 15438,115 , 11594,24 , 13982,48 , 15624,115 , 11738,24 , 10027,28 , 10055,53 , 10108,14 , 10027,28 , 10055,53 , 10108,14 , 0,2 , 0,2 , {85,90,83},  309,3 , 6525,21 , 8,5 , 4,0 , 2835,5 , 2840,10 ,     0,     0,     7,     6,     7 }, // Uzbek/Cyrillic/Uzbekistan
+    {    131,     7,   228,    44,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 15669,52 , 15438,115 , 15721,24 , 15787,52 , 15624,115 , 15839,24 , 10143,34 , 10177,61 , 10238,14 , 10143,34 , 10177,61 , 10238,14 , 0,2 , 0,2 , {85,90,83},  314,4 , 6559,23 , 8,5 , 4,0 , 2856,9 , 2865,11 ,     0,     0,     7,     6,     7 }, // Uzbek/Latin/Uzbekistan
+    {    132,     0,   232,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 372,8 , 372,8 , 141,10 , 1263,31 , 37,5 , 8,10 , 15745,75 , 15820,130 , 1483,27 , 15863,75 , 15938,130 , 134,27 , 10252,33 , 10285,55 , 10340,21 , 10252,33 , 10285,55 , 10340,21 , 309,2 , 307,2 , {86,78,68},  318,1 , 6582,11 , 25,5 , 4,0 , 2876,10 , 2886,8 ,     0,     0,     1,     6,     7 }, // Vietnamese/AnyScript/VietNam
+    {    134,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 123,18 , 18,7 , 25,12 , 15950,53 , 16003,87 , 16090,24 , 16068,62 , 16130,86 , 16216,24 , 10361,29 , 10390,77 , 10467,14 , 10481,30 , 10390,77 , 10467,14 , 0,2 , 0,2 , {71,66,80},  153,1 , 6593,28 , 4,4 , 4,0 , 2894,7 , 2901,12 ,     2,     1,     1,     6,     7 }, // Welsh/AnyScript/UnitedKingdom
+    {    135,     0,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     0,     0,     1,     6,     7 }, // Wolof/AnyScript/Senegal
+    {    135,     7,   187,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     0,     0,     1,     6,     7 }, // Wolof/Latin/Senegal
+    {    136,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 16114,48 , 16162,91 , 1483,27 , 16240,48 , 16288,91 , 134,27 , 10511,28 , 10539,61 , 798,14 , 10511,28 , 10539,61 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2913,8 , 0,0 ,     2,     1,     1,     6,     7 }, // Xhosa/AnyScript/SouthAfrica
+    {    138,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 16253,73 , 16326,121 , 1483,27 , 16379,73 , 16452,121 , 134,27 , 10600,44 , 10644,69 , 798,14 , 10600,44 , 10644,69 , 798,14 , 311,5 , 309,5 , {78,71,78},  171,1 , 6621,34 , 4,4 , 13,6 , 2921,10 , 2931,18 ,     2,     1,     1,     6,     7 }, // Yoruba/AnyScript/Nigeria
+    {    140,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 82,17 , 18,7 , 25,12 , 16447,48 , 16495,104 , 134,24 , 16573,48 , 16621,90 , 320,24 , 10713,28 , 10741,68 , 10809,14 , 10713,28 , 10741,68 , 10809,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 2949,7 , 2956,17 ,     2,     1,     1,     6,     7 }, // Zulu/AnyScript/SouthAfrica
+    {    141,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 85,8 , 85,8 , 332,8 , 594,17 , 37,5 , 431,16 , 4262,48 , 9874,83 , 134,24 , 4314,48 , 9942,83 , 320,24 , 10823,28 , 10851,51 , 2295,14 , 10823,28 , 10851,51 , 2295,14 , 316,9 , 314,11 , {78,79,75},  142,2 , 6655,42 , 25,5 , 4,0 , 2973,7 , 2980,5 ,     2,     1,     1,     6,     7 }, // Nynorsk/AnyScript/Norway
+    {    142,     0,    27,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 16599,48 , 16647,83 , 1483,27 , 16711,48 , 16759,83 , 134,27 , 10902,28 , 10930,58 , 798,14 , 10902,28 , 10930,58 , 798,14 , 0,2 , 0,2 , {66,65,77},  250,2 , 6697,26 , 8,5 , 4,0 , 2985,8 , 2205,19 ,     2,     1,     1,     6,     7 }, // Bosnian/AnyScript/BosniaAndHerzegowina
+    {    143,     0,   131,    46,    44,    44,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 322,8 , 330,13 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {77,86,82},  319,2 , 0,7 , 8,5 , 4,0 , 2993,10 , 3003,13 ,     2,     1,     5,     6,     7 }, // Divehi/AnyScript/Maldives
+    {    144,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 82,17 , 37,5 , 8,10 , 16730,102 , 16832,140 , 1483,27 , 16842,102 , 16944,140 , 134,27 , 10988,30 , 11018,57 , 798,14 , 10988,30 , 11018,57 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 , 3016,5 , 3021,14 ,     2,     1,     1,     6,     7 }, // Manx/AnyScript/UnitedKingdom
+    {    145,     0,   224,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 99,16 , 37,5 , 8,10 , 16972,46 , 17018,124 , 1483,27 , 17084,46 , 17130,124 , 134,27 , 11075,28 , 11103,60 , 798,14 , 11075,28 , 11103,60 , 798,14 , 56,4 , 56,4 , {71,66,80},  153,1 , 0,7 , 4,4 , 4,0 , 3035,8 , 3021,14 ,     2,     1,     1,     6,     7 }, // Cornish/AnyScript/UnitedKingdom
+    {    146,     0,    83,    46,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17142,48 , 17190,192 , 1483,27 , 17254,48 , 17302,192 , 134,27 , 11163,28 , 11191,49 , 11240,14 , 11163,28 , 11191,49 , 11240,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 4,0 , 3043,4 , 3047,5 ,     2,     1,     1,     6,     7 }, // Akan/AnyScript/Ghana
+    {    147,     0,   100,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 655,6 , 99,16 , 18,7 , 25,12 , 17382,87 , 17382,87 , 1483,27 , 17494,87 , 17494,87 , 134,27 , 6251,32 , 11254,55 , 798,14 , 6251,32 , 11254,55 , 798,14 , 327,5 , 327,5 , {73,78,82},  180,2 , 0,7 , 8,5 , 4,0 , 3052,6 , 1460,4 ,     2,     1,     7,     7,     7 }, // Konkani/AnyScript/India
+    {    148,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,    34,    34, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 17469,48 , 17517,94 , 1483,27 , 17581,48 , 17629,94 , 134,27 , 11309,26 , 11335,34 , 798,14 , 11309,26 , 11335,34 , 798,14 , 0,2 , 0,2 , {71,72,83},  168,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Ga/AnyScript/Ghana
+    {    149,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17611,48 , 17659,86 , 1483,27 , 17723,48 , 17771,86 , 134,27 , 11369,29 , 11398,57 , 798,14 , 11369,29 , 11398,57 , 798,14 , 332,4 , 332,4 , {78,71,78},  171,1 , 6723,12 , 4,4 , 13,6 , 3058,4 , 3062,7 ,     2,     1,     1,     6,     7 }, // Igbo/AnyScript/Nigeria
+    {    150,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 17745,48 , 17793,189 , 17982,24 , 17857,48 , 17905,189 , 18094,24 , 11455,28 , 11483,74 , 11557,14 , 11455,28 , 11483,74 , 11557,14 , 336,9 , 336,7 , {75,69,83},  2,3 , 6735,23 , 4,4 , 13,6 , 3069,7 , 2663,5 ,     2,     1,     6,     6,     7 }, // Kamba/AnyScript/Kenya
+    {    151,     0,   207,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 1294,13 , 394,4 , 25,12 , 18006,65 , 18006,65 , 1483,27 , 18118,65 , 18118,65 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {83,89,80},  79,5 , 0,7 , 8,5 , 19,6 , 3076,6 , 3076,6 ,     0,     0,     7,     5,     6 }, // Syriac/AnyScript/SyrianArabRepublic
+    {    152,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1307,22 , 18,7 , 25,12 , 18071,47 , 18118,77 , 18195,24 , 18183,47 , 18230,77 , 18307,24 , 11571,26 , 11597,43 , 11640,14 , 11571,26 , 11597,43 , 11640,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 3082,3 , 3085,4 ,     2,     1,     6,     6,     7 }, // Blin/AnyScript/Eritrea
+    {    153,     0,    67,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 3089,4 , 3085,4 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Eritrea
+    {    153,     0,    69,    46,  4808,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1329,23 , 18,7 , 25,12 , 18219,49 , 18219,49 , 18268,24 , 18331,49 , 18331,49 , 18380,24 , 11654,29 , 11654,29 , 11683,14 , 11654,29 , 11654,29 , 11683,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 , 3089,4 , 96,5 ,     2,     1,     6,     6,     7 }, // Geez/AnyScript/Ethiopia
+    {    154,     0,    53,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18292,48 , 18340,124 , 1483,27 , 18404,48 , 18452,124 , 134,27 , 11697,28 , 11725,54 , 798,14 , 11697,28 , 11725,54 , 798,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     0,     0,     1,     6,     7 }, // Koro/AnyScript/IvoryCoast
+    {    155,     0,    69,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 11779,28 , 11807,51 , 11858,14 , 11779,28 , 11807,51 , 11858,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 0,7 , 4,4 , 4,0 , 3093,11 , 3104,11 ,     2,     1,     6,     6,     7 }, // Sidamo/AnyScript/Ethiopia
+    {    156,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18464,59 , 18523,129 , 1483,27 , 18576,59 , 18635,129 , 134,27 , 11872,35 , 11907,87 , 798,14 , 11872,35 , 11907,87 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6758,11 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Atsam/AnyScript/Nigeria
+    {    157,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1352,21 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 11994,27 , 12021,41 , 12062,14 , 11994,27 , 12021,41 , 12062,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 3115,3 , 3085,4 ,     2,     1,     6,     6,     7 }, // Tigre/AnyScript/Eritrea
+    {    158,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 18652,57 , 18709,178 , 1483,27 , 18764,57 , 18821,178 , 134,27 , 12076,28 , 12104,44 , 798,14 , 12076,28 , 12104,44 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6769,14 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Jju/AnyScript/Nigeria
+    {    159,     0,   106,    44,    46,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1373,27 , 37,5 , 8,10 , 18887,48 , 18935,77 , 19012,24 , 18999,48 , 19047,77 , 19124,24 , 12148,28 , 12176,50 , 3021,14 , 12148,28 , 12176,50 , 3021,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 8,5 , 4,0 , 3118,6 , 3124,6 ,     2,     1,     1,     6,     7 }, // Friulian/AnyScript/Italy
+    {    160,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19036,48 , 19084,111 , 1483,27 , 19148,48 , 19196,111 , 134,27 , 12226,27 , 12253,70 , 798,14 , 12226,27 , 12253,70 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 3130,9 , 0,0 ,     2,     1,     1,     6,     7 }, // Venda/AnyScript/SouthAfrica
+    {    161,     0,    83,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {71,72,83},  168,3 , 0,7 , 4,4 , 13,6 , 3139,6 , 3145,7 ,     2,     1,     1,     6,     7 }, // Ewe/AnyScript/Ghana
+    {    161,     0,   212,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 19195,48 , 19243,87 , 19330,24 , 19307,48 , 19355,87 , 19442,24 , 12323,32 , 12355,44 , 12399,14 , 12323,32 , 12355,44 , 12399,14 , 325,2 , 325,2 , {88,79,70},  157,3 , 6783,11 , 4,4 , 13,6 , 3139,6 , 3152,6 ,     0,     0,     1,     6,     7 }, // Ewe/AnyScript/Togo
+    {    162,     0,    69,    46,  8217,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1400,22 , 18,7 , 25,12 , 926,46 , 972,62 , 1034,24 , 953,46 , 999,62 , 1061,24 , 12413,27 , 12413,27 , 12440,14 , 12413,27 , 12413,27 , 12440,14 , 0,2 , 0,2 , {69,84,66},  0,2 , 81,16 , 4,4 , 4,0 , 3158,5 , 96,5 ,     2,     1,     6,     6,     7 }, // Walamo/AnyScript/Ethiopia
+    {    163,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 279,6 , 10,17 , 18,7 , 25,12 , 19354,59 , 19413,95 , 1483,27 , 19466,59 , 19525,95 , 134,27 , 12454,21 , 12475,57 , 798,14 , 12454,21 , 12475,57 , 798,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 0,7 , 4,4 , 13,6 , 3163,14 , 3177,19 ,     2,     1,     7,     6,     7 }, // Hawaiian/AnyScript/UnitedStates
+    {    164,     0,   157,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 221,8 , 314,18 , 37,5 , 8,10 , 19508,48 , 19556,153 , 1483,27 , 19620,48 , 19668,153 , 134,27 , 12532,28 , 12560,42 , 798,14 , 12532,28 , 12560,42 , 798,14 , 0,2 , 0,2 , {78,71,78},  171,1 , 6794,11 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Tyap/AnyScript/Nigeria
+    {    165,     0,   129,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 19709,48 , 19757,91 , 1483,27 , 19821,48 , 19869,91 , 134,27 , 12602,28 , 12630,67 , 798,14 , 12602,28 , 12630,67 , 798,14 , 0,2 , 0,2 , {77,87,75},  0,0 , 6805,22 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Chewa/AnyScript/Malawi
+    {    166,     0,   170,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 380,8 , 380,8 , 558,6 , 1422,18 , 37,5 , 8,10 , 19848,48 , 19896,88 , 19984,24 , 19960,48 , 20008,88 , 20096,24 , 12697,28 , 12725,55 , 12780,14 , 12794,28 , 12725,55 , 12780,14 , 0,2 , 0,2 , {80,72,80},  152,1 , 6827,22 , 8,5 , 4,0 , 3196,8 , 3204,9 ,     2,     1,     7,     6,     7 }, // Filipino/AnyScript/Philippines
+    {    167,     0,   206,    46,  8217,    59,    37,    48,  8722,    43,   101,   171,   187,  8249,  8250, 0,6 , 0,6 , 128,9 , 128,9 , 332,8 , 502,18 , 37,5 , 8,10 , 20008,48 , 20056,86 , 134,24 , 5076,48 , 20120,86 , 320,24 , 12822,28 , 12850,63 , 3311,14 , 12822,28 , 12850,63 , 3311,14 , 91,5 , 343,4 , {67,72,70},  0,0 , 6849,39 , 25,5 , 4,0 , 3213,16 , 3229,7 ,     2,     5,     1,     6,     7 }, // Swiss German/AnyScript/Switzerland
+    {    168,     0,    44,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 20142,38 , 1483,27 , 134,27 , 20206,38 , 134,27 , 12913,21 , 12934,28 , 12962,14 , 12913,21 , 12934,28 , 12962,14 , 345,2 , 347,2 , {67,78,89},  215,3 , 0,7 , 8,5 , 4,0 , 3236,3 , 3239,2 ,     2,     1,     7,     6,     7 }, // Sichuan Yi/AnyScript/China
+    {    169,     0,    91,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {71,78,70},  321,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     0,     0,     1,     6,     7 }, // Kpelle/AnyScript/Guinea
+    {    169,     0,   121,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {76,82,68},  128,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     1,     6,     7 }, // Kpelle/AnyScript/Liberia
+    {    170,     0,    82,    44,    46,    59,    37,    48,    45,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 1483,27 , 1483,27 , 1483,27 , 134,27 , 134,27 , 134,27 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 798,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 0,7 , 25,5 , 4,0 , 3241,12 , 3253,11 ,     2,     1,     1,     6,     7 }, // Low German/AnyScript/Germany
+    {    171,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20180,48 , 20228,100 , 1483,27 , 20244,48 , 20292,100 , 134,27 , 12976,27 , 13003,66 , 798,14 , 12976,27 , 13003,66 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 3264,10 , 0,0 ,     2,     1,     1,     6,     7 }, // South Ndebele/AnyScript/SouthAfrica
+    {    172,     0,   195,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20328,48 , 20376,94 , 1483,27 , 20392,48 , 20440,94 , 134,27 , 13069,27 , 13096,63 , 798,14 , 13069,27 , 13096,63 , 798,14 , 0,2 , 0,2 , {90,65,82},  11,1 , 0,7 , 4,4 , 4,0 , 3274,16 , 0,0 ,     2,     1,     1,     6,     7 }, // Northern Sotho/AnyScript/SouthAfrica
+    {    173,     0,    73,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20470,85 , 20555,145 , 20700,24 , 20534,85 , 20619,145 , 20764,24 , 13159,33 , 13192,65 , 13257,14 , 13159,33 , 13192,65 , 13257,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 6888,23 , 25,5 , 4,0 , 3290,15 , 3305,6 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Finland
+    {    173,     0,   161,    44,   160,    59,    37,    48,  8722,    43,   101,  8221,  8221,  8217,  8217, 0,6 , 0,6 , 112,8 , 112,8 , 72,10 , 314,18 , 37,5 , 8,10 , 20724,59 , 20555,145 , 20700,24 , 20788,59 , 20619,145 , 20764,24 , 13159,33 , 13271,75 , 13346,14 , 13159,33 , 13271,75 , 13346,14 , 0,2 , 0,2 , {78,79,75},  323,3 , 6911,21 , 25,5 , 4,0 , 3290,15 , 3311,5 ,     2,     1,     1,     6,     7 }, // Northern Sami/AnyScript/Norway
+    {    174,     0,   208,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 72,10 , 314,18 , 37,5 , 8,10 , 20783,48 , 20831,142 , 20973,24 , 20847,48 , 20895,142 , 21037,24 , 13360,28 , 13388,172 , 13560,14 , 13360,28 , 13388,172 , 13560,14 , 0,2 , 0,2 , {84,87,68},  135,3 , 6932,18 , 8,5 , 4,0 , 0,0 , 0,0 ,     2,     1,     7,     6,     7 }, // Taroko/AnyScript/Taiwan
+    {    175,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8216,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 20997,48 , 21045,88 , 21133,24 , 21061,48 , 21109,88 , 21197,24 , 13574,28 , 13602,62 , 13664,14 , 13574,28 , 13602,62 , 13664,14 , 347,5 , 349,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 , 3316,8 , 2663,5 ,     2,     1,     6,     6,     7 }, // Gusii/AnyScript/Kenya
+    {    176,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21157,48 , 21205,221 , 21426,24 , 21221,48 , 21269,221 , 21490,24 , 13678,28 , 13706,106 , 13812,14 , 13678,28 , 13706,106 , 13812,14 , 352,10 , 359,10 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 , 3324,7 , 2663,5 ,     2,     1,     6,     6,     7 }, // Taita/AnyScript/Kenya
+    {    177,     0,   187,    44,   160,    59,    37,    48,    45,    43,   101,  8222,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 21450,48 , 21498,77 , 21575,24 , 21514,48 , 21562,77 , 21639,24 , 13826,28 , 13854,59 , 13913,14 , 13826,28 , 13854,59 , 13913,14 , 362,6 , 369,7 , {88,79,70},  157,3 , 6974,26 , 25,5 , 4,0 , 3331,6 , 3337,8 ,     0,     0,     1,     6,     7 }, // Fulah/AnyScript/Senegal
+    {    178,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21599,48 , 21647,185 , 21832,24 , 21663,48 , 21711,185 , 21896,24 , 13927,28 , 13955,63 , 14018,14 , 13927,28 , 13955,63 , 14018,14 , 368,6 , 376,8 , {75,69,83},  2,3 , 7000,23 , 4,4 , 13,6 , 3345,6 , 2663,5 ,     2,     1,     6,     6,     7 }, // Kikuyu/AnyScript/Kenya
+    {    179,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 21856,48 , 21904,173 , 22077,24 , 21920,48 , 21968,173 , 22141,24 , 14032,28 , 14060,105 , 14165,14 , 14032,28 , 14060,105 , 14165,14 , 374,7 , 384,5 , {75,69,83},  2,3 , 7023,25 , 4,4 , 13,6 , 3351,8 , 2663,5 ,     2,     1,     6,     6,     7 }, // Samburu/AnyScript/Kenya
+    {    180,     0,   146,    44,    46,    59,    37,    48,    45,    43,   101,    39,    39,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 22101,48 , 22149,88 , 134,24 , 22165,48 , 22213,88 , 320,24 , 14179,28 , 14207,55 , 14262,14 , 14179,28 , 14207,55 , 14262,14 , 0,2 , 0,2 , {77,90,78},  228,3 , 0,7 , 0,4 , 4,0 , 3359,4 , 1978,10 ,     2,     1,     1,     6,     7 }, // Sena/AnyScript/Mozambique
+    {    181,     0,   240,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22237,48 , 22285,112 , 22397,24 , 22301,48 , 22349,112 , 22461,24 , 14276,28 , 14304,50 , 14354,14 , 14276,28 , 14304,50 , 14354,14 , 0,2 , 0,2 , {85,83,68},  256,3 , 7048,24 , 4,4 , 13,6 , 3264,10 , 944,8 ,     2,     1,     7,     6,     7 }, // North Ndebele/AnyScript/Zimbabwe
+    {    182,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 22421,39 , 22460,194 , 22654,24 , 22485,39 , 22524,194 , 22718,24 , 14368,28 , 14396,65 , 14461,14 , 14368,28 , 14396,65 , 14461,14 , 381,8 , 389,7 , {84,90,83},  290,3 , 7072,25 , 4,4 , 4,0 , 3363,9 , 2668,8 ,     0,     0,     1,     6,     7 }, // Rombo/AnyScript/Tanzania
+    {    183,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 , 3372,9 , 3381,6 ,     2,     1,     6,     5,     6 }, // Tachelhit/AnyScript/Morocco
+    {    183,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22678,48 , 22726,81 , 22807,24 , 22742,48 , 22790,81 , 22871,24 , 14475,30 , 14505,48 , 798,14 , 14475,30 , 14505,48 , 798,14 , 389,6 , 396,8 , {77,65,68},  0,0 , 7097,21 , 0,4 , 4,0 , 3372,9 , 3381,6 ,     2,     1,     6,     5,     6 }, // Tachelhit/Latin/Morocco
+    {    183,     9,   145,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8222,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22831,48 , 22879,81 , 22960,24 , 22895,48 , 22943,81 , 23024,24 , 14553,30 , 14583,47 , 798,14 , 14553,30 , 14583,47 , 798,14 , 395,6 , 404,8 , {77,65,68},  0,0 , 7118,21 , 0,4 , 4,0 , 3387,8 , 3395,6 ,     2,     1,     6,     5,     6 }, // Tachelhit/Tifinagh/Morocco
+    {    184,     0,     3,    44,   160,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 22984,48 , 23032,84 , 23116,24 , 23048,48 , 23096,84 , 23180,24 , 14630,30 , 14660,51 , 14711,14 , 14630,30 , 14660,51 , 14711,14 , 401,7 , 412,9 , {68,90,68},  326,2 , 7139,21 , 0,4 , 4,0 , 3401,9 , 3410,8 ,     2,     1,     6,     4,     5 }, // Kabyle/AnyScript/Algeria
+    {    185,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 , 3418,10 , 3428,6 ,     0,     0,     1,     6,     7 }, // Nyankole/AnyScript/Uganda
+    {    186,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23340,48 , 23388,254 , 23642,24 , 23404,48 , 23452,254 , 23706,24 , 14841,28 , 14869,82 , 14951,14 , 14841,28 , 14869,82 , 14951,14 , 408,7 , 421,7 , {84,90,83},  290,3 , 7186,29 , 0,4 , 4,0 , 3434,6 , 3440,10 ,     0,     0,     1,     6,     7 }, // Bena/AnyScript/Tanzania
+    {    187,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 , 3450,8 , 2668,8 ,     0,     0,     1,     6,     7 }, // Vunjo/AnyScript/Tanzania
+    {    188,     0,   132,    46,    44,    59,    37,    48,    45,    43,   101,   171,   187,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 23753,47 , 23800,92 , 23892,24 , 23817,47 , 23864,92 , 23956,24 , 15069,28 , 15097,44 , 15141,14 , 15069,28 , 15097,44 , 15141,14 , 0,2 , 0,2 , {88,79,70},  157,3 , 7242,24 , 4,4 , 13,6 , 3458,9 , 1133,4 ,     0,     0,     1,     6,     7 }, // Bambara/AnyScript/Mali
+    {    189,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23916,48 , 23964,207 , 24171,24 , 23980,48 , 24028,207 , 24235,24 , 15155,28 , 15183,64 , 15247,14 , 15155,28 , 15183,64 , 15247,14 , 420,2 , 437,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 , 3467,6 , 2663,5 ,     2,     1,     6,     6,     7 }, // Embu/AnyScript/Kenya
+    {    190,     0,   225,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 558,6 , 35,18 , 18,7 , 25,12 , 24195,36 , 24231,58 , 24289,24 , 24259,36 , 24295,58 , 24353,24 , 15261,28 , 15289,49 , 15338,14 , 15261,28 , 15289,49 , 15338,14 , 422,3 , 439,6 , {85,83,68},  128,1 , 7266,19 , 4,4 , 13,6 , 3473,3 , 3476,4 ,     2,     1,     7,     6,     7 }, // Cherokee/AnyScript/UnitedStates
+    {    191,     0,   137,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 24313,47 , 24360,68 , 24428,24 , 24377,47 , 24424,68 , 24492,24 , 15352,27 , 15379,48 , 15427,14 , 15352,27 , 15379,48 , 15427,14 , 0,2 , 0,2 , {77,85,82},  147,4 , 7285,21 , 8,5 , 4,0 , 3480,14 , 3494,5 ,     0,     0,     1,     6,     7 }, // Morisyen/AnyScript/Mauritius
+    {    192,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 24452,264 , 134,24 , 13764,48 , 24516,264 , 320,24 , 15441,28 , 15469,133 , 14461,14 , 15441,28 , 15469,133 , 14461,14 , 425,4 , 445,5 , {84,90,83},  290,3 , 7215,27 , 4,4 , 13,6 , 3499,10 , 2668,8 ,     0,     0,     1,     6,     7 }, // Makonde/AnyScript/Tanzania
+    {    193,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,  8221,  8221,    39,    39, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24716,83 , 24799,111 , 24910,24 , 24780,83 , 24863,111 , 24974,24 , 15602,36 , 15638,63 , 15701,14 , 15602,36 , 15638,63 , 15701,14 , 429,3 , 450,3 , {84,90,83},  290,3 , 7306,29 , 8,5 , 4,0 , 3509,8 , 3517,9 ,     0,     0,     1,     6,     7 }, // Langi/AnyScript/Tanzania
+    {    194,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 15715,28 , 15743,66 , 15809,14 , 15715,28 , 15743,66 , 15809,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7335,26 , 0,4 , 4,0 , 3526,7 , 3533,7 ,     0,     0,     1,     6,     7 }, // Ganda/AnyScript/Uganda
+    {    195,     0,   239,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25079,48 , 25127,83 , 25210,24 , 25143,48 , 25191,83 , 25274,24 , 15823,80 , 15823,80 , 798,14 , 15823,80 , 15823,80 , 798,14 , 432,8 , 453,7 , {90,77,75},  331,2 , 0,7 , 4,4 , 13,6 , 3540,9 , 3549,6 ,     0,     0,     1,     6,     7 }, // Bemba/AnyScript/Zambia
+    {    196,     0,    39,    44,    46,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 902,27 , 37,5 , 8,10 , 25234,48 , 25282,86 , 134,24 , 25298,48 , 25346,86 , 320,24 , 15903,28 , 15931,73 , 16004,14 , 15903,28 , 15931,73 , 16004,14 , 140,2 , 140,2 , {67,86,69},  333,3 , 7361,25 , 0,4 , 4,0 , 3555,12 , 3567,10 ,     2,     1,     1,     6,     7 }, // Kabuverdianu/AnyScript/CapeVerde
+    {    197,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25368,48 , 25416,86 , 25502,24 , 25432,48 , 25480,86 , 25566,24 , 16018,28 , 16046,51 , 16097,14 , 16018,28 , 16046,51 , 16097,14 , 440,2 , 460,2 , {75,69,83},  2,3 , 6950,24 , 4,4 , 13,6 , 3577,6 , 2663,5 ,     2,     1,     6,     6,     7 }, // Meru/AnyScript/Kenya
+    {    198,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25526,48 , 25574,111 , 25685,24 , 25590,48 , 25638,111 , 25749,24 , 16111,28 , 16139,93 , 16232,14 , 16111,28 , 16139,93 , 16232,14 , 442,4 , 462,4 , {75,69,83},  2,3 , 7386,26 , 4,4 , 13,6 , 3583,8 , 3591,12 ,     2,     1,     6,     6,     7 }, // Kalenjin/AnyScript/Kenya
+    {    199,     0,   148,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 0,48 , 25709,136 , 134,24 , 0,48 , 25773,136 , 320,24 , 16246,23 , 16269,92 , 16361,14 , 16246,23 , 16269,92 , 16361,14 , 446,7 , 466,5 , {78,65,68},  12,2 , 7412,22 , 4,4 , 4,0 , 3603,13 , 3616,8 ,     2,     1,     1,     6,     7 }, // Nama/AnyScript/Namibia
+    {    200,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 4,4 , 4,0 , 3624,9 , 2668,8 ,     0,     0,     1,     6,     7 }, // Machame/AnyScript/Tanzania
+    {    201,     0,    82,    44,   160,    59,    37,    48,  8722,    43,   101,  8222,  8220,  8218,  8216, 0,6 , 0,6 , 228,8 , 228,8 , 1440,10 , 1450,23 , 37,5 , 8,10 , 25845,59 , 25904,87 , 134,24 , 25909,59 , 25968,87 , 320,24 , 16375,28 , 16403,72 , 3311,14 , 16375,28 , 16403,72 , 3311,14 , 0,2 , 0,2 , {69,85,82},  113,1 , 3549,11 , 25,5 , 4,0 , 0,0 , 3633,11 ,     2,     1,     1,     6,     7 }, // Colognian/AnyScript/Germany
+    {    202,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {75,69,83},  2,3 , 7434,25 , 4,4 , 13,6 , 3644,3 , 2663,5 ,     2,     1,     6,     6,     7 }, // Masai/AnyScript/Kenya
+    {    202,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8221,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 25991,51 , 26042,132 , 1483,27 , 26055,51 , 26106,132 , 134,27 , 14965,28 , 16475,58 , 14461,14 , 14965,28 , 16475,58 , 14461,14 , 453,9 , 471,6 , {84,90,83},  290,3 , 7459,28 , 4,4 , 13,6 , 3644,3 , 3647,8 ,     0,     0,     1,     6,     7 }, // Masai/AnyScript/Tanzania
+    {    203,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 24934,48 , 24982,97 , 134,24 , 24998,48 , 25046,97 , 320,24 , 16533,35 , 16568,65 , 16633,14 , 16533,35 , 16568,65 , 16633,14 , 462,6 , 477,6 , {85,71,88},  328,3 , 7335,26 , 25,5 , 4,0 , 3655,7 , 3533,7 ,     0,     0,     1,     6,     7 }, // Soga/AnyScript/Uganda
+    {    204,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8222,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26174,48 , 13661,84 , 134,24 , 26238,48 , 13812,84 , 320,24 , 16647,21 , 16668,75 , 85,14 , 16647,21 , 16668,75 , 85,14 , 56,4 , 56,4 , {75,69,83},  2,3 , 7487,23 , 4,4 , 79,6 , 3662,7 , 2663,5 ,     2,     1,     6,     6,     7 }, // Luyia/AnyScript/Kenya
+    {    205,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26222,48 , 13661,84 , 134,24 , 26286,48 , 13812,84 , 320,24 , 16743,28 , 8849,60 , 15055,14 , 16743,28 , 8849,60 , 15055,14 , 468,9 , 483,8 , {84,90,83},  290,3 , 7510,28 , 25,5 , 4,0 , 3669,6 , 3675,8 ,     0,     0,     1,     6,     7 }, // Asu/AnyScript/Tanzania
+    {    206,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {75,69,83},  2,3 , 7538,27 , 4,4 , 13,6 , 3683,6 , 3689,5 ,     2,     1,     6,     6,     7 }, // Teso/AnyScript/Kenya
+    {    206,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26270,48 , 26318,94 , 26412,24 , 26334,48 , 26382,94 , 26476,24 , 16771,28 , 16799,69 , 16868,14 , 16771,28 , 16799,69 , 16868,14 , 477,9 , 491,6 , {85,71,88},  328,3 , 7565,28 , 4,4 , 13,6 , 3683,6 , 3428,6 ,     0,     0,     1,     6,     7 }, // Teso/AnyScript/Uganda
+    {    207,     0,    67,    46,    44,    59,    37,    48,    45,    43,   101,  8220,  8221,  8216,  8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 53,19 , 18,7 , 25,12 , 317,48 , 518,118 , 494,24 , 344,48 , 545,118 , 521,24 , 16882,28 , 16910,56 , 16966,14 , 16882,28 , 16910,56 , 16966,14 , 0,2 , 0,2 , {69,82,78},  8,3 , 0,7 , 4,4 , 4,0 , 0,0 , 36,7 ,     2,     1,     6,     6,     7 }, // Saho/AnyScript/Eritrea
+    {    208,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 16980,28 , 17008,53 , 17061,14 , 16980,28 , 17008,53 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 , 3694,11 , 3705,5 ,     0,     0,     1,     6,     7 }, // Koyra Chiini/AnyScript/Mali
+    {    209,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8220, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 23666,87 , 134,24 , 13764,48 , 23730,87 , 320,24 , 14965,28 , 14993,62 , 15055,14 , 14965,28 , 14993,62 , 15055,14 , 415,5 , 428,9 , {84,90,83},  290,3 , 7215,27 , 0,4 , 4,0 , 3710,6 , 2668,8 ,     0,     0,     1,     6,     7 }, // Rwa/AnyScript/Tanzania
+    {    210,     0,   111,    46,    44,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26594,48 , 26642,186 , 26828,24 , 26658,48 , 26706,186 , 26892,24 , 17075,28 , 17103,69 , 17172,14 , 17075,28 , 17103,69 , 17172,14 , 492,2 , 503,2 , {75,69,83},  2,3 , 7616,23 , 0,4 , 4,0 , 3716,6 , 2663,5 ,     2,     1,     6,     6,     7 }, // Luo/AnyScript/Kenya
+    {    211,     0,   221,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8222, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 23140,48 , 23188,152 , 134,24 , 23204,48 , 23252,152 , 320,24 , 14725,28 , 14753,74 , 14827,14 , 14725,28 , 14753,74 , 14827,14 , 0,2 , 0,2 , {85,71,88},  328,3 , 7160,26 , 4,4 , 74,5 , 3722,6 , 3428,6 ,     0,     0,     1,     6,     7 }, // Chiga/AnyScript/Uganda
+    {    212,     0,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 , 3728,8 , 3736,6 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/AnyScript/Morocco
+    {    212,     7,   145,    44,   160,    59,    37,    48,    45,    43,   101,  8216,  8217,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 26852,48 , 26900,86 , 26986,24 , 26916,48 , 26964,86 , 27050,24 , 17186,28 , 17214,48 , 17262,14 , 17186,28 , 17214,48 , 17262,14 , 494,9 , 505,10 , {77,65,68},  0,0 , 7639,22 , 25,5 , 4,0 , 3728,8 , 3736,6 ,     2,     1,     6,     5,     6 }, // Central Morocco Tamazight/Latin/Morocco
+    {    213,     0,   132,    46,   160,    59,    37,    48,    45,    43,   101,  8220,  8221,   171,   187, 0,6 , 0,6 , 0,6 , 0,6 , 364,8 , 99,16 , 37,5 , 8,10 , 26436,46 , 26482,88 , 26570,24 , 26500,46 , 26546,88 , 26634,24 , 17276,28 , 17304,54 , 17061,14 , 17276,28 , 17304,54 , 17061,14 , 486,6 , 497,6 , {88,79,70},  157,3 , 7593,23 , 0,4 , 4,0 , 3742,15 , 3705,5 ,     0,     0,     1,     6,     7 }, // Koyraboro Senni/AnyScript/Mali
+    {    214,     0,   210,    46,    44,    59,    37,    48,    45,    43,   101,    39,    39,  8220,  8221, 0,6 , 0,6 , 0,6 , 0,6 , 141,10 , 10,17 , 18,7 , 25,12 , 13613,48 , 27010,84 , 134,24 , 13764,48 , 27074,84 , 320,24 , 17358,28 , 17386,63 , 8909,14 , 17358,28 , 17386,63 , 8909,14 , 503,5 , 515,8 , {84,90,83},  290,3 , 6241,27 , 0,4 , 4,0 , 3757,9 , 2668,8 ,     0,     0,     1,     6,     7 }, // Shambala/AnyScript/Tanzania
+    {      0,      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,    0,0,    0,0,    0,0,   0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,     0,0,    0,0,    0,0,    0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0,   0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0, 0,0, 0,0 }  // trailing 0s
 };
 
 static const ushort list_pattern_part_data[] = {
@@ -4877,6 +4877,197 @@ static const ushort currency_format_data[] = {
 0x32, 0x25, 0x32, 0xa0, 0x2d, 0x25, 0x31, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x25,
 0x32, 0x2d, 0xa0, 0x25, 0x31
 };
+static const ushort endonyms_data[] = {
+0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e,
+0x69, 0x79, 0x61, 0x61, 0x51, 0x61, 0x66, 0x61, 0x72, 0x59, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x45, 0x72, 0x65, 0x74,
+0x72, 0x69, 0x61, 0x4f, 0x74, 0x6f, 0x62, 0x62, 0x69, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x53,
+0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x73, 0x68, 0x71,
+0x69, 0x70, 0x65, 0x53, 0x68, 0x71, 0x69, 0x70, 0xeb, 0x72, 0x69, 0x61, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2, 0x1275, 0x12ee, 0x1335,
+0x12eb, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x627, 0x644, 0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631,
+0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627,
+0x644, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x645, 0x635, 0x631, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642, 0x627, 0x644, 0x623, 0x631, 0x62f,
+0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x627, 0x644, 0x645,
+0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645, 0x627, 0x646, 0x642, 0x637, 0x631, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x633, 0x648,
+0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627, 0x644, 0x627, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627, 0x644, 0x639, 0x631,
+0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x645, 0x62a, 0x62d, 0x62f, 0x629, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x540, 0x561, 0x575, 0x565,
+0x580, 0x567, 0x576, 0x540, 0x561, 0x575, 0x561, 0x57d, 0x57f, 0x561, 0x576, 0x56b, 0x20, 0x540, 0x561, 0x576, 0x580, 0x561, 0x57a, 0x565,
+0x57f, 0x578, 0x582, 0x569, 0x56b, 0x582, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9df, 0x9be, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x61, 0x7a, 0x259,
+0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x63, 0x61, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x130,
+0x72, 0x61, 0x6e, 0x410, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61,
+0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7,
+0x9b6, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41, 0xf60, 0xf56, 0xfb2, 0xf74, 0xf42, 0x46, 0x72, 0x61, 0xf1,
+0x73, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1017, 0x1019,
+0x102c, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b,
+0x430, 0x440, 0x443, 0x441, 0x44c, 0x1797, 0x17b6, 0x179f, 0x17b6, 0x1781, 0x17d2, 0x1798, 0x17c2, 0x179a, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787,
+0x17b6, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x45, 0x73, 0x70, 0x61, 0x6e, 0x79, 0x61, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d, 0x83ef,
+0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x6fb3,
+0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x65b0, 0x52a0, 0x5761, 0x53f0, 0x7063, 0x4e2d, 0x6587, 0xff08, 0x7b80, 0x4f53, 0xff09, 0x4e2d, 0x56fd, 0x9999,
+0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd, 0x6fb3, 0x95e8, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x7e41, 0x9ad4, 0x4e2d, 0x6587, 0x68,
+0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x48, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69,
+0x6e, 0x61, 0x10c, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x72, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x6b, 0x61, 0x64, 0x61, 0x6e,
+0x73, 0x6b, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e,
+0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x56, 0x6c, 0x61, 0x61, 0x6d, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb,
+0x55, 0x2e, 0x53, 0x2e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e,
+0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d,
+0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69,
+0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x47, 0x75, 0x61, 0x6d,
+0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x49,
+0x6e, 0x64, 0x69, 0x61, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x4d, 0x61,
+0x6c, 0x74, 0x61, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d,
+0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x4e, 0x65, 0x77, 0x20, 0x5a,
+0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61,
+0x6e, 0x61, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50, 0x68,
+0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x6f,
+0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x61,
+0x6e, 0x64, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e,
+0x53, 0x2e, 0x20, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x73,
+0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x5a, 0x69, 0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0xd801, 0xdc0f, 0xd801, 0xdc2d, 0xd801, 0xdc4c, 0xd801, 0xdc34,
+0xd801, 0xdc3b, 0xd801, 0xdc32, 0xd801, 0xdc3c, 0x20, 0xd801, 0xdc1d, 0xd801, 0xdc3b, 0xd801, 0xdc29, 0xd801, 0xdc3b, 0xd801, 0xdc45, 0x65, 0x65, 0x73,
+0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f, 0x79,
+0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73,
+0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f,
+0x75, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52,
+0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x69, 0x6e, 0x65, 0x43, 0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61,
+0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f,
+0x75, 0x72, 0x67, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c, 0x69, 0x4d, 0x61, 0x72,
+0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x52, 0xe9,
+0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73,
+0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42,
+0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0xe9, 0x6d, 0x79, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69,
+0x6e, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8,
+0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75,
+0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x69, 0x73,
+0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69,
+0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x4c, 0x69, 0x65, 0x63, 0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65,
+0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72,
+0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x395,
+0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb, 0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0x6b,
+0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20,
+0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0, 0xaa4, 0x48, 0x61, 0x75,
+0x73, 0x61, 0x47, 0x61, 0x6e, 0x61, 0x4e, 0x69, 0x6a, 0x61, 0x72, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x53,
+0x75, 0x64, 0x61, 0x6e, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc, 0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940,
+0x92d, 0x93e, 0x930, 0x924, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a,
+0xe1, 0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x42, 0x61, 0x68, 0x61,
+0x73, 0x61, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69,
+0x61, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f,
+0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x61, 0x65e5, 0x672c, 0x8a9e, 0x65e5, 0x672c, 0xc95,
+0xca8, 0xccd, 0xca8, 0xca1, 0xcad, 0xcbe, 0xcb0, 0xca4, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442,
+0x430, 0x43d, 0x4b, 0x69, 0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x41a,
+0x44b, 0x440, 0x433, 0x44b, 0x437, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0xd55c, 0xad6d, 0xc5b4, 0xb300, 0xd55c,
+0xbbfc, 0xad6d, 0x643, 0x648, 0x631, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x6b, 0x75, 0x72, 0x64, 0xee, 0x54, 0x69, 0x72,
+0x6b, 0x69, 0x79, 0x65, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65, 0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69,
+0x6a, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0xe1,
+0x73, 0xe1, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x6c,
+0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e,
+0x43d, 0x441, 0x43a, 0x438, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61,
+0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0x42, 0x61, 0x68, 0x61, 0x73, 0x61,
+0x20, 0x4d, 0x65, 0x6c, 0x61, 0x79, 0x75, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x42, 0x72, 0x75, 0x6e, 0x65,
+0x69, 0xd2e, 0xd32, 0xd2f, 0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x92e, 0x930,
+0x93e, 0x920, 0x940, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x443, 0x43b, 0x441, 0x928,
+0x947, 0x92a, 0x93e, 0x932, 0x940, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d,
+0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x6f, 0x63, 0x63, 0x69, 0x74, 0x61, 0x6e, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61,
+0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e, 0xb30, 0xb24, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a,
+0x627, 0x646, 0x641, 0x627, 0x631, 0x633, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
+0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea,
+0x73, 0x20, 0x64, 0x6f, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x70, 0x6f, 0x72,
+0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4d, 0x6f,
+0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0xa2a, 0xa70, 0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646,
+0x62c, 0x627, 0x628, 0x67e, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x72, 0x75, 0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76,
+0x69, 0x7a, 0x72, 0x61, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20,
+0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x52, 0x6f, 0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438,
+0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434, 0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d,
+0x430, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea, 0x73, 0x65, 0x20, 0x74, 0xee, 0x20,
+0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b, 0x61, 0x938, 0x902, 0x938, 0x94d, 0x915, 0x943, 0x924, 0x20, 0x92d, 0x93e, 0x937, 0x93e,
+0x92d, 0x93e, 0x930, 0x924, 0x92e, 0x94d, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x20, 0x438,
+0x20, 0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x411, 0x43e, 0x441, 0x43d,
+0x430, 0x20, 0x438, 0x20, 0x425, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x53, 0x72, 0x70, 0x73, 0x6b,
+0x69, 0x43, 0x72, 0x6e, 0x61, 0x20, 0x47, 0x6f, 0x72, 0x61, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x426, 0x440, 0x43d, 0x430,
+0x20, 0x413, 0x43e, 0x440, 0x430, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f,
+0x76, 0x69, 0x6e, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x20, 0x69, 0x20, 0x43, 0x72, 0x6e, 0x61, 0x20, 0x47, 0x6f,
+0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x6f, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73,
+0x6b, 0x69, 0x53, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x53, 0x65, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x63, 0x68, 0x69,
+0x53, 0x68, 0x6f, 0x6e, 0x61, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf,
+0xdc0, 0x53, 0x69, 0x73, 0x77, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c,
+0x6f, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0xe1, 0x20, 0x72, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x6b, 0x61, 0x73, 0x6c, 0x6f,
+0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x53, 0x6f, 0x6f,
+0x6d, 0x61, 0x61, 0x6c, 0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x4a, 0x61, 0x62, 0x75, 0x75,
+0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x4b, 0x69, 0x69, 0x6e, 0x69, 0x79, 0x61, 0x65, 0x73, 0x70,
+0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f,
+0x6c, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x43, 0x68, 0x69,
+0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69, 0x63, 0x61,
+0x52, 0x65, 0x70, 0xfa, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x61,
+0x45, 0x63, 0x75, 0x61, 0x64, 0x6f, 0x72, 0x45, 0x6c, 0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47, 0x75,
+0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65,
+0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x73, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69,
+0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61,
+0x79, 0x50, 0x65, 0x72, 0xfa, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x45, 0x73, 0x74, 0x61,
+0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x56, 0x65, 0x6e,
+0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f,
+0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69,
+0x63, 0x61, 0x20, 0x79, 0x20, 0x65, 0x6c, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x65, 0x4b, 0x69, 0x73, 0x77, 0x61, 0x68,
+0x69, 0x6c, 0x69, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x73, 0x76, 0x65, 0x6e,
+0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0xba4, 0xbae, 0xbbf,
+0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x422, 0x430, 0x442, 0x430, 0x440,
+0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0x20, 0xc26, 0xc47, 0xc36, 0xc02, 0xe44, 0xe17, 0xe22, 0xf54, 0xf7c,
+0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275,
+0x130d, 0x122d, 0x129b, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x6f, 0x6e, 0x67,
+0x61, 0x58, 0x69, 0x74, 0x73, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69,
+0x79, 0x65, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x627,
+0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x40e, 0x437, 0x431, 0x435, 0x43a,
+0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x627, 0x6c9, 0x632, 0x628, 0x6d0, 0x6a9, 0x6f, 0x27, 0x7a, 0x62,
+0x65, 0x6b, 0x63, 0x68, 0x61, 0x4f, 0x2bf, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x54, 0x69, 0x1ebf, 0x6e,
+0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65,
+0x67, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x20, 0x46, 0x61, 0x77, 0x72, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73,
+0x61, 0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x301, 0xe8, 0x64, 0x65,
+0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e,
+0x67, 0x69, 0x7a, 0x69, 0x6d, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
+0x4e, 0x6f, 0x72, 0x65, 0x67, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x78b, 0x7a8, 0x788, 0x7ac, 0x780, 0x7a8, 0x784,
+0x7a6, 0x790, 0x7b0, 0x78b, 0x7a8, 0x788, 0x7ac, 0x780, 0x7a8, 0x20, 0x783, 0x7a7, 0x787, 0x7b0, 0x796, 0x7ac, 0x47, 0x61, 0x65, 0x6c,
+0x67, 0x52, 0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x6b, 0x65, 0x72, 0x6e, 0x65,
+0x77, 0x65, 0x6b, 0x41, 0x6b, 0x61, 0x6e, 0x47, 0x61, 0x61, 0x6e, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0x49, 0x67,
+0x62, 0x6f, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0x723, 0x718, 0x72a, 0x71d,
+0x71d, 0x710, 0x1265, 0x120a, 0x1295, 0x12a4, 0x122d, 0x1275, 0x122b, 0x130d, 0x12d5, 0x12dd, 0x129b, 0x53, 0x69, 0x64, 0x61, 0x61, 0x6d, 0x75,
+0x20, 0x41, 0x66, 0x6f, 0x49, 0x74, 0x69, 0x79, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x1275, 0x130d, 0x1228, 0x66, 0x75,
+0x72, 0x6c, 0x61, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x54, 0x73, 0x68, 0x69, 0x76, 0x65, 0x6e, 0x1e13, 0x61, 0x45,
+0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x54, 0x6f, 0x67, 0x6f, 0x64, 0x75, 0x12c8, 0x120b,
+0x12ed, 0x1273, 0x1271, 0x2bb, 0x14d, 0x6c, 0x65, 0x6c, 0x6f, 0x20, 0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d,
+0x65, 0x6c, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b, 0x20, 0x2bb, 0x49, 0x61, 0x46, 0x69, 0x6c, 0x69,
+0x70, 0x69, 0x6e, 0x6f, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a,
+0x65, 0x72, 0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0xa188, 0xa320, 0xa259, 0xa34f,
+0xa1e9, 0x50, 0x6c, 0x61, 0x74, 0x74, 0x64, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x44, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68,
+0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x69, 0x4e, 0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x6f, 0x74, 0x68,
+0x6f, 0x20, 0x73, 0x61, 0x20, 0x4c, 0x65, 0x62, 0x6f, 0x61, 0x64, 0x61, 0x76, 0x76, 0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67,
+0x69, 0x65, 0x6c, 0x6c, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x4e, 0x6f, 0x72, 0x67, 0x61, 0x45, 0x6b, 0x65, 0x67,
+0x75, 0x73, 0x69, 0x69, 0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x53, 0x65, 0x6e,
+0x65, 0x67, 0x61, 0x61, 0x6c, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x73,
+0x65, 0x6e, 0x61, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d, 0x62, 0x6f, 0x74, 0x61, 0x6d, 0x61, 0x7a, 0x69, 0x67, 0x68,
+0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49,
+0x2d31, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c, 0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x52, 0x75,
+0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x48, 0x69, 0x62, 0x65, 0x6e, 0x61,
+0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a, 0x6f, 0x62, 0x61,
+0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x13e3, 0x13b3, 0x13a9, 0x13a0, 0x13b9, 0x13f0, 0x13df,
+0x6b, 0x72, 0x65, 0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x43,
+0x68, 0x69, 0x6d, 0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65, 0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61,
+0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x4c, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61,
+0x49, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6b, 0x61, 0x62, 0x75, 0x76,
+0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61, 0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x4b, 0x129, 0x6d,
+0x129, 0x72, 0x169, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65,
+0x6e, 0x79, 0x61, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f, 0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69,
+0x62, 0x69, 0x61, 0x62, 0x4b, 0x69, 0x6d, 0x61, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68,
+0x6c, 0x61, 0x6e, 0x64, 0x4d, 0x61, 0x61, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f,
+0x67, 0x61, 0x4c, 0x75, 0x6c, 0x75, 0x68, 0x69, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54, 0x61, 0x64, 0x68, 0x61,
+0x6e, 0x69, 0x61, 0x4b, 0x69, 0x74, 0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20,
+0x63, 0x69, 0x69, 0x6e, 0x69, 0x4d, 0x61, 0x61, 0x6c, 0x69, 0x4b, 0x69, 0x72, 0x75, 0x77, 0x61, 0x44, 0x68, 0x6f, 0x6c,
+0x75, 0x6f, 0x52, 0x75, 0x6b, 0x69, 0x67, 0x61, 0x54, 0x61, 0x6d, 0x61, 0x7a, 0x69, 0x263, 0x74, 0x4d, 0x65, 0x1e5b, 0x1e5b,
+0x75, 0x6b, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4b, 0x69, 0x73,
+0x68, 0x61, 0x6d, 0x62, 0x61, 0x61
+};
 
 static const char language_name_list[] =
 "Default\0"
-- 
cgit v0.12


From a60a0ac6629c06f9e6a8199000bc6cd49190afe0 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 15:16:29 +0200
Subject: Use region name as a locale name on Mac.

This changes the behavior as before we were returning the name that we read
from System Preferences -> Language which represents the language for UI
translation.

Now that we have QLocale::uiLanguages() we don't need a hack that returned UI
language as a locale name.

This essentially reverts adb6eea3a135707a220c0b1c1cf8266321af9309.

Reviewed-by: con
---
 src/corelib/tools/qlocale_mac.mm | 31 -------------------------------
 1 file changed, 31 deletions(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 172997d..29d9a53 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -368,23 +368,6 @@ static QVariant macQuoteString(QSystemLocale::QueryType type, const QStringRef &
 }
 #endif //QT_NO_SYSTEMLOCALE
 
-static void getMacPreferredLanguageAndCountry(QString *language, QString *country)
-{
-    QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue(
-             CFSTR("AppleLanguages"),
-             kCFPreferencesAnyApplication,
-             kCFPreferencesCurrentUser,
-             kCFPreferencesAnyHost);
-    if (languages && CFArrayGetCount(languages) > 0) {
-        QCFType<CFLocaleRef> locale = CFLocaleCreate(kCFAllocatorDefault,
-                                                     CFStringRef(CFArrayGetValueAtIndex(languages, 0)));
-        if (language)
-            *language = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleLanguageCode)));
-        if (country)
-            *country = QCFString::toQString(CFStringRef(CFLocaleGetValue(locale, kCFLocaleCountryCode)));
-    }
-}
-
 #ifndef QT_NO_SYSTEMLOCALE
 
 QLocale QSystemLocale::fallbackLocale() const
@@ -432,20 +415,6 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
     case PositiveSign:
     case ZeroDigit:
         break;
-    case LanguageId:
-    case CountryId: {
-        QString preferredLanguage;
-        QString preferredCountry;
-        getMacPreferredLanguageAndCountry(&preferredLanguage, &preferredCountry);
-        QLocale::Language languageCode = (preferredLanguage.isEmpty() ? QLocale::C : QLocalePrivate::codeToLanguage(preferredLanguage));
-        QLocale::Country countryCode = (preferredCountry.isEmpty() ? QLocale::AnyCountry : QLocalePrivate::codeToCountry(preferredCountry));
-        const QLocalePrivate *d = QLocalePrivate::findLocale(languageCode, QLocale::AnyScript, countryCode);
-        if (type == LanguageId)
-            return (QLocale::Language)d->languageId();
-        return (QLocale::Country)d->countryId();
-    }
-    case ScriptId:
-        return QVariant(QLocale::AnyScript);
 
     case MeasurementSystem:
         return QVariant(static_cast<int>(macMeasurementSystem()));
-- 
cgit v0.12


From 213609fa5c8b4e701115cfbb117559bc5dba4a54 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 15:44:38 +0200
Subject: Fixed checking for default arguments in QLocale::toCurrencyString()

We should check whether we got the default argument or the empty string that
was provided by the user as toCurrencyString(123, QString(""))

Reviewed-by: Zeno Albisser
---
 src/corelib/tools/qlocale.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 197c742..d986b9b 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -3130,7 +3130,7 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
         value = -value;
     }
     QString str = d->longLongToString(value);
-    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    QString sym = symbol.isNull() ? currencySymbol() : symbol;
     if (sym.isEmpty())
         sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
@@ -3155,7 +3155,7 @@ QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
     quint8 idx = d->m_currency_format_idx;
     quint8 size = d->m_currency_format_size;
     QString str = d->unsLongLongToString(value);
-    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    QString sym = symbol.isNull() ? currencySymbol() : symbol;
     if (sym.isEmpty())
         sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
@@ -3186,7 +3186,7 @@ QString QLocale::toCurrencyString(double value, const QString &symbol) const
     }
     QString str = d->doubleToString(value, d->m_currency_digits,
                                     QLocalePrivate::DFDecimal);
-    QString sym = symbol.isEmpty() ? currencySymbol() : symbol;
+    QString sym = symbol.isNull() ? currencySymbol() : symbol;
     if (sym.isEmpty())
         sym = currencySymbol(QLocale::CurrencyIsoCode);
     QString format = getLocaleData(currency_format_data + idx, size);
-- 
cgit v0.12


From 96373c2aac8b26b00337fc74a163bb2ff468ef24 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 16:28:29 +0200
Subject: Changed the #ifdef block in QLocale to check for Q_OS_WIN instead of
 WS.

Reviewed-by: Jeremy Katz
---
 src/corelib/tools/qlocale_win.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 3325419..4a21561 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -50,7 +50,7 @@
 
 #include "qdebug.h"
 
-#if defined(Q_WS_WIN)
+#if defined(Q_OS_WIN)
 #   include "qt_windows.h"
 #   include <time.h>
 #endif
-- 
cgit v0.12


From 2e90e8dda26721dcab4842f9ac3eeadecfadd80f Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 29 Mar 2011 16:59:05 +0200
Subject: Improved documentation for new QTranslator::load() overload

Reviewed-by: trustme
---
 src/corelib/kernel/qtranslator.cpp | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 802cf1c..fcb455f 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -595,10 +595,10 @@ static QString find_translation(const QLocale & locale,
 /*!
     \since 4.8
 
-    Loads \a filename + \a prefix + \a locale name + \a suffix (".qm" if the \a
-    suffix is not specified), which may be an absolute file name or relative to
-    \a directory. Returns true if the translation is successfully loaded;
-    otherwise returns false.
+    Loads \a filename + \a prefix + \a \l{QLocale::uiLanguages()}{ui language
+    name} + \a suffix (".qm" if the \a suffix is not specified), which may be
+    an absolute file name or relative to \a directory. Returns true if the
+    translation is successfully loaded; otherwise returns false.
 
     The previous contents of this translator object are discarded.
 
@@ -607,15 +607,16 @@ static QString find_translation(const QLocale & locale,
 
     \list 1
     \o File name without \a suffix appended.
-    \o File name with locale part after a "_" character stripped and \a suffix.
-    \o File name with locale part stripped without \a suffix appended.
-    \o File name with locale part stripped further, etc.
+    \o File name with ui language part after a "_" character stripped and \a suffix.
+    \o File name with ui language part stripped without \a suffix appended.
+    \o File name with ui language part stripped further, etc.
     \endlist
 
     For example, an application running in the locale with the following
     l{QLocale::uiLanguages()}{ui languages} - "es", "fr-CA", "de" might call
     load(QLocale::system(), "foo", ".", "/opt/foolib", ".qm"). load() would
-    then try to open the first existing readable file from this list:
+    replace '-' (dash) with '_' (underscore) in the ui language and then try to
+    open the first existing readable file from this list:
 
     \list 1
     \o \c /opt/foolib/foo.es.qm
-- 
cgit v0.12


From 2ac622fae920ac038e6d5afb4db9df2e3b896514 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 29 Mar 2011 18:25:11 +0200
Subject: Threaded event handling and improved error reporting in XCB plugin.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp    | 233 +++++++++++++++++++++++-
 src/plugins/platforms/xcb/qxcbconnection.h      |  20 +-
 src/plugins/platforms/xcb/qxcbscreen.cpp        |   3 +-
 src/plugins/platforms/xcb/qxcbwindow.cpp        |  44 ++---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp |  18 ++
 src/plugins/platforms/xcb/qxcbwindowsurface.h   |   1 +
 6 files changed, 284 insertions(+), 35 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 2bdd6d4..1ac73c9 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -76,6 +76,7 @@ extern "C" {
 
 QXcbConnection::QXcbConnection(const char *displayName)
     : m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
+    , m_enabled(true)
 #ifdef XCB_USE_DRI2
     , m_dri2_major(0)
     , m_dri2_minor(0)
@@ -112,8 +113,11 @@ QXcbConnection::QXcbConnection(const char *displayName)
         xcb_screen_next(&it);
     }
 
-    QSocketNotifier *socket = new QSocketNotifier(xcb_get_file_descriptor(xcb_connection()), QSocketNotifier::Read, this);
-    connect(socket, SIGNAL(activated(int)), this, SLOT(eventDispatcher()));
+    m_connectionEventListener = xcb_generate_id(xcb_connection());
+    xcb_create_window(xcb_connection(), XCB_COPY_FROM_PARENT,
+                      m_connectionEventListener, m_screens.at(0)->root(),
+                      0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_ONLY,
+                      m_screens.at(0)->screen()->root_visual, 0, 0);
 
     m_keyboard = new QXcbKeyboard(this);
 
@@ -122,10 +126,47 @@ QXcbConnection::QXcbConnection(const char *displayName)
 #ifdef XCB_USE_DRI2
     initializeDri2();
 #endif
+
+    start();
+}
+
+void QXcbConnection::sendConnectionEvent(QXcbAtom::Atom atom)
+{
+    xcb_client_message_event_t event;
+    memset(&event, 0, sizeof(event));
+
+    event.response_type = XCB_CLIENT_MESSAGE;
+    event.format = 32;
+    event.sequence = 0;
+    event.window = m_connectionEventListener;
+    event.type = atom;
+
+    xcb_send_event(xcb_connection(), false, m_connectionEventListener, XCB_EVENT_MASK_NO_EVENT, (const char *)&event);
+
+    xcb_flush(xcb_connection());
+}
+
+void QXcbConnection::setEventProcessingEnabled(bool enabled)
+{
+    if (enabled == m_enabled)
+        return;
+
+    if (!enabled) {
+        m_connectionLock.lock();
+        sendConnectionEvent(QXcbAtom::_QT_PAUSE_CONNECTION);
+    } else {
+        m_connectionLock.unlock();
+    }
+
+    m_enabled = enabled;
 }
 
 QXcbConnection::~QXcbConnection()
 {
+    sendConnectionEvent(QXcbAtom::_QT_CLOSE_CONNECTION);
+    wait();
+
+    xcb_destroy_window(xcb_connection(), m_connectionEventListener);
     qDeleteAll(m_screens);
 
 #ifdef XCB_USE_XLIB
@@ -168,7 +209,7 @@ void printXcbEvent(const char *message, xcb_generic_event_t *event)
 #ifdef XCB_EVENT_DEBUG
 #define PRINT_XCB_EVENT(event) \
     case event: \
-        printf("%s: %d - %s\n", message, event, #event); \
+        printf("%s: %d - %s\n", message, int(event), #event); \
         break;
 
     switch (event->response_type & ~0x80) {
@@ -205,7 +246,7 @@ void printXcbEvent(const char *message, xcb_generic_event_t *event)
     PRINT_XCB_EVENT(XCB_CLIENT_MESSAGE);
     PRINT_XCB_EVENT(XCB_MAPPING_NOTIFY);
     default:
-        printf("%s: %d - %s\n", message, event->response_type, "unknown");
+        printf("%s: unknown event - response_type: %d - sequence: %d\n", message, int(event->response_type & ~0x80), int(event->sequence));
     }
 #else
     Q_UNUSED(message);
@@ -213,11 +254,185 @@ void printXcbEvent(const char *message, xcb_generic_event_t *event)
 #endif
 }
 
-void QXcbConnection::eventDispatcher()
+const char *xcb_errors[] =
 {
-    while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
+    "Success",
+    "BadRequest",
+    "BadValue",
+    "BadWindow",
+    "BadPixmap",
+    "BadAtom",
+    "BadCursor",
+    "BadFont",
+    "BadMatch",
+    "BadDrawable",
+    "BadAccess",
+    "BadAlloc",
+    "BadColor",
+    "BadGC",
+    "BadIDChoice",
+    "BadName",
+    "BadLength",
+    "BadImplementation",
+    "Unknown"
+};
+
+const char *xcb_protocol_request_codes[] =
+{
+    "CreateWindow",
+    "ChangeWindowAttributes",
+    "GetWindowAttributes",
+    "DestroyWindow",
+    "DestroySubwindows",
+    "ChangeSaveSet",
+    "ReparentWindow",
+    "MapWindow",
+    "MapSubwindows",
+    "UnmapWindow",
+    "UnmapSubwindows",
+    "ConfigureWindow",
+    "CirculateWindow",
+    "GetGeometry",
+    "QueryTree",
+    "InternAtom",
+    "GetAtomName",
+    "ChangeProperty",
+    "DeleteProperty",
+    "GetProperty",
+    "ListProperties",
+    "SetSelectionOwner",
+    "GetSelectionOwner",
+    "ConvertSelection",
+    "SendEvent",
+    "GrabPointer",
+    "UngrabPointer",
+    "GrabButton",
+    "UngrabButton",
+    "ChangeActivePointerGrab",
+    "GrabKeyboard",
+    "UngrabKeyboard",
+    "GrabKey",
+    "UngrabKey",
+    "AllowEvents",
+    "GrabServer",
+    "UngrabServer",
+    "QueryPointer",
+    "GetMotionEvents",
+    "TranslateCoords",
+    "WarpPointer",
+    "SetInputFocus",
+    "GetInputFocus",
+    "QueryKeymap",
+    "OpenFont",
+    "CloseFont",
+    "QueryFont",
+    "QueryTextExtents",
+    "ListFonts",
+    "ListFontsWithInfo",
+    "SetFontPath",
+    "GetFontPath",
+    "CreatePixmap",
+    "FreePixmap",
+    "CreateGC",
+    "ChangeGC",
+    "CopyGC",
+    "SetDashes",
+    "SetClipRectangles",
+    "FreeGC",
+    "ClearArea",
+    "CopyArea",
+    "CopyPlane",
+    "PolyPoint",
+    "PolyLine",
+    "PolySegment",
+    "PolyRectangle",
+    "PolyArc",
+    "FillPoly",
+    "PolyFillRectangle",
+    "PolyFillArc",
+    "PutImage",
+    "GetImage",
+    "PolyText8",
+    "PolyText16",
+    "ImageText8",
+    "ImageText16",
+    "CreateColormap",
+    "FreeColormap",
+    "CopyColormapAndFree",
+    "InstallColormap",
+    "UninstallColormap",
+    "ListInstalledColormaps",
+    "AllocColor",
+    "AllocNamedColor",
+    "AllocColorCells",
+    "AllocColorPlanes",
+    "FreeColors",
+    "StoreColors",
+    "StoreNamedColor",
+    "QueryColors",
+    "LookupColor",
+    "CreateCursor",
+    "CreateGlyphCursor",
+    "FreeCursor",
+    "RecolorCursor",
+    "QueryBestSize",
+    "QueryExtension",
+    "ListExtensions",
+    "ChangeKeyboardMapping",
+    "GetKeyboardMapping",
+    "ChangeKeyboardControl",
+    "GetKeyboardControl",
+    "Bell",
+    "ChangePointerControl",
+    "GetPointerControl",
+    "SetScreenSaver",
+    "GetScreenSaver",
+    "ChangeHosts",
+    "ListHosts",
+    "SetAccessControl",
+    "SetCloseDownMode",
+    "KillClient",
+    "RotateProperties",
+    "ForceScreenSaver",
+    "SetPointerMapping",
+    "GetPointerMapping",
+    "SetModifierMapping",
+    "GetModifierMapping",
+    "NoOperation",
+    "Unknown"
+};
+
+void QXcbConnection::run()
+{
+    while (xcb_generic_event_t *event = xcb_wait_for_event(xcb_connection())) {
         bool handled = true;
-        switch (event->response_type & ~0x80) {
+
+        uint response_type = event->response_type & ~0x80;
+
+        if (!response_type) {
+            xcb_generic_error_t *error = (xcb_generic_error_t *)event;
+
+            uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
+            uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
+
+            printf("XCB error: %d (%s), resource id: %d, major code: %d (%s), minor code: %d\n",
+                   int(error->error_code), xcb_errors[clamped_error_code], int(error->resource_id),
+                   int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
+                   int(error->minor_code));
+            continue;
+        }
+
+        if (response_type == XCB_CLIENT_MESSAGE
+            && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_CLOSE_CONNECTION)
+            return;
+
+        if (response_type == XCB_CLIENT_MESSAGE
+            && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_PAUSE_CONNECTION)
+        {
+            QMutexLocker locker(&m_connectionLock);
+        }
+
+        switch (response_type) {
         case XCB_EXPOSE:
             HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
         case XCB_BUTTON_PRESS:
@@ -254,6 +469,7 @@ void QXcbConnection::eventDispatcher()
         else
             printXcbEvent("Unhandled XCB event", event);
     }
+    fprintf(stderr, "I/O error in xcb_wait_for_event\n");
 }
 
 static const char * xcb_atomnames = {
@@ -295,6 +511,9 @@ static const char * xcb_atomnames = {
     "_QT_SCROLL_DONE\0"
     "_QT_INPUT_ENCODING\0"
 
+    "_QT_CLOSE_CONNECTION\0"
+    "_QT_PAUSE_CONNECTION\0"
+
     "_MOTIF_WM_HINTS\0"
 
     "DTWM_IS_RUNNING\0"
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index e00fbb1..a36694d 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -45,7 +45,8 @@
 #include <xcb/xcb.h>
 
 #include <QList>
-#include <QObject>
+#include <QMutex>
+#include <QThread>
 
 class QXcbScreen;
 
@@ -89,6 +90,10 @@ namespace QXcbAtom {
         _QT_SCROLL_DONE,
         _QT_INPUT_ENCODING,
 
+        // Qt/XCB specific
+        _QT_CLOSE_CONNECTION,
+        _QT_PAUSE_CONNECTION,
+
         _MOTIF_WM_HINTS,
 
         DTWM_IS_RUNNING,
@@ -214,7 +219,7 @@ namespace QXcbAtom {
 
 class QXcbKeyboard;
 
-class QXcbConnection : public QObject
+class QXcbConnection : public QThread
 {
     Q_OBJECT
 public:
@@ -232,6 +237,8 @@ public:
 
     QXcbKeyboard *keyboard() const { return m_keyboard; }
 
+    void setEventProcessingEnabled(bool enabled);
+
 #ifdef XCB_USE_XLIB
     void *xlib_display() const { return m_xlib_display; }
 #endif
@@ -247,11 +254,12 @@ public:
     void *egl_display() const { return m_egl_display; }
 #endif
 
-private slots:
-    void eventDispatcher();
+protected:
+    void run();
 
 private:
     void initializeAllAtoms();
+    void sendConnectionEvent(QXcbAtom::Atom atom);
 #ifdef XCB_USE_DRI2
     void initializeDri2();
 #endif
@@ -266,6 +274,10 @@ private:
 
     QByteArray m_displayName;
 
+    xcb_window_t m_connectionEventListener;
+    QMutex m_connectionLock;
+    bool m_enabled;
+
     QXcbKeyboard *m_keyboard;
 
 #if defined(XCB_USE_XLIB)
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index fffeb2e..49ed44c 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -60,8 +60,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, xcb_screen_t *screen, int num
     const quint32 mask = XCB_CW_EVENT_MASK;
     const quint32 values[] = {
         // XCB_CW_EVENT_MASK
-        XCB_EVENT_MASK_KEYMAP_STATE
-        | XCB_EVENT_MASK_ENTER_WINDOW
+        XCB_EVENT_MASK_ENTER_WINDOW
         | XCB_EVENT_MASK_LEAVE_WINDOW
         | XCB_EVENT_MASK_PROPERTY_CHANGE
     };
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index b6c133f..54a4d7f 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -111,9 +111,11 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 
 #if defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
     if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
-       && QApplicationPrivate::platformIntegration()->hasOpenGL() ) {
+        && QApplicationPrivate::platformIntegration()->hasOpenGL())
+    {
+        connection()->setEventProcessingEnabled(false);
 #if defined(XCB_USE_GLX)
-            XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
+        XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
 #elif defined(XCB_USE_EGL)
         EGLDisplay eglDisplay = connection()->egl_display();
         EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,tlw->platformWindowFormat(),true);
@@ -127,19 +129,20 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
         int matchingCount = 0;
         visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
 #endif //XCB_USE_GLX
-            if (visualInfo) {
-                Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), m_screen->root(), visualInfo->visual, AllocNone);
-
-                XSetWindowAttributes a;
-                a.colormap = cmap;
-                m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), tlw->x(), tlw->y(), tlw->width(), tlw->height(),
-                                          0, visualInfo->depth, InputOutput, visualInfo->visual,
-                                          CWColormap, &a);
-
-                printf("created GL window: %d\n", m_window);
-            } else {
-                qFatal("no window!");
-            }
+        if (visualInfo) {
+            Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), m_screen->root(), visualInfo->visual, AllocNone);
+
+            XSetWindowAttributes a;
+            a.colormap = cmap;
+            m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), tlw->x(), tlw->y(), tlw->width(), tlw->height(),
+                                      0, visualInfo->depth, InputOutput, visualInfo->visual,
+                                      CWColormap, &a);
+
+            printf("created GL window: %d\n", m_window);
+        } else {
+            qFatal("no window!");
+        }
+        connection()->setEventProcessingEnabled(true);
     } else
 #endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
     {
@@ -428,13 +431,12 @@ QPlatformGLContext *QXcbWindow::glContext() const
         printf("no opengl\n");
         return 0;
     }
-#if defined(XCB_USE_GLX)
     if (!m_context) {
+        connection()->setEventProcessingEnabled(false);
+#if defined(XCB_USE_GLX)
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
         that->m_context = new QGLXContext(m_window, m_screen, widget()->platformWindowFormat());
-    }
 #elif defined(XCB_USE_EGL)
-    if (!m_context) {
         EGLDisplay display = connection()->egl_display();
         EGLConfig config = q_configFromQPlatformWindowFormat(display,widget()->platformWindowFormat(),true);
         QVector<EGLint> eglContextAttrs;
@@ -445,14 +447,12 @@ QPlatformGLContext *QXcbWindow::glContext() const
         EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)m_window,0);
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
         that->m_context = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API);
-    }
 #elif defined(XCB_USE_DRI2)
-    if (!m_context) {
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
         that->m_context = new QDri2Context(that);
-    }
-
 #endif
+        connection()->setEventProcessingEnabled(true);
+    }
     return m_context;
 }
 
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 7fed230..6bacf3d 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -44,6 +44,7 @@
 #include "qxcbconnection.h"
 #include "qxcbscreen.h"
 #include "qxcbwindow.h"
+#include "qmutex.h"
 
 #include <xcb/shm.h>
 #include <xcb/xcb_image.h>
@@ -64,6 +65,9 @@ public:
     void put(xcb_window_t window, const QPoint &dst, const QRect &source);
     void preparePaint(const QRegion &region);
 
+    void lock() { m_surfaceLock.lock(); }
+    void unlock() { m_surfaceLock.unlock(); }
+
 private:
     void destroy();
 
@@ -77,6 +81,7 @@ private:
     xcb_window_t m_gc_window;
 
     QRegion m_dirty;
+    QMutex m_surfaceLock;
 };
 
 QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
@@ -174,9 +179,15 @@ QPaintDevice *QXcbWindowSurface::paintDevice()
 
 void QXcbWindowSurface::beginPaint(const QRegion &region)
 {
+    m_image->lock();
     m_image->preparePaint(region);
 }
 
+void QXcbWindowSurface::endPaint(const QRegion &)
+{
+    m_image->unlock();
+}
+
 void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(region);
@@ -187,9 +198,13 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     extern QWidgetData* qt_widget_data(QWidget *);
     QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
 
+    m_image->lock();
+
     QVector<QRect> rects = region.rects();
     for (int i = 0; i < rects.size(); ++i)
         m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
+
+    m_image->unlock();
 }
 
 void QXcbWindowSurface::resize(const QSize &size)
@@ -198,6 +213,9 @@ void QXcbWindowSurface::resize(const QSize &size)
 
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
 
+    if (m_image)
+        m_image->lock();
+
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
 }
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
index 61689b1..f87e122 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.h
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -62,6 +62,7 @@ public:
     bool scroll(const QRegion &area, int dx, int dy);
 
     void beginPaint(const QRegion &);
+    void endPaint(const QRegion &);
 
 private:
     QXcbShmImage *m_image;
-- 
cgit v0.12


From c25609217e99f890431c0170fea585b3e86822ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 09:53:55 +0200
Subject: Remove unnecessary setters in XCB plugin.

These are the default settings in qwindowsurface.cpp anyway, and the
explicit setters are about to be replaced by a features() function.
---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 6bacf3d..e1ebce2 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -161,9 +161,6 @@ QXcbWindowSurface::QXcbWindowSurface(QWidget *widget, bool setDefaultSurface)
     : QWindowSurface(widget, setDefaultSurface)
     , m_image(0)
 {
-    setStaticContentsSupport(false);
-    setPartialUpdateSupport(true);
-
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(widget));
     setConnection(screen->connection());
 }
-- 
cgit v0.12


From b35988fe3299b2f76fb29507ca46298c2bef47df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 12:29:27 +0200
Subject: Added X error tracking to XCB platform.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp    |  37 +++++++--
 src/plugins/platforms/xcb/qxcbconnection.h      |  32 ++++++-
 src/plugins/platforms/xcb/qxcbwindow.cpp        | 106 ++++++++++++------------
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp |  14 ++--
 4 files changed, 122 insertions(+), 67 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 1ac73c9..9924b1e 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -207,9 +207,9 @@ break;
 void printXcbEvent(const char *message, xcb_generic_event_t *event)
 {
 #ifdef XCB_EVENT_DEBUG
-#define PRINT_XCB_EVENT(event) \
-    case event: \
-        printf("%s: %d - %s\n", message, int(event), #event); \
+#define PRINT_XCB_EVENT(ev) \
+    case ev: \
+        printf("%s: %d - %s - sequence: %d\n", message, int(ev), #ev, event->sequence); \
         break;
 
     switch (event->response_type & ~0x80) {
@@ -402,6 +402,16 @@ const char *xcb_protocol_request_codes[] =
     "Unknown"
 };
 
+void QXcbConnection::log(const char *file, int line, int sequence)
+{
+    CallInfo info;
+    info.sequence = sequence;
+    info.file = file;
+    info.line = line;
+
+    m_callLog << info;
+}
+
 void QXcbConnection::run()
 {
     while (xcb_generic_event_t *event = xcb_wait_for_event(xcb_connection())) {
@@ -415,13 +425,30 @@ void QXcbConnection::run()
             uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
             uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
 
-            printf("XCB error: %d (%s), resource id: %d, major code: %d (%s), minor code: %d\n",
-                   int(error->error_code), xcb_errors[clamped_error_code], int(error->resource_id),
+            printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
+                   int(error->error_code), xcb_errors[clamped_error_code],
+                   int(error->sequence), int(error->resource_id),
                    int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
                    int(error->minor_code));
+#ifdef Q_XCB_DEBUG
+            for (int i = 0; i < m_callLog.size(); ++i) {
+                if (m_callLog.at(i).sequence == error->sequence) {
+                    printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                    break;
+                }
+            }
+#endif
             continue;
         }
 
+#ifdef Q_XCB_DEBUG
+        int i = 0;
+        for (; i < m_callLog.size(); ++i)
+            if (m_callLog.at(i).sequence >= event->sequence)
+                break;
+        m_callLog.remove(0, i);
+#endif
+
         if (response_type == XCB_CLIENT_MESSAGE
             && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_CLOSE_CONNECTION)
             return;
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index a36694d..0a7efd5 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -1,5 +1,4 @@
-/****************************************************************************
-**
+/**************************************************************************** **
 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
@@ -46,8 +45,11 @@
 
 #include <QList>
 #include <QMutex>
+#include <QVector>
 #include <QThread>
 
+#define Q_XCB_DEBUG
+
 class QXcbScreen;
 
 namespace QXcbAtom {
@@ -295,10 +297,36 @@ private:
     void *m_egl_display;
     bool m_has_egl;
 #endif
+#ifdef Q_XCB_DEBUG
+    struct CallInfo {
+        int sequence;
+        QByteArray file;
+        int line;
+    };
+    QVector<CallInfo> m_callLog;
+    void log(const char *file, int line, int sequence);
+    template <typename cookie_t>
+    friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line);
+#endif
 };
 
 #define DISPLAY_FROM_XCB(object) ((Display *)(object->connection()->xlib_display()))
 
+#ifdef Q_XCB_DEBUG
+template <typename cookie_t>
+cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line)
+{
+    connection->log(file, line, cookie.sequence);
+    return cookie;
+}
+#define Q_XCB_CALL(x) q_xcb_call_template(x, connection(), __FILE__, __LINE__)
+#define Q_XCB_CALL2(x, connection) q_xcb_call_template(x, connection, __FILE__, __LINE__)
+#else
+#define Q_XCB_CALL(x) x
+#define Q_XCB_CALL2(x, connection) x
+#endif
+
+
 #if defined(XCB_USE_DRI2) || defined(XCB_USE_EGL)
 #define EGL_DISPLAY_FROM_XCB(object) ((EGLDisplay)(object->connection()->egl_display()))
 #endif //endifXCB_USE_DRI2
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 54a4d7f..710d531 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -148,24 +148,24 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     {
         m_window = xcb_generate_id(xcb_connection());
 
-        xcb_create_window(xcb_connection(),
-                          XCB_COPY_FROM_PARENT,            // depth -- same as root
-                          m_window,                        // window id
-                          m_screen->root(),                // parent window id
-                          tlw->x(),
-                          tlw->y(),
-                          tlw->width(),
-                          tlw->height(),
-                          0,                               // border width
-                          XCB_WINDOW_CLASS_INPUT_OUTPUT,   // window class
-                          m_screen->screen()->root_visual, // visual
-                          0,                               // value mask
-                          0);                              // value list
+        Q_XCB_CALL(xcb_create_window(xcb_connection(),
+                                     XCB_COPY_FROM_PARENT,            // depth -- same as root
+                                     m_window,                        // window id
+                                     m_screen->root(),                // parent window id
+                                     tlw->x(),
+                                     tlw->y(),
+                                     tlw->width(),
+                                     tlw->height(),
+                                     0,                               // border width
+                                     XCB_WINDOW_CLASS_INPUT_OUTPUT,   // window class
+                                     m_screen->screen()->root_visual, // visual
+                                     0,                               // value mask
+                                     0));                             // value list
 
         printf("created regular window: %d\n", m_window);
     }
 
-    xcb_change_window_attributes(xcb_connection(), m_window, mask, values);
+    Q_XCB_CALL(xcb_change_window_attributes(xcb_connection(), m_window, mask, values));
 
     xcb_atom_t properties[4];
     int propertyCount = 0;
@@ -176,22 +176,22 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint)
         properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP);
 
-    xcb_change_property(xcb_connection(),
-                        XCB_PROP_MODE_REPLACE,
-                        m_window,
-                        atom(QXcbAtom::WM_PROTOCOLS),
-                        4,
-                        32,
-                        propertyCount,
-                        properties);
+    Q_XCB_CALL(xcb_change_property(xcb_connection(),
+                                   XCB_PROP_MODE_REPLACE,
+                                   m_window,
+                                   atom(QXcbAtom::WM_PROTOCOLS),
+                                   4,
+                                   32,
+                                   propertyCount,
+                                   properties));
 
     if (isTransient(tlw) && tlw->parentWidget()) {
         // ICCCM 4.1.2.6
         QWidget *p = tlw->parentWidget()->window();
         xcb_window_t parentWindow = p->winId();
-        xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
-                            XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
-                            1, &parentWindow);
+        Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+                                       XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
+                                       1, &parentWindow));
 
     }
 }
@@ -199,7 +199,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 QXcbWindow::~QXcbWindow()
 {
     delete m_context;
-    xcb_destroy_window(xcb_connection(), m_window);
+    Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
 }
 
 void QXcbWindow::setGeometry(const QRect &rect)
@@ -209,7 +209,7 @@ void QXcbWindow::setGeometry(const QRect &rect)
     const quint32 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
     const quint32 values[] = { rect.x(), rect.y(), rect.width(), rect.height() };
 
-    xcb_configure_window(xcb_connection(), m_window, mask, values);
+    Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
 }
 
 void QXcbWindow::setVisible(bool visible)
@@ -221,12 +221,12 @@ void QXcbWindow::setVisible(bool visible)
         else
             xcb_wm_hints_set_normal(&hints);
         xcb_set_wm_hints(xcb_connection(), m_window, &hints);
-        xcb_map_window(xcb_connection(), m_window);
+        Q_XCB_CALL(xcb_map_window(xcb_connection(), m_window));
 #if defined(XCB_USE_GLX)
         glXWaitX();
 #endif
     } else {
-        xcb_unmap_window(xcb_connection(), m_window);
+        Q_XCB_CALL(xcb_unmap_window(xcb_connection(), m_window));
 
         // send synthetic UnmapNotify event according to icccm 4.1.4
         xcb_unmap_notify_event_t event;
@@ -235,8 +235,8 @@ void QXcbWindow::setVisible(bool visible)
         event.event = m_screen->root();
         event.window = m_window;
         event.from_configure = false;
-        xcb_send_event(xcb_connection(), false, m_screen->root(),
-                       XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&event);
+        Q_XCB_CALL(xcb_send_event(xcb_connection(), false, m_screen->root(),
+                                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&event));
 
         xcb_flush(xcb_connection());
     }
@@ -360,23 +360,23 @@ Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
     }
 
     if (mwmhints.flags != 0l) {
-        xcb_change_property(xcb_connection(),
-                            XCB_PROP_MODE_REPLACE,
-                            m_window,
-                            atom(QXcbAtom::_MOTIF_WM_HINTS),
-                            atom(QXcbAtom::_MOTIF_WM_HINTS),
-                            32,
-                            5,
-                            &mwmhints);
+        Q_XCB_CALL(xcb_change_property(xcb_connection(),
+                                       XCB_PROP_MODE_REPLACE,
+                                       m_window,
+                                       atom(QXcbAtom::_MOTIF_WM_HINTS),
+                                       atom(QXcbAtom::_MOTIF_WM_HINTS),
+                                       32,
+                                       5,
+                                       &mwmhints));
     } else {
-        xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_MOTIF_WM_HINTS));
+        Q_XCB_CALL(xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_MOTIF_WM_HINTS)));
     }
 
     if (popup || tooltip) {
         const quint32 mask = XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER;
         const quint32 values[] = { true, true };
 
-        xcb_change_window_attributes(xcb_connection(), m_window, mask, values);
+        Q_XCB_CALL(xcb_change_window_attributes(xcb_connection(), m_window, mask, values));
     }
 
     return QPlatformWindow::setWindowFlags(flags);
@@ -390,39 +390,39 @@ WId QXcbWindow::winId() const
 void QXcbWindow::setParent(const QPlatformWindow *parent)
 {
     QPoint topLeft = geometry().topLeft();
-    xcb_reparent_window(xcb_connection(), window(), static_cast<const QXcbWindow *>(parent)->window(), topLeft.x(), topLeft.y());
+    Q_XCB_CALL(xcb_reparent_window(xcb_connection(), window(), static_cast<const QXcbWindow *>(parent)->window(), topLeft.x(), topLeft.y()));
 }
 
 void QXcbWindow::setWindowTitle(const QString &title)
 {
     QByteArray ba = title.toUtf8();
-    xcb_change_property (xcb_connection(),
-                         XCB_PROP_MODE_REPLACE,
-                         m_window,
-                         atom(QXcbAtom::_NET_WM_NAME),
-                         atom(QXcbAtom::UTF8_STRING),
-                         8,
-                         ba.length(),
-                         ba.constData());
+    Q_XCB_CALL(xcb_change_property(xcb_connection(),
+                                   XCB_PROP_MODE_REPLACE,
+                                   m_window,
+                                   atom(QXcbAtom::_NET_WM_NAME),
+                                   atom(QXcbAtom::UTF8_STRING),
+                                   8,
+                                   ba.length(),
+                                   ba.constData()));
 }
 
 void QXcbWindow::raise()
 {
     const quint32 mask = XCB_CONFIG_WINDOW_STACK_MODE;
     const quint32 values[] = { XCB_STACK_MODE_ABOVE };
-    xcb_configure_window(xcb_connection(), m_window, mask, values);
+    Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
 }
 
 void QXcbWindow::lower()
 {
     const quint32 mask = XCB_CONFIG_WINDOW_STACK_MODE;
     const quint32 values[] = { XCB_STACK_MODE_BELOW };
-    xcb_configure_window(xcb_connection(), m_window, mask, values);
+    Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
 }
 
 void QXcbWindow::requestActivateWindow()
 {
-    xcb_set_input_focus(xcb_connection(), m_window, XCB_INPUT_FOCUS_PARENT, XCB_TIME_CURRENT_TIME);
+    Q_XCB_CALL(xcb_set_input_focus(xcb_connection(), m_window, XCB_INPUT_FOCUS_PARENT, XCB_TIME_CURRENT_TIME));
 }
 
 QPlatformGLContext *QXcbWindow::glContext() const
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index e1ebce2..61239af 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -103,28 +103,27 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
     m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0);
     m_shm_info.shmseg = xcb_generate_id(xcb_connection());
 
-    xcb_shm_attach(xcb_connection(), m_shm_info.shmseg, m_shm_info.shmid, false);
+    Q_XCB_CALL(xcb_shm_attach(xcb_connection(), m_shm_info.shmseg, m_shm_info.shmid, false));
 
     m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, screen->format());
 }
 
 void QXcbShmImage::destroy()
 {
-    xcb_shm_detach(xcb_connection(), m_shm_info.shmseg);
+    Q_XCB_CALL(xcb_shm_detach(xcb_connection(), m_shm_info.shmseg));
     xcb_image_destroy(m_xcb_image);
     shmdt(m_shm_info.shmaddr);
     shmctl(m_shm_info.shmid, IPC_RMID, 0);
-
-    xcb_free_gc(xcb_connection(), m_gc);
+    Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
 }
 
 void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
 {
     if (m_gc_window != window) {
-        xcb_free_gc(xcb_connection(), m_gc);
+        Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
 
         m_gc = xcb_generate_id(xcb_connection());
-        xcb_create_gc(xcb_connection(), m_gc, window, 0, 0);
+        Q_XCB_CALL(xcb_create_gc(xcb_connection(), m_gc, window, 0, 0));
 
         m_gc_window = window;
     }
@@ -152,7 +151,8 @@ void QXcbShmImage::preparePaint(const QRegion &region)
     // to prevent X from reading from the image region while we're writing to it
     if (m_dirty.intersects(region)) {
         // from xcb_aux_sync
-        free(xcb_get_input_focus_reply(xcb_connection(), xcb_get_input_focus(xcb_connection()), 0));
+        xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
+        free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
         m_dirty = QRegion();
     }
 }
-- 
cgit v0.12


From 725ed9f1c192e9c72ddfb2f34c28355ea2d0b769 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 12:52:09 +0200
Subject: Protect access to the call log with a mutex.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 17 ++++++++++++-----
 src/plugins/platforms/xcb/qxcbconnection.h   |  1 +
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 9924b1e..794c0ef 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -402,6 +402,7 @@ const char *xcb_protocol_request_codes[] =
     "Unknown"
 };
 
+#ifdef Q_XCB_DEBUG
 void QXcbConnection::log(const char *file, int line, int sequence)
 {
     CallInfo info;
@@ -409,8 +410,10 @@ void QXcbConnection::log(const char *file, int line, int sequence)
     info.file = file;
     info.line = line;
 
+    QMutexLocker locker(&m_callLogMutex);
     m_callLog << info;
 }
+#endif
 
 void QXcbConnection::run()
 {
@@ -431,6 +434,7 @@ void QXcbConnection::run()
                    int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
                    int(error->minor_code));
 #ifdef Q_XCB_DEBUG
+            QMutexLocker locker(&m_callLogMutex);
             for (int i = 0; i < m_callLog.size(); ++i) {
                 if (m_callLog.at(i).sequence == error->sequence) {
                     printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
@@ -442,11 +446,14 @@ void QXcbConnection::run()
         }
 
 #ifdef Q_XCB_DEBUG
-        int i = 0;
-        for (; i < m_callLog.size(); ++i)
-            if (m_callLog.at(i).sequence >= event->sequence)
-                break;
-        m_callLog.remove(0, i);
+        {
+            QMutexLocker locker(&m_callLogMutex);
+            int i = 0;
+            for (; i < m_callLog.size(); ++i)
+                if (m_callLog.at(i).sequence >= event->sequence)
+                    break;
+            m_callLog.remove(0, i);
+        }
 #endif
 
         if (response_type == XCB_CLIENT_MESSAGE
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 0a7efd5..036670a 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -304,6 +304,7 @@ private:
         int line;
     };
     QVector<CallInfo> m_callLog;
+    QMutex m_callLogMutex;
     void log(const char *file, int line, int sequence);
     template <typename cookie_t>
     friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line);
-- 
cgit v0.12


From 9566b696026402f4c4b84ca0cd86126c84f89fd1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 12:54:49 +0200
Subject: Fixed off-by-one error in request name error logging in XCB platform.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 794c0ef..5b7d6d5 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -279,6 +279,7 @@ const char *xcb_errors[] =
 
 const char *xcb_protocol_request_codes[] =
 {
+    "Null",
     "CreateWindow",
     "ChangeWindowAttributes",
     "GetWindowAttributes",
-- 
cgit v0.12


From 8af8a969ea7266ecdce4cbbc89c3e505074b5286 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 12:57:21 +0200
Subject: Fixed X error in qxcbwindowsurface.cpp

Don't free null GC.
---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 61239af..110aa10 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -120,7 +120,8 @@ void QXcbShmImage::destroy()
 void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
 {
     if (m_gc_window != window) {
-        Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
+        if (m_gc)
+            Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
 
         m_gc = xcb_generate_id(xcb_connection());
         Q_XCB_CALL(xcb_create_gc(xcb_connection(), m_gc, window, 0, 0));
-- 
cgit v0.12


From 5c0605f617aa3dd727853b92b7d1b1d46208646f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 14:04:40 +0200
Subject: Fixed synchronization issue in QXcbWindow.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp    | 7 +++++++
 src/plugins/platforms/xcb/qxcbconnection.h      | 4 ++++
 src/plugins/platforms/xcb/qxcbwindow.cpp        | 1 +
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 4 +---
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 5b7d6d5..ffa6537 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -701,6 +701,13 @@ void QXcbConnection::initializeAllAtoms() {
         m_allAtoms[i] = xcb_intern_atom_reply(xcb_connection(), cookies[i], 0)->atom;
 }
 
+void QXcbConnection::sync()
+{
+    // from xcb_aux_sync
+    xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
+    free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
+}
+
 #if defined(XCB_USE_EGL)
 bool QXcbConnection::hasEgl() const
 {
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 036670a..2723f26 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -228,6 +228,8 @@ public:
     QXcbConnection(const char *displayName = 0);
     ~QXcbConnection();
 
+    QXcbConnection *connection() const { return const_cast<QXcbConnection *>(this); }
+
     QList<QXcbScreen *> screens() const { return m_screens; }
     int primaryScreen() const { return m_primaryScreen; }
 
@@ -256,6 +258,8 @@ public:
     void *egl_display() const { return m_egl_display; }
 #endif
 
+    void sync();
+
 protected:
     void run();
 
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 710d531..508755a 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -423,6 +423,7 @@ void QXcbWindow::lower()
 void QXcbWindow::requestActivateWindow()
 {
     Q_XCB_CALL(xcb_set_input_focus(xcb_connection(), m_window, XCB_INPUT_FOCUS_PARENT, XCB_TIME_CURRENT_TIME));
+    connection()->sync();
 }
 
 QPlatformGLContext *QXcbWindow::glContext() const
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 110aa10..8ab0140 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -151,9 +151,7 @@ void QXcbShmImage::preparePaint(const QRegion &region)
 {
     // to prevent X from reading from the image region while we're writing to it
     if (m_dirty.intersects(region)) {
-        // from xcb_aux_sync
-        xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
-        free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
+        connection()->sync();
         m_dirty = QRegion();
     }
 }
-- 
cgit v0.12


From f64bd45a1595bd012dcaa6c3b7ffa778c084b5ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 14:42:17 +0200
Subject: Unswapped arguments to xcb_set_input_focus.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 508755a..e997824 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -422,7 +422,7 @@ void QXcbWindow::lower()
 
 void QXcbWindow::requestActivateWindow()
 {
-    Q_XCB_CALL(xcb_set_input_focus(xcb_connection(), m_window, XCB_INPUT_FOCUS_PARENT, XCB_TIME_CURRENT_TIME));
+    Q_XCB_CALL(xcb_set_input_focus(xcb_connection(), XCB_INPUT_FOCUS_PARENT, m_window, XCB_TIME_CURRENT_TIME));
     connection()->sync();
 }
 
-- 
cgit v0.12


From 98687d47cc64133856de187cfc2acace3f42652e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 15:37:12 +0200
Subject: Better error reporting in XCB platform.

Try to report the interval of known calls between which the X error was
generated, if we can't find a sequence match.
---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index ffa6537..22149f0 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -399,7 +399,6 @@ const char *xcb_protocol_request_codes[] =
     "GetPointerMapping",
     "SetModifierMapping",
     "GetModifierMapping",
-    "NoOperation",
     "Unknown"
 };
 
@@ -436,12 +435,20 @@ void QXcbConnection::run()
                    int(error->minor_code));
 #ifdef Q_XCB_DEBUG
             QMutexLocker locker(&m_callLogMutex);
-            for (int i = 0; i < m_callLog.size(); ++i) {
+            int i = 0;
+            for (; i < m_callLog.size(); ++i) {
                 if (m_callLog.at(i).sequence == error->sequence) {
                     printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
                     break;
+                } else if (m_callLog.at(i).sequence > error->sequence) {
+                    printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                    if (i > 0)
+                        printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+                    break;
                 }
             }
+            if (i == m_callLog.size() && !m_callLog.isEmpty())
+                printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
 #endif
             continue;
         }
@@ -465,6 +472,7 @@ void QXcbConnection::run()
             && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_PAUSE_CONNECTION)
         {
             QMutexLocker locker(&m_connectionLock);
+            continue;
         }
 
         switch (response_type) {
-- 
cgit v0.12


From b69d64dfe615bbbfbaf317debbab5b9933895b4a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 15:37:56 +0200
Subject: Prevent deadlock in XCB due to GLX calling XCB functions.

---
 src/plugins/platforms/xcb/qglxintegration.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index bce3dfc..d42cfeb 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -65,7 +65,6 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
     , m_drawable((Drawable)window)
     , m_context(0)
 {
-
     const QPlatformGLContext *sharePlatformContext;
     if (format.useDefaultSharedContext()) {
         if (!QPlatformGLContext::defaultSharedContext()) {
@@ -131,6 +130,7 @@ void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
 
 void QGLXContext::makeCurrent()
 {
+    m_screen->connection()->setEventProcessingEnabled(false);
     QPlatformGLContext::makeCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), m_drawable, m_context);
 }
@@ -139,11 +139,13 @@ void QGLXContext::doneCurrent()
 {
     QPlatformGLContext::doneCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), 0, 0);
+    m_screen->connection()->setEventProcessingEnabled(true);
 }
 
 void QGLXContext::swapBuffers()
 {
     glXSwapBuffers(DISPLAY_FROM_XCB(m_screen), m_drawable);
+    doneCurrent();
 }
 
 void* QGLXContext::getProcAddress(const QString& procName)
-- 
cgit v0.12


From a3524950a04329b7f37f0d1107902a59f86b2c3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 15:39:09 +0200
Subject: Fixed dead-locks in XCB window surface.

Move the mutex lock into the window surface instead of belonging to the
QXcbShmImage, which will be destroyed and recreated in resize().
---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 21 ++++++++-------------
 src/plugins/platforms/xcb/qxcbwindowsurface.h   |  3 +++
 2 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 8ab0140..c90ebb5 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -44,7 +44,6 @@
 #include "qxcbconnection.h"
 #include "qxcbscreen.h"
 #include "qxcbwindow.h"
-#include "qmutex.h"
 
 #include <xcb/shm.h>
 #include <xcb/xcb_image.h>
@@ -65,9 +64,6 @@ public:
     void put(xcb_window_t window, const QPoint &dst, const QRect &source);
     void preparePaint(const QRegion &region);
 
-    void lock() { m_surfaceLock.lock(); }
-    void unlock() { m_surfaceLock.unlock(); }
-
 private:
     void destroy();
 
@@ -81,7 +77,6 @@ private:
     xcb_window_t m_gc_window;
 
     QRegion m_dirty;
-    QMutex m_surfaceLock;
 };
 
 QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
@@ -114,7 +109,8 @@ void QXcbShmImage::destroy()
     xcb_image_destroy(m_xcb_image);
     shmdt(m_shm_info.shmaddr);
     shmctl(m_shm_info.shmid, IPC_RMID, 0);
-    Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
+    if (m_gc)
+        Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
 }
 
 void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
@@ -175,13 +171,13 @@ QPaintDevice *QXcbWindowSurface::paintDevice()
 
 void QXcbWindowSurface::beginPaint(const QRegion &region)
 {
-    m_image->lock();
+    m_surfaceLock.lock();
     m_image->preparePaint(region);
 }
 
 void QXcbWindowSurface::endPaint(const QRegion &)
 {
-    m_image->unlock();
+    m_surfaceLock.unlock();
 }
 
 void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
@@ -189,18 +185,18 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     Q_UNUSED(region);
     Q_UNUSED(offset);
 
+    connection()->sync();
+
     QXcbWindow *window = static_cast<QXcbWindow *>(widget->window()->platformWindow());
 
     extern QWidgetData* qt_widget_data(QWidget *);
     QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
 
-    m_image->lock();
+    QMutexLocker(&m_surfaceLock);
 
     QVector<QRect> rects = region.rects();
     for (int i = 0; i < rects.size(); ++i)
         m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
-
-    m_image->unlock();
 }
 
 void QXcbWindowSurface::resize(const QSize &size)
@@ -209,8 +205,7 @@ void QXcbWindowSurface::resize(const QSize &size)
 
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
 
-    if (m_image)
-        m_image->lock();
+    QMutexLocker(&m_surfaceLock);
 
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
index f87e122..e508fe6 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.h
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -48,6 +48,8 @@
 
 #include "qxcbobject.h"
 
+#include <QMutex>
+
 class QXcbShmImage;
 
 class QXcbWindowSurface : public QXcbObject, public QWindowSurface
@@ -66,6 +68,7 @@ public:
 
 private:
     QXcbShmImage *m_image;
+    QMutex m_surfaceLock;
 };
 
 #endif
-- 
cgit v0.12


From 973cd5be8a980a6cb57dc719b05e4b99f8e6d3e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 15:59:34 +0200
Subject: Compile fix.

---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index c90ebb5..50be2c7 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -192,7 +192,7 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     extern QWidgetData* qt_widget_data(QWidget *);
     QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
 
-    QMutexLocker(&m_surfaceLock);
+    QMutexLocker locker(&m_surfaceLock);
 
     QVector<QRect> rects = region.rects();
     for (int i = 0; i < rects.size(); ++i)
@@ -205,7 +205,7 @@ void QXcbWindowSurface::resize(const QSize &size)
 
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
 
-    QMutexLocker(&m_surfaceLock);
+    QMutexLocker locker(&m_surfaceLock);
 
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
-- 
cgit v0.12


From 3cad0744477da31ab59ffb6d3baa498a369d5089 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 16:05:10 +0200
Subject: Prevent dead-lock when quitting XCB application.

Make sure event processing is enabled when we close the connection.
---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 22149f0..f1d3d2b 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -163,6 +163,8 @@ void QXcbConnection::setEventProcessingEnabled(bool enabled)
 
 QXcbConnection::~QXcbConnection()
 {
+    setEventProcessingEnabled(true);
+
     sendConnectionEvent(QXcbAtom::_QT_CLOSE_CONNECTION);
     wait();
 
-- 
cgit v0.12


From ee481481bbd1d910c8a0191aa517f96186130d8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 30 Mar 2011 17:07:00 +0200
Subject: Removed superfluous sync in QXcbWindowSurface.

---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 50be2c7..dd28c31 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -185,8 +185,6 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     Q_UNUSED(region);
     Q_UNUSED(offset);
 
-    connection()->sync();
-
     QXcbWindow *window = static_cast<QXcbWindow *>(widget->window()->platformWindow());
 
     extern QWidgetData* qt_widget_data(QWidget *);
-- 
cgit v0.12


From 8616c85eaa69fac5b15aa9a3d416f9c8b0098c17 Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Thu, 31 Mar 2011 11:56:59 +0200
Subject: QSslSocket: fix setReadBufferSize

This fix the qnetworkreply::ioPostToHttpsUploadProgress() auto test.
Before the readbuffer where always limited to 1k for ssl sockets.

Reviewed-by: Markus Goetz
---
 src/network/ssl/qsslsocket.cpp                 | 10 ++--------
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp |  6 ------
 2 files changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index a649758..bceb875 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -828,14 +828,8 @@ void QSslSocket::setReadBufferSize(qint64 size)
     Q_D(QSslSocket);
     d->readBufferMaxSize = size;
 
-    // set the plain socket's buffer size to 1k if we have a limit
-    // see also the same logic in QSslSocketPrivate::createPlainSocket
-    if (d->plainSocket) {
-        if (d->mode == UnencryptedMode)
-            d->plainSocket->setReadBufferSize(size);
-        else
-            d->plainSocket->setReadBufferSize(size ? 1024 : 0);
-    }
+    if (d->plainSocket)
+        d->plainSocket->setReadBufferSize(size);
 }
 
 /*!
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 650526e..d8b6dc4 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -4162,14 +4162,8 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
     // some progress should have been made
     QVERIFY(!spy.isEmpty());
     QList<QVariant> args = spy.last();
-    qDebug() << "tst_QNetworkReply::ioPostToHttpsUploadProgress"
-            << args.at(0).toLongLong()
-            << sourceFile.size()
-            << spy.size();
     QVERIFY(args.at(0).toLongLong() > 0);
-    // FIXME this is where it messes up
 
-    QEXPECT_FAIL("", "Either the readBufferSize of QSslSocket is broken or we do upload too much. Hm.", Abort);
     QVERIFY(args.at(0).toLongLong() != sourceFile.size());
 
     incomingSocket->setReadBufferSize(32*1024);
-- 
cgit v0.12


From faeabd9d202b1af002cd73da148ca4c27715470d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 31 Mar 2011 12:08:14 +0200
Subject: Fixed synchronizations issues in XCB platform plugin.

Use select() and xcb_poll_for_event() instead of xcb_wait_for_event(),
ad xcb_wait_for_event() will lock the XCB connection mutex, preventing
the other thread from posting events etc.
---
 src/plugins/platforms/xcb/qglxintegration.cpp   |  13 ++
 src/plugins/platforms/xcb/qxcbconnection.cpp    | 205 ++++++++++++++----------
 src/plugins/platforms/xcb/qxcbconnection.h      |   7 +-
 src/plugins/platforms/xcb/qxcbkeyboard.cpp      |   6 +
 src/plugins/platforms/xcb/qxcbwindow.cpp        |   4 +-
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp |  33 +++-
 6 files changed, 170 insertions(+), 98 deletions(-)

diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index d42cfeb..d1171b8 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -65,6 +65,7 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
     , m_drawable((Drawable)window)
     , m_context(0)
 {
+    Q_XCB_NOOP(m_screen->connection());
     const QPlatformGLContext *sharePlatformContext;
     if (format.useDefaultSharedContext()) {
         if (!QPlatformGLContext::defaultSharedContext()) {
@@ -87,6 +88,7 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
     GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
     m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, shareGlxContext, TRUE);
     m_windowFormat = qglx_platformWindowFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
+    Q_XCB_NOOP(m_screen->connection());
 }
 
 QGLXContext::QGLXContext(QXcbScreen *screen, Drawable drawable, GLXContext context)
@@ -97,12 +99,15 @@ QGLXContext::QGLXContext(QXcbScreen *screen, Drawable drawable, GLXContext conte
 
 QGLXContext::~QGLXContext()
 {
+    Q_XCB_NOOP(m_screen->connection());
     if (m_context)
         glXDestroyContext(DISPLAY_FROM_XCB(m_screen), m_context);
+    Q_XCB_NOOP(m_screen->connection());
 }
 
 void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
 {
+    Q_XCB_NOOP(screen->connection());
     int x = 0;
     int y = 0;
     int w = 3;
@@ -126,30 +131,38 @@ void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
     } else {
         qWarning("Warning no shared context created");
     }
+    Q_XCB_NOOP(screen->connection());
 }
 
 void QGLXContext::makeCurrent()
 {
+    Q_XCB_NOOP(m_screen->connection());
     m_screen->connection()->setEventProcessingEnabled(false);
     QPlatformGLContext::makeCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), m_drawable, m_context);
+    Q_XCB_NOOP(m_screen->connection());
 }
 
 void QGLXContext::doneCurrent()
 {
+    Q_XCB_NOOP(m_screen->connection());
     QPlatformGLContext::doneCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), 0, 0);
     m_screen->connection()->setEventProcessingEnabled(true);
+    Q_XCB_NOOP(m_screen->connection());
 }
 
 void QGLXContext::swapBuffers()
 {
+    Q_XCB_NOOP(m_screen->connection());
     glXSwapBuffers(DISPLAY_FROM_XCB(m_screen), m_drawable);
     doneCurrent();
+    Q_XCB_NOOP(m_screen->connection());
 }
 
 void* QGLXContext::getProcAddress(const QString& procName)
 {
+    Q_XCB_NOOP(m_screen->connection());
     typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *);
     static qt_glXGetProcAddressARB glXGetProcAddressARB = 0;
     static bool resolved = false;
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index f1d3d2b..05d3440 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -76,6 +76,7 @@ extern "C" {
 
 QXcbConnection::QXcbConnection(const char *displayName)
     : m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
+    , m_pauseId(0)
     , m_enabled(true)
 #ifdef XCB_USE_DRI2
     , m_dri2_major(0)
@@ -130,7 +131,7 @@ QXcbConnection::QXcbConnection(const char *displayName)
     start();
 }
 
-void QXcbConnection::sendConnectionEvent(QXcbAtom::Atom atom)
+void QXcbConnection::sendConnectionEvent(QXcbAtom::Atom atom, uint id)
 {
     xcb_client_message_event_t event;
     memset(&event, 0, sizeof(event));
@@ -140,9 +141,9 @@ void QXcbConnection::sendConnectionEvent(QXcbAtom::Atom atom)
     event.sequence = 0;
     event.window = m_connectionEventListener;
     event.type = atom;
+    event.data.data32[0] = id;
 
-    xcb_send_event(xcb_connection(), false, m_connectionEventListener, XCB_EVENT_MASK_NO_EVENT, (const char *)&event);
-
+    Q_XCB_CALL(xcb_send_event(xcb_connection(), false, m_connectionEventListener, XCB_EVENT_MASK_NO_EVENT, (const char *)&event));
     xcb_flush(xcb_connection());
 }
 
@@ -152,10 +153,12 @@ void QXcbConnection::setEventProcessingEnabled(bool enabled)
         return;
 
     if (!enabled) {
+        sendConnectionEvent(QXcbAtom::_QT_PAUSE_CONNECTION, uint(m_pauseId));
         m_connectionLock.lock();
-        sendConnectionEvent(QXcbAtom::_QT_PAUSE_CONNECTION);
+        m_pauseId.fetchAndAddOrdered(1);
     } else {
         m_connectionLock.unlock();
+        m_connectionWaitCondition.wakeAll();
     }
 
     m_enabled = enabled;
@@ -191,8 +194,11 @@ QXcbWindow *platformWindowFromId(xcb_window_t id)
 #define HANDLE_PLATFORM_WINDOW_EVENT(event_t, window, handler) \
 { \
     event_t *e = (event_t *)event; \
-    if (QXcbWindow *platformWindow = platformWindowFromId(e->window)) \
-        platformWindow->handler(e); \
+    if (QXcbWindow *platformWindow = platformWindowFromId(e->window)) { \
+        QObjectPrivate *d = QObjectPrivate::get(platformWindow->widget()); \
+        if (!d->wasDeleted) \
+            platformWindow->handler(e); \
+    } \
 } \
 break;
 
@@ -419,100 +425,118 @@ void QXcbConnection::log(const char *file, int line, int sequence)
 
 void QXcbConnection::run()
 {
-    while (xcb_generic_event_t *event = xcb_wait_for_event(xcb_connection())) {
-        bool handled = true;
+    QMutexLocker locker(&m_connectionLock);
+    fd_set readset;
+    int xcb_fd = xcb_get_file_descriptor(xcb_connection());
+    FD_ZERO(&readset);
+    FD_SET(xcb_fd, &readset);
+    int result;
+    while (true) {
+        while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
+            bool handled = true;
+
+            uint response_type = event->response_type & ~0x80;
+
+            if (!response_type) {
+                xcb_generic_error_t *error = (xcb_generic_error_t *)event;
+
+                uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
+                uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
+
+                printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
+                       int(error->error_code), xcb_errors[clamped_error_code],
+                       int(error->sequence), int(error->resource_id),
+                       int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
+                       int(error->minor_code));
+#ifdef Q_XCB_DEBUG
+                QMutexLocker locker(&m_callLogMutex);
+                int i = 0;
+                for (; i < m_callLog.size(); ++i) {
+                    if (m_callLog.at(i).sequence == error->sequence) {
+                        printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                        break;
+                    } else if (m_callLog.at(i).sequence > error->sequence) {
+                        printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                        if (i > 0)
+                            printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+                        break;
+                    }
+                }
+                if (i == m_callLog.size() && !m_callLog.isEmpty())
+                    printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
+#endif
+                continue;
+            }
 
-        uint response_type = event->response_type & ~0x80;
+#ifdef Q_XCB_DEBUG
+            {
+                QMutexLocker locker(&m_callLogMutex);
+                int i = 0;
+                for (; i < m_callLog.size(); ++i)
+                    if (m_callLog.at(i).sequence >= event->sequence)
+                        break;
+                m_callLog.remove(0, i);
+            }
+#endif
 
-        if (!response_type) {
-            xcb_generic_error_t *error = (xcb_generic_error_t *)event;
+            if (response_type == XCB_CLIENT_MESSAGE) {
+                xcb_client_message_event_t *ev = (xcb_client_message_event_t *)event;
 
-            uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
-            uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
+                if (ev->type == QXcbAtom::_QT_CLOSE_CONNECTION)
+                    return;
 
-            printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
-                   int(error->error_code), xcb_errors[clamped_error_code],
-                   int(error->sequence), int(error->resource_id),
-                   int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
-                   int(error->minor_code));
-#ifdef Q_XCB_DEBUG
-            QMutexLocker locker(&m_callLogMutex);
-            int i = 0;
-            for (; i < m_callLog.size(); ++i) {
-                if (m_callLog.at(i).sequence == error->sequence) {
-                    printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                    break;
-                } else if (m_callLog.at(i).sequence > error->sequence) {
-                    printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                    if (i > 0)
-                        printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
-                    break;
+                if (ev->type == QXcbAtom::_QT_PAUSE_CONNECTION) {
+                    if (ev->data.data32[0] == uint(m_pauseId))
+                        m_connectionWaitCondition.wait(&m_connectionLock);
+                    continue;
                 }
             }
-            if (i == m_callLog.size() && !m_callLog.isEmpty())
-                printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
-#endif
-            continue;
-        }
 
-#ifdef Q_XCB_DEBUG
-        {
-            QMutexLocker locker(&m_callLogMutex);
-            int i = 0;
-            for (; i < m_callLog.size(); ++i)
-                if (m_callLog.at(i).sequence >= event->sequence)
-                    break;
-            m_callLog.remove(0, i);
+            switch (response_type) {
+            case XCB_EXPOSE:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
+            case XCB_BUTTON_PRESS:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent);
+            case XCB_BUTTON_RELEASE:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
+            case XCB_MOTION_NOTIFY:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
+            case XCB_CONFIGURE_NOTIFY:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
+            case XCB_CLIENT_MESSAGE:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_client_message_event_t, window, handleClientMessageEvent);
+            case XCB_ENTER_NOTIFY:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
+            case XCB_LEAVE_NOTIFY:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
+            case XCB_FOCUS_IN:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent);
+            case XCB_FOCUS_OUT:
+                HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent);
+            case XCB_KEY_PRESS:
+                HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent);
+            case XCB_KEY_RELEASE:
+                HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
+            case XCB_MAPPING_NOTIFY:
+                m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event);
+                break;
+            default:
+                handled = false;
+                break;
+            }
+            if (handled)
+                printXcbEvent("Handled XCB event", event);
+            else
+                printXcbEvent("Unhandled XCB event", event);
         }
-#endif
 
-        if (response_type == XCB_CLIENT_MESSAGE
-            && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_CLOSE_CONNECTION)
-            return;
+        do {
+            result = select(xcb_fd + 1, &readset, 0, 0, 0);
+        } while (result == -1 && errno == EINTR);
 
-        if (response_type == XCB_CLIENT_MESSAGE
-            && ((xcb_client_message_event_t *)event)->type == QXcbAtom::_QT_PAUSE_CONNECTION)
-        {
-            QMutexLocker locker(&m_connectionLock);
+        if (result <= 0 || !FD_ISSET(xcb_fd, &readset))
             continue;
-        }
 
-        switch (response_type) {
-        case XCB_EXPOSE:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
-        case XCB_BUTTON_PRESS:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent);
-        case XCB_BUTTON_RELEASE:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
-        case XCB_MOTION_NOTIFY:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
-        case XCB_CONFIGURE_NOTIFY:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
-        case XCB_CLIENT_MESSAGE:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_client_message_event_t, window, handleClientMessageEvent);
-        case XCB_ENTER_NOTIFY:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
-        case XCB_LEAVE_NOTIFY:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
-        case XCB_FOCUS_IN:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent);
-        case XCB_FOCUS_OUT:
-            HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent);
-        case XCB_KEY_PRESS:
-            HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent);
-        case XCB_KEY_RELEASE:
-            HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
-        case XCB_MAPPING_NOTIFY:
-            m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event);
-            break;
-        default:
-            handled = false;
-            break;
-        }
-        if (handled)
-            printXcbEvent("Handled XCB event", event);
-        else
-            printXcbEvent("Unhandled XCB event", event);
     }
     fprintf(stderr, "I/O error in xcb_wait_for_event\n");
 }
@@ -714,8 +738,13 @@ void QXcbConnection::initializeAllAtoms() {
 void QXcbConnection::sync()
 {
     // from xcb_aux_sync
+    bool wasEnabled = m_enabled;
+    setEventProcessingEnabled(false);
     xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
     free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
+
+    if (wasEnabled)
+        setEventProcessingEnabled(true);
 }
 
 #if defined(XCB_USE_EGL)
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 2723f26..7088184 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -46,6 +46,7 @@
 #include <QList>
 #include <QMutex>
 #include <QVector>
+#include <QWaitCondition>
 #include <QThread>
 
 #define Q_XCB_DEBUG
@@ -265,7 +266,7 @@ protected:
 
 private:
     void initializeAllAtoms();
-    void sendConnectionEvent(QXcbAtom::Atom atom);
+    void sendConnectionEvent(QXcbAtom::Atom atom, uint id = 0);
 #ifdef XCB_USE_DRI2
     void initializeDri2();
 #endif
@@ -282,6 +283,8 @@ private:
 
     xcb_window_t m_connectionEventListener;
     QMutex m_connectionLock;
+    QWaitCondition m_connectionWaitCondition;
+    QAtomicInt m_pauseId;
     bool m_enabled;
 
     QXcbKeyboard *m_keyboard;
@@ -326,9 +329,11 @@ cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection,
 }
 #define Q_XCB_CALL(x) q_xcb_call_template(x, connection(), __FILE__, __LINE__)
 #define Q_XCB_CALL2(x, connection) q_xcb_call_template(x, connection, __FILE__, __LINE__)
+#define Q_XCB_NOOP(c) q_xcb_call_template(xcb_no_operation(c->xcb_connection()), c, __FILE__, __LINE__);
 #else
 #define Q_XCB_CALL(x) x
 #define Q_XCB_CALL2(x, connection) x
+#define Q_XCB_NOOP(c)
 #endif
 
 
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index ec9a009..f501c00 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -921,6 +921,8 @@ void QXcbKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, xcb_keycod
     if (state & 128)
         col += altGrOffset;
 
+    Q_XCB_NOOP(connection());
+
 #ifdef XCB_KEYBOARD_DEBUG
     printf("key code: %d, state: %d, syms: ", code, state);
     for (int i = 0; i <= 5; ++i) {
@@ -929,6 +931,8 @@ void QXcbKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, xcb_keycod
     printf("\n");
 #endif
 
+    Q_XCB_NOOP(connection());
+
     xcb_keysym_t sym = xcb_key_symbols_get_keysym(m_key_symbols, code, col);
     if (sym == XCB_NO_SYMBOL)
         sym = xcb_key_symbols_get_keysym(m_key_symbols, code, col ^ 0x1);
@@ -940,6 +944,8 @@ void QXcbKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, xcb_keycod
             sym = toupper(sym);
     }
 
+    Q_XCB_NOOP(connection());
+
     QByteArray chars;
 
     Qt::KeyboardModifiers modifiers;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index e997824..7aeb557 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -222,9 +222,7 @@ void QXcbWindow::setVisible(bool visible)
             xcb_wm_hints_set_normal(&hints);
         xcb_set_wm_hints(xcb_connection(), m_window, &hints);
         Q_XCB_CALL(xcb_map_window(xcb_connection(), m_window));
-#if defined(XCB_USE_GLX)
-        glXWaitX();
-#endif
+        connection()->sync();
     } else {
         Q_XCB_CALL(xcb_unmap_window(xcb_connection(), m_window));
 
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index dd28c31..4c0d862 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -62,7 +62,7 @@ public:
     QImage *image() { return &m_qimage; }
 
     void put(xcb_window_t window, const QPoint &dst, const QRect &source);
-    void preparePaint(const QRegion &region);
+    void preparePaint(const QRegion &region, QMutex *mutex);
 
 private:
     void destroy();
@@ -84,6 +84,7 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
     , m_gc(0)
     , m_gc_window(0)
 {
+    Q_XCB_NOOP(connection());
     m_xcb_image = xcb_image_create_native(xcb_connection(),
                                           size.width(),
                                           size.height(),
@@ -115,6 +116,7 @@ void QXcbShmImage::destroy()
 
 void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
 {
+    Q_XCB_NOOP(connection());
     if (m_gc_window != window) {
         if (m_gc)
             Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
@@ -125,6 +127,7 @@ void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &s
         m_gc_window = window;
     }
 
+    Q_XCB_NOOP(connection());
     xcb_image_shm_put(xcb_connection(),
                       window,
                       m_gc,
@@ -137,18 +140,23 @@ void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &s
                       source.width(),
                       source.height(),
                       false);
+    Q_XCB_NOOP(connection());
 
     m_dirty = m_dirty | source;
 
     xcb_flush(xcb_connection());
+    Q_XCB_NOOP(connection());
 }
 
-void QXcbShmImage::preparePaint(const QRegion &region)
+void QXcbShmImage::preparePaint(const QRegion &region, QMutex *mutex)
 {
     // to prevent X from reading from the image region while we're writing to it
     if (m_dirty.intersects(region)) {
         connection()->sync();
+        mutex->lock();
         m_dirty = QRegion();
+    } else {
+        mutex->lock();
     }
 }
 
@@ -162,6 +170,8 @@ QXcbWindowSurface::QXcbWindowSurface(QWidget *widget, bool setDefaultSurface)
 
 QXcbWindowSurface::~QXcbWindowSurface()
 {
+    QMutexLocker locker(&m_surfaceLock);
+    delete m_image;
 }
 
 QPaintDevice *QXcbWindowSurface::paintDevice()
@@ -171,8 +181,7 @@ QPaintDevice *QXcbWindowSurface::paintDevice()
 
 void QXcbWindowSurface::beginPaint(const QRegion &region)
 {
-    m_surfaceLock.lock();
-    m_image->preparePaint(region);
+    m_image->preparePaint(region, &m_surfaceLock);
 }
 
 void QXcbWindowSurface::endPaint(const QRegion &)
@@ -185,6 +194,8 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     Q_UNUSED(region);
     Q_UNUSED(offset);
 
+    Q_XCB_NOOP(connection());
+
     QXcbWindow *window = static_cast<QXcbWindow *>(widget->window()->platformWindow());
 
     extern QWidgetData* qt_widget_data(QWidget *);
@@ -195,18 +206,26 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     QVector<QRect> rects = region.rects();
     for (int i = 0; i < rects.size(); ++i)
         m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
+
+    Q_XCB_NOOP(connection());
 }
 
 void QXcbWindowSurface::resize(const QSize &size)
 {
+    Q_XCB_NOOP(connection());
     QWindowSurface::resize(size);
 
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
 
-    QMutexLocker locker(&m_surfaceLock);
+    connection()->setEventProcessingEnabled(false);
+    m_surfaceLock.lock();
 
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
+    Q_XCB_NOOP(connection());
+
+    m_surfaceLock.unlock();
+    connection()->setEventProcessingEnabled(true);
 }
 
 extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
@@ -216,12 +235,14 @@ bool QXcbWindowSurface::scroll(const QRegion &area, int dx, int dy)
     if (m_image->image()->isNull())
         return false;
 
-    m_image->preparePaint(area);
+    m_image->preparePaint(area, &m_surfaceLock);
 
     const QVector<QRect> rects = area.rects();
     for (int i = 0; i < rects.size(); ++i)
         qt_scrollRectInImage(*m_image->image(), rects.at(i), QPoint(dx, dy));
 
+    m_surfaceLock.unlock();
+
     return true;
 }
 
-- 
cgit v0.12


From b6de9d5bcb3eb503dc2b1f9559d1e89f778d1d76 Mon Sep 17 00:00:00 2001
From: Jacopo De Simoi <desimoi@mat.uniroma2.it>
Date: Thu, 31 Mar 2011 12:15:39 +0200
Subject: Track compositingManagerRunning changes

Use XFixes extension to track changes to
the compositing manager in such a way that
QX11Info::isCompositingManagerRunning()
returns a valid result even if compositing has
changed after the creation of the QApplication

Many thanks to Fredrikh Hoglund for suggesting the
correct approach

Task-number: QTBUG-6044

Merge-request: 1133
Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com>
---
 src/gui/kernel/qapplication_x11.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
index 31f70c7..20542ea 100644
--- a/src/gui/kernel/qapplication_x11.cpp
+++ b/src/gui/kernel/qapplication_x11.cpp
@@ -2281,6 +2281,13 @@ void qt_init(QApplicationPrivate *priv, int,
         // Attempt to determine the current running X11 Desktop Enviornment
         // Use dbus if/when we can, but fall back to using windowManagerName() for now
 
+#ifndef QT_NO_XFIXES
+        if (X11->ptrXFixesSelectSelectionInput)
+            X11->ptrXFixesSelectSelectionInput(X11->display, QX11Info::appRootWindow(), ATOM(_NET_WM_CM_S0),
+                                       XFixesSetSelectionOwnerNotifyMask
+                                       | XFixesSelectionWindowDestroyNotifyMask
+                                       | XFixesSelectionClientCloseNotifyMask);
+#endif // QT_NO_XFIXES
         X11->compositingManagerRunning = XGetSelectionOwner(X11->display,
                                                             ATOM(_NET_WM_CM_S0));
         X11->desktopEnvironment = DE_UNKNOWN;
@@ -3216,6 +3223,8 @@ int QApplication::x11ProcessEvent(XEvent* event)
         XFixesSelectionNotifyEvent *req =
             reinterpret_cast<XFixesSelectionNotifyEvent *>(event);
         X11->time = req->selection_timestamp;
+        if (req->selection == ATOM(_NET_WM_CM_S0))
+            X11->compositingManagerRunning = req->owner;
     }
 #endif
 
-- 
cgit v0.12


From 8163f070aee2b3d40e588009c837d81a145fcfd1 Mon Sep 17 00:00:00 2001
From: Jacopo De Simoi <desimoi@mat.uniroma2.it>
Date: Thu, 31 Mar 2011 12:17:59 +0200
Subject: Fix window pixmap initialization strategy

If a compositing manager is active, setting
the window pixmap background to None for ARGB windows
makes little sense.
In this case the background should be transparent

Merge-request: 1135
Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com>
---
 src/gui/kernel/qwidget_x11.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index 4f39443..5ece7d6 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -1380,9 +1380,15 @@ void QWidgetPrivate::updateSystemBackground()
     if (brush.style() == Qt::NoBrush
         || q->testAttribute(Qt::WA_NoSystemBackground)
         || q->testAttribute(Qt::WA_UpdatesDisabled)
-        || type == Qt::Popup || type == Qt::ToolTip
-        )
-        XSetWindowBackgroundPixmap(X11->display, q->internalWinId(), XNone);
+        || type == Qt::Popup || type == Qt::ToolTip) {
+            if (QX11Info::isCompositingManagerRunning()
+                && q->testAttribute(Qt::WA_TranslucentBackground)
+                && !(q->parent()))
+                XSetWindowBackground(X11->display, q->internalWinId(),
+                                     QColormap::instance(xinfo.screen()).pixel(Qt::transparent));
+            else
+                XSetWindowBackgroundPixmap(X11->display, q->internalWinId(), XNone);
+        }
     else if (brush.style() == Qt::SolidPattern && brush.isOpaque())
         XSetWindowBackground(X11->display, q->internalWinId(),
                              QColormap::instance(xinfo.screen()).pixel(brush.color()));
-- 
cgit v0.12


From d47ed6666e4a47d8edebf487dcd61a08f313302a Mon Sep 17 00:00:00 2001
From: miniak <milan.burda@gmail.com>
Date: Thu, 31 Mar 2011 16:12:08 +0200
Subject: Remove ANSI function definitions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 1011
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 src/corelib/kernel/qfunctions_wince.h | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/corelib/kernel/qfunctions_wince.h b/src/corelib/kernel/qfunctions_wince.h
index e282457..fffe407 100644
--- a/src/corelib/kernel/qfunctions_wince.h
+++ b/src/corelib/kernel/qfunctions_wince.h
@@ -84,10 +84,6 @@ errno_t qt_wince__putenv_s(const char*, const char*);
 extern "C" {
 #endif
 
-#define SetWindowLongA      SetWindowLong
-#define GetWindowLongA      GetWindowLong
-#define SendMessageA        SendMessage
-
 #if !defined(NO_ERRNO_H)
 #define NO_ERRNO_H
 #endif
-- 
cgit v0.12


From b202e94bb1e5985aeccea360deef368580e72369 Mon Sep 17 00:00:00 2001
From: miniak <milan.burda@gmail.com>
Date: Thu, 31 Mar 2011 16:12:09 +0200
Subject: Replace CL_MIN/CL_MAX by qMin/qMax
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 1011
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 src/gui/styles/qcleanlooksstyle.cpp | 43 +++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/src/gui/styles/qcleanlooksstyle.cpp b/src/gui/styles/qcleanlooksstyle.cpp
index 8a2a88b..cc5fe10 100644
--- a/src/gui/styles/qcleanlooksstyle.cpp
+++ b/src/gui/styles/qcleanlooksstyle.cpp
@@ -68,9 +68,6 @@
 #include <qlibrary.h>
 #include <private/qstylehelper_p.h>
 
-#define CL_MAX(a,b) (a)>(b) ? (a):(b) // ### qMin/qMax does not work for vc6
-#define CL_MIN(a,b) (a)<(b) ? (a):(b) // remove this when it is working
-
 QT_BEGIN_NAMESPACE
 
 using namespace QStyleHelper;
@@ -533,8 +530,8 @@ static void qt_cleanlooks_draw_mdibutton(QPainter *painter, const QStyleOptionTi
 {
     QColor dark;
     dark.setHsv(option->palette.button().color().hue(),
-                CL_MIN(255, (int)(option->palette.button().color().saturation()*1.9)),
-                CL_MIN(255, (int)(option->palette.button().color().value()*0.7)));
+                qMin(255, (int)(option->palette.button().color().saturation()*1.9)),
+                qMin(255, (int)(option->palette.button().color().value()*0.7)));
 
     QColor highlight = option->palette.highlight().color();
 
@@ -691,11 +688,11 @@ void QCleanlooksStyle::drawPrimitive(PrimitiveElement elem,
     QColor darkOutline;
     QColor dark;
     darkOutline.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*3.0)),
-                CL_MIN(255, (int)(button.value()*0.6)));
+                qMin(255, (int)(button.saturation()*3.0)),
+                qMin(255, (int)(button.value()*0.6)));
     dark.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*1.9)),
-                CL_MIN(255, (int)(button.value()*0.7)));
+                qMin(255, (int)(button.saturation()*1.9)),
+                qMin(255, (int)(button.value()*0.7)));
     QColor tabFrameColor = mergedColors(option->palette.background().color(),
                                                 dark.lighter(135), 60);
 
@@ -1117,8 +1114,8 @@ void QCleanlooksStyle::drawPrimitive(PrimitiveElement elem,
             QColor gradientMidColor = option->palette.button().color();
             QColor gradientStopColor;
             gradientStopColor.setHsv(buttonColor.hue(),
-                                     CL_MIN(255, (int)(buttonColor.saturation()*1.9)),
-                                     CL_MIN(255, (int)(buttonColor.value()*0.96)));
+                                     qMin(255, (int)(buttonColor.saturation()*1.9)),
+                                     qMin(255, (int)(buttonColor.value()*0.96)));
 
             QRect gradRect = rect.adjusted(1, 2, -1, -2);
             // gradient fill
@@ -1384,12 +1381,12 @@ void QCleanlooksStyle::drawControl(ControlElement element, const QStyleOption *o
     QColor button = option->palette.button().color();
     QColor dark;
     dark.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*1.9)),
-                CL_MIN(255, (int)(button.value()*0.7)));
+                qMin(255, (int)(button.saturation()*1.9)),
+                qMin(255, (int)(button.value()*0.7)));
     QColor darkOutline;
     darkOutline.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*2.0)),
-                CL_MIN(255, (int)(button.value()*0.6)));
+                qMin(255, (int)(button.saturation()*2.0)),
+                qMin(255, (int)(button.value()*0.6)));
     QRect rect = option->rect;
     QColor shadow = mergedColors(option->palette.background().color().darker(120),
                                  dark.lighter(130), 60);
@@ -1662,8 +1659,8 @@ void QCleanlooksStyle::drawControl(ControlElement element, const QStyleOption *o
             QColor gradientStopColor;
             QColor gradientStartColor = option->palette.button().color();
             gradientStopColor.setHsv(gradientStartColor.hue(),
-                                     CL_MIN(255, (int)(gradientStartColor.saturation()*2)),
-                                     CL_MIN(255, (int)(gradientStartColor.value()*0.96)));
+                                     qMin(255, (int)(gradientStartColor.saturation()*2)),
+                                     qMin(255, (int)(gradientStartColor.value()*0.96)));
             QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
             if (option->palette.background().gradient()) {
                 gradient.setStops(option->palette.background().gradient()->stops());
@@ -2425,14 +2422,14 @@ void QCleanlooksStyle::drawComplexControl(ComplexControl control, const QStyleOp
     QColor grooveColor;
     QColor darkOutline;
     dark.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*1.9)),
-                CL_MIN(255, (int)(button.value()*0.7)));
+                qMin(255, (int)(button.saturation()*1.9)),
+                qMin(255, (int)(button.value()*0.7)));
     grooveColor.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*2.6)),
-                CL_MIN(255, (int)(button.value()*0.9)));
+                qMin(255, (int)(button.saturation()*2.6)),
+                qMin(255, (int)(button.value()*0.9)));
     darkOutline.setHsv(button.hue(),
-                CL_MIN(255, (int)(button.saturation()*3.0)),
-                CL_MIN(255, (int)(button.value()*0.6)));
+                qMin(255, (int)(button.saturation()*3.0)),
+                qMin(255, (int)(button.value()*0.6)));
 
     QColor alphaCornerColor;
     if (widget) {
-- 
cgit v0.12


From 3ae213cdeffae107ffa5a4b552c6351123dcc5cb Mon Sep 17 00:00:00 2001
From: miniak <milan.burda@gmail.com>
Date: Thu, 31 Mar 2011 16:12:10 +0200
Subject: Remove NOPODINITIALIZATION
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 1011
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 tests/auto/collections/tst_collections.cpp | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/tests/auto/collections/tst_collections.cpp b/tests/auto/collections/tst_collections.cpp
index 9b24660..b1ea326 100644
--- a/tests/auto/collections/tst_collections.cpp
+++ b/tests/auto/collections/tst_collections.cpp
@@ -104,13 +104,6 @@ void foo()
 #include "q3cleanuphandler.h"
 #endif
 
-// Do not test initialization of pods on msvc6 and msvc 2002
-// This is a known issue
-#if defined Q_CC_MSVC && _MSC_VER < 1310
-#   define NOPODINITIALIZATION
-#endif
-
-
 template class QList<int>;
 
 //TESTED_FILES=
@@ -198,10 +191,6 @@ QT_END_NAMESPACE
 
 struct Pod {
     int i1, i2;
-
-#if defined NOPODINITIALIZATION
-    Pod() : i1(0), i2(0) { }
-#endif
 };
 
 tst_Collections::tst_Collections()
-- 
cgit v0.12


From df9491b302f6404ad2ccc6dc2eb3377176d994c6 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 28 Mar 2011 18:54:06 +0200
Subject: Optimize QMetaObject::activate (remove call to QThreadData::current)

QThreadData::current is too slow, it needs to access the TLS
The currentThreadId is much faster.

Reviewed-by: Brad
---
 src/corelib/kernel/qobject.cpp      | 4 ++--
 src/corelib/thread/qthread.cpp      | 2 +-
 src/corelib/thread/qthread_p.h      | 2 ++
 src/corelib/thread/qthread_unix.cpp | 3 ++-
 src/corelib/thread/qthread_win.cpp  | 2 ++
 5 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index c6153cb..7ad9f9b 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -3478,7 +3478,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                                                          argv ? argv : empty_argv);
     }
 
-    QThreadData *currentThreadData = QThreadData::current();
+    Qt::HANDLE currentThreadId = QThread::currentThreadId();
 
     QMutexLocker locker(signalSlotLock(sender));
     QObjectConnectionListVector *connectionLists = sender->d_func()->connectionLists;
@@ -3506,7 +3506,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
 
             QObject * const receiver = c->receiver;
             const int method = c->method;
-            const bool receiverInSameThread = currentThreadData == receiver->d_func()->threadData;
+            const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId;
 
             // determine if this connection should be sent immediately or
             // put into the event queue
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 817e73e..acf0fce 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -77,7 +77,7 @@ QT_BEGIN_NAMESPACE
 */
 
 QThreadData::QThreadData(int initialRefCount)
-    : _ref(initialRefCount), thread(0),
+    : _ref(initialRefCount), thread(0), threadId(0),
       quitNow(false), loopLevel(0), eventDispatcher(0), canWait(true), isAdopted(false)
 {
     // fprintf(stderr, "QThreadData %p created\n", this);
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 2413452..b43a456 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -146,6 +146,7 @@ public:
 #else
     static void finish(void *);
 #endif
+
 #endif // Q_OS_UNIX
 
 #if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
@@ -201,6 +202,7 @@ public:
     void deref();
 
     QThread *thread;
+    Qt::HANDLE threadId;
     bool quitNow;
     int loopLevel;
     QAbstractEventDispatcher *eventDispatcher;
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 484b455..787c909 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -261,6 +261,7 @@ QThreadData *QThreadData::current()
             data->deref();
         }
         data->isAdopted = true;
+        data->threadId = (Qt::HANDLE)pthread_self();
         if (!QCoreApplicationPrivate::theMainThread)
             QCoreApplicationPrivate::theMainThread = data->thread;
     }
@@ -344,7 +345,7 @@ void *QThreadPrivate::start(void *arg)
     // attribute of the thread again once the app gains control in run()
     User::SetCritical(User::EProcessCritical);
 #endif
-
+    data->threadId = (Qt::HANDLE)pthread_self();
     set_thread_data(data);
 
     data->ref();
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index b9c55b0..bab6cf8 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -125,6 +125,7 @@ QThreadData *QThreadData::current()
             threadData->deref();
         }
         threadData->isAdopted = true;
+        threadData->threadId = (Qt::HANDLE)GetCurrentThreadId();
 
         if (!QCoreApplicationPrivate::theMainThread) {
             QCoreApplicationPrivate::theMainThread = threadData->thread;
@@ -306,6 +307,7 @@ unsigned int __stdcall QThreadPrivate::start(void *arg)
 
     qt_create_tls();
     TlsSetValue(qt_current_thread_data_tls_index, data);
+    data->threadId = (Qt::HANDLE)GetCurrentThreadId();
 
     QThread::setTerminationEnabled(false);
 
-- 
cgit v0.12


From dfcc156a75f32f1147e95ce06e4262c102ee858e Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 17 May 2010 16:17:57 +0200
Subject: Add a test in QObject.

Testing that slot from destroyed class are not called
---
 tests/auto/qobject/tst_qobject.cpp | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qobject/tst_qobject.cpp b/tests/auto/qobject/tst_qobject.cpp
index d2307ee..4b926e4 100644
--- a/tests/auto/qobject/tst_qobject.cpp
+++ b/tests/auto/qobject/tst_qobject.cpp
@@ -135,7 +135,7 @@ private slots:
     void disconnectByMetaMethod();
     void disconnectNotSignalMetaMethod();
     void autoConnectionBehavior();
-
+    void baseDestroyed();
 protected:
 };
 
@@ -3925,5 +3925,34 @@ void tst_QObject::autoConnectionBehavior()
     delete receiver;
 }
 
+class BaseDestroyed : public QObject
+{ Q_OBJECT
+    QList<QString> fooList;
+    bool destroyed;
+public:
+    BaseDestroyed() : destroyed(false)
+    { fooList << "a" << "b"; }
+    ~BaseDestroyed()
+    {
+        QVERIFY(!destroyed);
+        destroyed = true;
+    }
+
+public slots:
+    void slotUseList()
+    {
+        QVERIFY(!destroyed);
+        fooList << "c" << "d";
+    }
+};
+
+void tst_QObject::baseDestroyed()
+{
+    BaseDestroyed d;
+    connect(&d, SIGNAL(destroyed()), &d, SLOT(slotUseList()));
+    //When d goes out of scope, slotUseList should not be called as the BaseDestroyed has
+    // already been destroyed while ~QObject emit destroyed
+}
+
 QTEST_MAIN(tst_QObject)
 #include "tst_qobject.moc"
-- 
cgit v0.12


From d7ee1cc6456e35823d2c470feec6219ef516e1f6 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 25 Mar 2011 11:50:03 +0100
Subject: Improve slightly the performence of activate

Avoid the overhead of QObjectConnectionListVector::at(), when we
know anyway which list to take.

Reviewed-by: brad
---
 src/corelib/kernel/qobject.cpp | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 7ad9f9b..c6f2456 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -263,12 +263,6 @@ public:
         : QVector<QObjectPrivate::ConnectionList>(), orphaned(false), dirty(false), inUse(0)
     { }
 
-    const QObjectPrivate::ConnectionList &at(int at) const
-    {
-        if (at < 0)
-            return allsignals;
-        return QVector<QObjectPrivate::ConnectionList>::at(at);
-    }
     QObjectPrivate::ConnectionList &operator[](int at)
     {
         if (at < 0)
@@ -3489,16 +3483,20 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
         return;
     }
     ++connectionLists->inUse;
-    if (signal_index >= connectionLists->count()) {
-        signal_index = -2; //for "all signals";
-    }
+
+
+    const QObjectPrivate::ConnectionList *list;
+    if (signal_index < connectionLists->count())
+        list = &connectionLists->at(signal_index);
+    else
+        list = &connectionLists->allsignals;
 
     do {
-        QObjectPrivate::Connection *c = connectionLists->at(signal_index).first;
+        QObjectPrivate::Connection *c = list->first;
         if (!c) continue;
         // We need to check against last here to ensure that signals added
         // during the signal emission are not emitted in this emission.
-        QObjectPrivate::Connection *last = connectionLists->at(signal_index).last;
+        QObjectPrivate::Connection *last = list->last;
 
         do {
             if (!c->receiver)
@@ -3582,7 +3580,9 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
 
         if (connectionLists->orphaned)
             break;
-    } while (signal_index >= 0 && (signal_index = -1)); //start over for -1 (all signal)
+    } while (list != &connectionLists->allsignals &&
+        //start over for all signals;
+        ((list = &connectionLists->allsignals), true));
 
     --connectionLists->inUse;
     Q_ASSERT(connectionLists->inUse >= 0);
-- 
cgit v0.12


From bc3491c1b85ca36486c9472ecf7ba82f46699e8a Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 5 May 2010 09:44:58 +0200
Subject: Speedup activation of signals

The virtual QObject::qt_metacall will recurse to the whole object hierarchy
to find from which class a function should be called.
But it is possible to know, at connection time, from which exact
QMetaObject a function belongs, and the relative offset into it.
So we make the slot calls from the qt_static_metacall function.
So activation of signals is faster.

 - We must not call a slot from a class that has been destroyed.
   To avoid this, there is a check on the methodOffset. If it is
   smaller, that means we might be called (indirectly) from
   the destructor. We fallback to the virtual call to qt_metacall
   that does the right thing.

 - The signature of the static method is void (*) (QObject*,MetaCall,int,void**)
   It returns void, so the compiler is allowed to do tail recusive
   optimization.  Having the QObject* as first parameter make it ready
   on the stack for the call to the member function.

 - The new static method has to be a member function in order to
   be able to access the private slots.

Reviewed-by: brad
---
 src/corelib/kernel/qmetaobject.cpp |  35 ++++++---
 src/corelib/kernel/qmetaobject_p.h |   6 +-
 src/corelib/kernel/qobject.cpp     | 128 +++++++++++++++++++-----------
 src/corelib/kernel/qobject_p.h     |  10 ++-
 src/corelib/kernel/qobjectdefs.h   |   7 +-
 src/tools/moc/generator.cpp        | 157 ++++++++++++++++++++++---------------
 src/tools/moc/generator.h          |   2 +-
 src/tools/moc/moc.cpp              |   6 +-
 src/tools/moc/moc.h                |   3 +-
 src/tools/moc/outputrevision.h     |   2 +-
 10 files changed, 221 insertions(+), 135 deletions(-)

diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index c5775f6..4bf4290 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -218,12 +218,20 @@ QObject *QMetaObject::newInstance(QGenericArgument val0,
 */
 int QMetaObject::static_metacall(Call cl, int idx, void **argv) const
 {
-    if (priv(d.data)->revision < 2)
-        return 0;
-    const QMetaObjectExtraData *extra = (const QMetaObjectExtraData*)(d.extradata);
-    if (!extra || !extra->static_metacall)
-        return 0;
-    return extra->static_metacall(cl, idx, argv);
+    const QMetaObjectExtraData *extra = reinterpret_cast<const QMetaObjectExtraData *>(d.extradata);
+    if (priv(d.data)->revision >= 6) {
+        if (!extra || !extra->static_metacall)
+            return 0;
+        extra->static_metacall(0, cl, idx, argv);
+        return -1;
+    } else if (priv(d.data)->revision >= 2) {
+        if (!extra || !extra->static_metacall)
+            return 0;
+        typedef int (*OldMetacall)(QMetaObject::Call, int, void **);
+        OldMetacall o = reinterpret_cast<OldMetacall>(extra->static_metacall);
+        return o(cl, idx, argv);
+    }
+    return 0;
 }
 
 /*!
@@ -639,20 +647,21 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
 */
 int QMetaObject::indexOfSlot(const char *slot) const
 {
-    int i = QMetaObjectPrivate::indexOfSlot(this, slot, false);
+    const QMetaObject *m = this;
+    int i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot, false);
     if (i < 0)
-        i = QMetaObjectPrivate::indexOfSlot(this, slot, true);
+        i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot, true);
+    if (i >= 0)
+        i += methodOffset();
     return i;
 }
 
-int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m,
+// same as indexOfSignalRelative but for slots.
+int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m,
                                     const char *slot,
                                     bool normalizeStringData)
 {
-    int i = indexOfMethodRelative<MethodSlot>(&m, slot, normalizeStringData);
-    if (i >= 0)
-        i += m->methodOffset();
-    return i;
+    return indexOfMethodRelative<MethodSlot>(m, slot, normalizeStringData);
 }
 
 static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, const char *name)
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 210b32c..fdadf4a 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -118,6 +118,7 @@ struct QMetaObjectPrivate
     int flags; //since revision 3
     int signalCount; //since revision 4
     // revision 5 introduces changes in normalized signatures, no new members
+    // revision 6 added qt_static_metacall as a member of each Q_OBJECT and inside QMetaObject itself
 
     static inline const QMetaObjectPrivate *get(const QMetaObject *metaobject)
     { return reinterpret_cast<const QMetaObjectPrivate*>(metaobject->d.data); }
@@ -125,7 +126,7 @@ struct QMetaObjectPrivate
     static int indexOfSignalRelative(const QMetaObject **baseObject,
                                      const char* name,
                                      bool normalizeStringData);
-    static int indexOfSlot(const QMetaObject *m,
+    static int indexOfSlotRelative(const QMetaObject **m,
                            const char *slot,
                            bool normalizeStringData);
     static int originalClone(const QMetaObject *obj, int local_method_index);
@@ -136,7 +137,8 @@ struct QMetaObjectPrivate
     static void memberIndexes(const QObject *obj, const QMetaMethod &member,
                               int *signalIndex, int *methodIndex);
     static bool connect(const QObject *sender, int signal_index,
-                        const QObject *receiver, int method_index,
+                        const QObject *receiver, int method_index_relative,
+                        const QMetaObject *rmeta = 0,
                         int type = 0, int *types = 0);
     static bool disconnect(const QObject *sender, int signal_index,
                            const QObject *receiver, int method_index,
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index c6f2456..4cbeee2 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -2607,18 +2607,17 @@ bool QObject::connect(const QObject *sender, const char *signal,
     ++method; // skip code
 
     const QMetaObject *rmeta = receiver->metaObject();
-    int method_index = -1;
+    int method_index_relative = -1;
     switch (membcode) {
     case QSLOT_CODE:
-        method_index = QMetaObjectPrivate::indexOfSlot(rmeta, method, false);
+        method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, false);
         break;
     case QSIGNAL_CODE:
-        method_index = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
-        if (method_index >= 0)
-            method_index += rmeta->methodOffset();
+        method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
         break;
     }
-    if (method_index < 0) {
+
+    if (method_index_relative < 0) {
         // check for normalized methods
         tmp_method_name = QMetaObject::normalizedSignature(method);
         method = tmp_method_name.constData();
@@ -2627,19 +2626,24 @@ bool QObject::connect(const QObject *sender, const char *signal,
         rmeta = receiver->metaObject();
         switch (membcode) {
         case QSLOT_CODE:
-            method_index = rmeta->indexOfSlot(method);
+            method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, false);
+            if (method_index_relative < 0)
+                method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, true);
             break;
         case QSIGNAL_CODE:
-            method_index = rmeta->indexOfSignal(method);
+            method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
+            if (method_index_relative < 0)
+                method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, true);
             break;
         }
     }
 
-    if (method_index < 0) {
+    if (method_index_relative < 0) {
         err_method_notfound(receiver, method_arg, "connect");
         err_info_about_objects("connect", sender, receiver);
         return false;
     }
+
     if (!QMetaObject::checkConnectArgs(signal, method)) {
         qWarning("QObject::connect: Incompatible sender/receiver arguments"
                  "\n        %s::%s --> %s::%s",
@@ -2654,14 +2658,13 @@ bool QObject::connect(const QObject *sender, const char *signal,
         return false;
 
 #ifndef QT_NO_DEBUG
-    {
+    if (warnCompat) {
         QMetaMethod smethod = smeta->method(signal_absolute_index);
-        QMetaMethod rmethod = rmeta->method(method_index);
-        if (warnCompat)
-            check_and_warn_compat(smeta, smethod, rmeta, rmethod);
+        QMetaMethod rmethod = rmeta->method(method_index_relative + rmeta->methodOffset());
+        check_and_warn_compat(smeta, smethod, rmeta, rmethod);
     }
 #endif
-    if (!QMetaObjectPrivate::connect(sender, signal_index, receiver, method_index, type, types))
+    if (!QMetaObjectPrivate::connect(sender, signal_index, receiver, method_index_relative, rmeta ,type, types))
         return false;
     const_cast<QObject*>(sender)->connectNotify(signal - 1);
     return true;
@@ -2766,7 +2769,7 @@ bool QObject::connect(const QObject *sender, const QMetaMethod &signal,
     if (warnCompat)
         check_and_warn_compat(smeta, signal, rmeta, method);
 #endif
-    if (!QMetaObjectPrivate::connect(sender, signal_index, receiver, method_index, type, types))
+    if (!QMetaObjectPrivate::connect(sender, signal_index, receiver, method_index, 0, type, types))
         return false;
 
     const_cast<QObject*>(sender)->connectNotify(signalSignature.constData());
@@ -3157,18 +3160,28 @@ bool QMetaObject::connect(const QObject *sender, int signal_index,
 {
     signal_index = methodIndexToSignalIndex(sender->metaObject(), signal_index);
     return QMetaObjectPrivate::connect(sender, signal_index,
-                                       receiver, method_index, type, types);
+                                       receiver, method_index,
+                                       0, //FIXME, we could speed this connection up by computing the relative index
+                                       type, types);
 }
 
 /*! \internal
    Same as the QMetaObject::connect, but \a signal_index must be the result of QObjectPrivate::signalIndex
+
+    method_index is relative to the rmeta metaobject, if rmeta is null, then it is absolute index
  */
 bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
-                                 const QObject *receiver, int method_index, int type, int *types)
+                                 const QObject *receiver, int method_index,
+                                 const QMetaObject *rmeta, int type, int *types)
 {
     QObject *s = const_cast<QObject *>(sender);
     QObject *r = const_cast<QObject *>(receiver);
 
+    int method_offset = rmeta ? rmeta->methodOffset() : 0;
+    QObjectPrivate::StaticMetaCallFunction callFunction =
+        (rmeta && QMetaObjectPrivate::get(rmeta)->revision >= 6 && rmeta->d.extradata)
+        ? reinterpret_cast<const QMetaObjectExtraData *>(rmeta->d.extradata)->static_metacall : 0;
+
     QOrderedMutexLocker locker(signalSlotLock(sender),
                                signalSlotLock(receiver));
 
@@ -3178,8 +3191,10 @@ bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
             const QObjectPrivate::Connection *c2 =
                 (*connectionLists)[signal_index].first;
 
+            int method_index_absolute = method_index + method_offset;
+
             while (c2) {
-                if (c2->receiver == receiver && c2->method == method_index)
+                if (c2->receiver == receiver && c2->method() == method_index_absolute)
                     return false;
                 c2 = c2->nextConnectionList;
             }
@@ -3190,10 +3205,12 @@ bool QMetaObjectPrivate::connect(const QObject *sender, int signal_index,
     QObjectPrivate::Connection *c = new QObjectPrivate::Connection;
     c->sender = s;
     c->receiver = r;
-    c->method = method_index;
+    c->method_relative = method_index;
+    c->method_offset = method_offset;
     c->connectionType = type;
     c->argumentTypes = types;
     c->nextConnectionList = 0;
+    c->callFunction = callFunction;
 
     QT_TRY {
         QObjectPrivate::get(s)->addConnection(signal_index, c);
@@ -3254,7 +3271,7 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c,
     while (c) {
         if (c->receiver
             && (receiver == 0 || (c->receiver == receiver
-                           && (method_index < 0 || c->method == method_index)))) {
+                           && (method_index < 0 || c->method() == method_index)))) {
             bool needToUnlock = false;
             QMutex *receiverMutex = 0;
             if (!receiver) {
@@ -3428,7 +3445,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
     args[0] = 0; // return value
     for (int n = 1; n < nargs; ++n)
         args[n] = QMetaType::construct((types[n] = c->argumentTypes[n-1]), argv[n]);
-    QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method,
+    QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method(),
                                                                sender,
                                                                signal,
                                                                nargs,
@@ -3503,7 +3520,6 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                 continue;
 
             QObject * const receiver = c->receiver;
-            const int method = c->method;
             const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId;
 
             // determine if this connection should be sent immediately or
@@ -3514,6 +3530,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                 continue;
 #ifndef QT_NO_THREAD
             } else if (c->connectionType == Qt::BlockingQueuedConnection) {
+                const int method = c->method();
                 locker.unlock();
                 if (receiverInSameThread) {
                     qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: "
@@ -3532,6 +3549,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                 continue;
 #endif
             }
+
             QObjectPrivate::Sender currentSender;
             QObjectPrivate::Sender *previousSender = 0;
             if (receiverInSameThread) {
@@ -3540,36 +3558,52 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                 currentSender.ref = 1;
                 previousSender = QObjectPrivate::setCurrentSender(receiver, &currentSender);
             }
-            locker.unlock();
+            const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction;
+            const int method_relative = c->method_relative;
+            if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
+                //we compare the vtable to make sure we are not in the destructor of the object.
+                locker.unlock();
+                if (qt_signal_spy_callback_set.slot_begin_callback != 0)
+                    qt_signal_spy_callback_set.slot_begin_callback(receiver, c->method(), argv ? argv : empty_argv);
 
-            if (qt_signal_spy_callback_set.slot_begin_callback != 0) {
-                qt_signal_spy_callback_set.slot_begin_callback(receiver,
-                                                               method,
-                                                               argv ? argv : empty_argv);
-            }
+                callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv ? argv : empty_argv);
 
-#if defined(QT_NO_EXCEPTIONS)
-            metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
-#else
-            QT_TRY {
-                metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
-            } QT_CATCH(...) {
+                if (qt_signal_spy_callback_set.slot_end_callback != 0)
+                    qt_signal_spy_callback_set.slot_end_callback(receiver, c->method());
                 locker.relock();
-                if (receiverInSameThread)
-                    QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
+            } else {
+                const int method = method_relative + c->method_offset;
+                locker.unlock();
 
-                --connectionLists->inUse;
-                Q_ASSERT(connectionLists->inUse >= 0);
-                if (connectionLists->orphaned && !connectionLists->inUse)
-                    delete connectionLists;
-                QT_RETHROW;
-            }
+                if (qt_signal_spy_callback_set.slot_begin_callback != 0) {
+                    qt_signal_spy_callback_set.slot_begin_callback(receiver,
+                                                                method,
+                                                                argv ? argv : empty_argv);
+                }
+
+#if defined(QT_NO_EXCEPTIONS)
+                metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
+#else
+                QT_TRY {
+                    metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
+                } QT_CATCH(...) {
+                    locker.relock();
+                    if (receiverInSameThread)
+                        QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
+
+                    --connectionLists->inUse;
+                    Q_ASSERT(connectionLists->inUse >= 0);
+                    if (connectionLists->orphaned && !connectionLists->inUse)
+                        delete connectionLists;
+                    QT_RETHROW;
+                }
 #endif
 
-            if (qt_signal_spy_callback_set.slot_end_callback != 0)
-                qt_signal_spy_callback_set.slot_end_callback(receiver, method);
+                if (qt_signal_spy_callback_set.slot_end_callback != 0)
+                    qt_signal_spy_callback_set.slot_end_callback(receiver, method);
 
-            locker.relock();
+                locker.relock();
+            }
 
             if (receiverInSameThread)
                 QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
@@ -3870,7 +3904,7 @@ void QObject::dumpObjectInfo()
                     continue;
                 }
                 const QMetaObject *receiverMetaObject = c->receiver->metaObject();
-                const QMetaMethod method = receiverMetaObject->method(c->method);
+                const QMetaMethod method = receiverMetaObject->method(c->method());
                 qDebug("          --> %s::%s %s",
                        receiverMetaObject->className(),
                        c->receiver->objectName().isEmpty() ? "unnamed" : qPrintable(c->receiver->objectName()),
@@ -3887,7 +3921,7 @@ void QObject::dumpObjectInfo()
 
     if (d->senders) {
         for (QObjectPrivate::Connection *s = d->senders; s; s = s->next) {
-            const QMetaMethod slot = metaObject()->method(s->method);
+            const QMetaMethod slot = metaObject()->method(s->method());
             qDebug("          <-- %s::%s  %s",
                    s->sender->metaObject()->className(),
                    s->sender->objectName().isEmpty() ? "unnamed" : qPrintable(s->sender->objectName()),
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index c7555be..71b5bee 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -108,19 +108,23 @@ public:
         QList<QVariant> propertyValues;
     };
 
+    typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **);
     struct Connection
     {
         QObject *sender;
         QObject *receiver;
-        int method;
-        uint connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking
-        QBasicAtomicPointer<int> argumentTypes;
+        StaticMetaCallFunction callFunction;
         // The next pointer for the singly-linked ConnectionList
         Connection *nextConnectionList;
         //senders linked list
         Connection *next;
         Connection **prev;
+        QBasicAtomicPointer<int> argumentTypes;
+        ushort method_offset;
+        ushort method_relative;
+        ushort connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking
         ~Connection();
+        int method() const { return method_offset + method_relative; }
     };
     // ConnectionList is a singly-linked list
     struct ConnectionList {
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 54b5ab2..6bf40f7 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -55,7 +55,7 @@ class QByteArray;
 class QString;
 
 #ifndef Q_MOC_OUTPUT_REVISION
-#define Q_MOC_OUTPUT_REVISION 62
+#define Q_MOC_OUTPUT_REVISION 63
 #endif
 
 // The following macros are our "extensions" to C++
@@ -163,6 +163,7 @@ public: \
     virtual void *qt_metacast(const char *); \
     QT_TR_FUNCTIONS \
     virtual int qt_metacall(QMetaObject::Call, int, void **); \
+    static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
 private:
 /* tmake ignore Q_OBJECT */
 #define Q_OBJECT_FAKE Q_OBJECT
@@ -468,7 +469,6 @@ struct Q_CORE_EXPORT QMetaObject
         const uint *data;
         const void *extradata;
     } d;
-
 };
 
 typedef const QMetaObject& (*QMetaObjectAccessor)();
@@ -480,7 +480,8 @@ struct QMetaObjectExtraData
 #else
     const QMetaObject **objects;
 #endif
-    int (*static_metacall)(QMetaObject::Call, int, void **);
+    void (*static_metacall)(QObject *, QMetaObject::Call, int, void **); //from revision 6
+    //int (*static_metacall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5
 };
 
 inline const char *QMetaObject::className() const
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 4df7ae5..ac769d7 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -173,7 +173,7 @@ void Generator::generateCode()
     int index = 14;
     fprintf(out, "static const uint qt_meta_data_%s[] = {\n", qualifiedClassNameIdentifier.constData());
     fprintf(out, "\n // content:\n");
-    fprintf(out, "    %4d,       // revision\n", 5);
+    fprintf(out, "    %4d,       // revision\n", 6);
     fprintf(out, "    %4d,       // classname\n", strreg(cdef->qualified));
     fprintf(out, "    %4d, %4d, // classinfo\n", cdef->classInfoList.count(), cdef->classInfoList.count() ? index : 0);
     index += cdef->classInfoList.count() * 2;
@@ -291,12 +291,11 @@ void Generator::generateCode()
     }
     fprintf(out, "\"\n};\n\n");
 
-
 //
 // Generate internal qt_static_metacall() function
 //
-    if (isConstructible)
-        generateStaticMetacall(qualifiedClassNameIdentifier);
+    if (cdef->hasQObject && !isQt)
+        generateStaticMetacall();
 
 //
 // Build extra array
@@ -329,17 +328,19 @@ void Generator::generateCode()
         fprintf(out, "    0\n};\n\n");
     }
 
-    if (isConstructible || !extraList.isEmpty()) {
+    bool hasExtraData = (cdef->hasQObject && !isQt) || !extraList.isEmpty();
+    if (hasExtraData) {
         fprintf(out, "static const QMetaObjectExtraData qt_meta_extradata2_%s = {\n    ",
                 qualifiedClassNameIdentifier.constData());
         if (extraList.isEmpty())
             fprintf(out, "0, ");
         else
             fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData());
-        if (!isConstructible)
-            fprintf(out, "0");
+
+        if (cdef->hasQObject && !isQt)
+            fprintf(out, " %s::qt_static_metacall", cdef->qualified.constData());
         else
-            fprintf(out, "%s_qt_static_metacall", qualifiedClassNameIdentifier.constData());
+            fprintf(out, " 0");
         fprintf(out, " \n};\n\n");
     }
 
@@ -359,7 +360,7 @@ void Generator::generateCode()
         fprintf(out, "    { 0, ");
     fprintf(out, "qt_meta_stringdata_%s,\n      qt_meta_data_%s, ",
              qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData());
-    if (!isConstructible && extraList.isEmpty())
+    if (!hasExtraData)
         fprintf(out, "0 }\n");
     else
         fprintf(out, "&qt_meta_extradata2_%s }\n", qualifiedClassNameIdentifier.constData());
@@ -657,34 +658,11 @@ void Generator::generateMetacall()
 
     if (methodList.size()) {
         needElse = true;
-        fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n        ");
-        fprintf(out, "switch (_id) {\n");
-        for (int methodindex = 0; methodindex < methodList.size(); ++methodindex) {
-            const FunctionDef &f = methodList.at(methodindex);
-            fprintf(out, "        case %d: ", methodindex);
-            if (f.normalizedType.size())
-                fprintf(out, "{ %s _r = ", noRef(f.normalizedType).constData());
-            if (f.inPrivateClass.size())
-                fprintf(out, "%s->", f.inPrivateClass.constData());
-            fprintf(out, "%s(", f.name.constData());
-            int offset = 1;
-            for (int j = 0; j < f.arguments.count(); ++j) {
-                const ArgumentDef &a = f.arguments.at(j);
-                if (j)
-                    fprintf(out, ",");
-                fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++);
-            }
-            fprintf(out, ");");
-            if (f.normalizedType.size())
-                fprintf(out, "\n            if (_a[0]) *reinterpret_cast< %s*>(_a[0]) = _r; } ",
-                        noRef(f.normalizedType).constData());
-            fprintf(out, " break;\n");
-        }
-        fprintf(out, "        default: ;\n");
-        fprintf(out, "        }\n");
-    }
-    if (methodList.size())
+        fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n");
+        fprintf(out, "        if (_id < %d)\n", methodList.size());
+        fprintf(out, "            qt_static_metacall(this, _c, _id, _a);\n");
         fprintf(out, "        _id -= %d;\n    }", methodList.size());
+    }
 
     if (cdef->propertyList.size()) {
         bool needGet = false;
@@ -900,40 +878,95 @@ void Generator::generateMetacall()
     fprintf(out,"return _id;\n}\n");
 }
 
-void Generator::generateStaticMetacall(const QByteArray &prefix)
+void Generator::generateStaticMetacall()
 {
-    bool isQObject = (cdef->classname == "QObject");
+    fprintf(out, "void %s::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)\n{\n",
+            cdef->qualified.constData());
 
-    fprintf(out, "static int %s_qt_static_metacall(QMetaObject::Call _c, int _id, void **_a)\n{\n",
-            prefix.constData());
+    bool needElse = false;
+    bool isUsed_a = false;
+
+    if (!cdef->constructorList.isEmpty()) {
+        fprintf(out, "    if (_c == QMetaObject::CreateInstance) {\n");
+        fprintf(out, "        switch (_id) {\n");
+        for (int ctorindex = 0; ctorindex < cdef->constructorList.count(); ++ctorindex) {
+            fprintf(out, "        case %d: { %s *_r = new %s(", ctorindex,
+                    cdef->classname.constData(), cdef->classname.constData());
+            const FunctionDef &f = cdef->constructorList.at(ctorindex);
+            int offset = 1;
+            for (int j = 0; j < f.arguments.count(); ++j) {
+                const ArgumentDef &a = f.arguments.at(j);
+                if (j)
+                    fprintf(out, ",");
+                fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))", a.typeNameForCast.constData(), offset++);
+            }
+            fprintf(out, ");\n");
+            fprintf(out, "            if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break;\n");
+        }
+        fprintf(out, "        }\n");
+        fprintf(out, "    }");
+        needElse = true;
+        isUsed_a = true;
+    }
 
-    fprintf(out, "    if (_c == QMetaObject::CreateInstance) {\n");
-    fprintf(out, "        switch (_id) {\n");
-    for (int ctorindex = 0; ctorindex < cdef->constructorList.count(); ++ctorindex) {
-        fprintf(out, "        case %d: { %s *_r = new %s(", ctorindex,
-                cdef->qualified.constData(), cdef->qualified.constData());
-        const FunctionDef &f = cdef->constructorList.at(ctorindex);
-        int offset = 1;
-        for (int j = 0; j < f.arguments.count(); ++j) {
-            const ArgumentDef &a = f.arguments.at(j);
-            if (j)
-                fprintf(out, ",");
-            fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))", a.typeNameForCast.constData(), offset++);
+    QList<FunctionDef> methodList;
+    methodList += cdef->signalList;
+    methodList += cdef->slotList;
+    methodList += cdef->methodList;
+
+    if (!methodList.isEmpty()) {
+        if (needElse)
+            fprintf(out, " else ");
+        else
+            fprintf(out, "    ");
+        fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n");
+        fprintf(out, "        Q_ASSERT(qobject_cast<%s *>(_o));\n", cdef->classname.constData());
+        fprintf(out, "        %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
+        fprintf(out, "        switch (_id) {\n");
+        for (int methodindex = 0; methodindex < methodList.size(); ++methodindex) {
+            const FunctionDef &f = methodList.at(methodindex);
+            fprintf(out, "        case %d: ", methodindex);
+            if (f.normalizedType.size())
+                fprintf(out, "{ %s _r = ", noRef(f.normalizedType).constData());
+            fprintf(out, "_t->");
+            if (f.inPrivateClass.size())
+                fprintf(out, "%s->", f.inPrivateClass.constData());
+            fprintf(out, "%s(", f.name.constData());
+            int offset = 1;
+            for (int j = 0; j < f.arguments.count(); ++j) {
+                const ArgumentDef &a = f.arguments.at(j);
+                if (j)
+                    fprintf(out, ",");
+                fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++);
+                isUsed_a = true;
+            }
+            fprintf(out, ");");
+            if (f.normalizedType.size()) {
+                fprintf(out, "\n            if (_a[0]) *reinterpret_cast< %s*>(_a[0]) = _r; } ",
+                        noRef(f.normalizedType).constData());
+                isUsed_a = true;
+            }
+            fprintf(out, " break;\n");
         }
-        fprintf(out, ");\n");
-        fprintf(out, "            if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break;\n");
+        fprintf(out, "        default: ;\n");
+        fprintf(out, "        }\n");
+        fprintf(out, "    }");
+        needElse = true;
     }
-    fprintf(out, "        }\n");
-    fprintf(out, "        _id -= %d;\n", cdef->constructorList.count());
-    fprintf(out, "        return _id;\n");
-    fprintf(out, "    }\n");
 
-    if (!isQObject)
-        fprintf(out, "    _id = %s::staticMetaObject.superClass()->static_metacall(_c, _id, _a);\n", cdef->qualified.constData());
+    if (needElse)
+        fprintf(out, "\n");
 
-    fprintf(out, "    if (_id < 0)\n        return _id;\n");
+    if (methodList.isEmpty()) {
+        fprintf(out, "    Q_UNUSED(_o);\n");
+        if (cdef->constructorList.isEmpty()) {
+            fprintf(out, "    Q_UNUSED(_id);\n");
+            fprintf(out, "    Q_UNUSED(_c);\n");
+        }
+    }
+    if (!isUsed_a)
+        fprintf(out, "    Q_UNUSED(_a);\n");
 
-    fprintf(out, "    return _id;\n");
     fprintf(out, "}\n\n");
 }
 
diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h
index ed0980e..fa5885f 100644
--- a/src/tools/moc/generator.h
+++ b/src/tools/moc/generator.h
@@ -62,7 +62,7 @@ private:
     void generateEnums(int index);
     void generateProperties();
     void generateMetacall();
-    void generateStaticMetacall(const QByteArray &prefix);
+    void generateStaticMetacall();
     void generateSignal(FunctionDef *def, int index);
 
     // used by binary QMetaObject generator
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 74b1ace..5078b28 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -356,8 +356,9 @@ bool Moc::testFunctionRevision(FunctionDef *def)
 bool Moc::parseFunction(FunctionDef *def, bool inMacro)
 {
     def->isVirtual = false;
+    def->isStatic = false;
     //skip modifiers and attributes
-    while (test(INLINE) || test(STATIC) ||
+    while (test(INLINE) || (test(STATIC) && (def->isStatic = true)) ||
         (test(VIRTUAL) && (def->isVirtual = true)) //mark as virtual
         || testFunctionAttribute(def) || testFunctionRevision(def)) {}
     bool templateFunction = (lookup() == TEMPLATE);
@@ -447,8 +448,9 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro)
 bool Moc::parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
 {
     def->isVirtual = false;
+    def->isStatic = false;
     //skip modifiers and attributes
-    while (test(EXPLICIT) || test(INLINE) || test(STATIC) ||
+    while (test(EXPLICIT) || test(INLINE) || (test(STATIC) && (def->isStatic = true)) ||
         (test(VIRTUAL) && (def->isVirtual = true)) //mark as virtual
         || testFunctionAttribute(def) || testFunctionRevision(def)) {}
     bool tilde = test(TILDE);
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index 38c3917..4049534 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -83,7 +83,7 @@ struct ArgumentDef
 
 struct FunctionDef
 {
-    FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false),
+    FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false), isStatic(false),
                    inlineCode(false), wasCloned(false), isCompat(false), isInvokable(false),
                    isScriptable(false), isSlot(false), isSignal(false),
                    isConstructor(false), isDestructor(false), isAbstract(false), revision(0) {}
@@ -99,6 +99,7 @@ struct FunctionDef
     Access access;
     bool isConst;
     bool isVirtual;
+    bool isStatic;
     bool inlineCode;
     bool wasCloned;
 
diff --git a/src/tools/moc/outputrevision.h b/src/tools/moc/outputrevision.h
index 7e2ca8b..104a373 100644
--- a/src/tools/moc/outputrevision.h
+++ b/src/tools/moc/outputrevision.h
@@ -43,6 +43,6 @@
 #define OUTPUTREVISION_H
 
 // if the output revision changes, you MUST change it in qobjectdefs.h too
-enum { mocOutputRevision = 62 };          // moc format output revision
+enum { mocOutputRevision = 63 };          // moc format output revision
 
 #endif // OUTPUTREVISION_H
-- 
cgit v0.12


From a1a141e4af6226dca9ae67c51dd5e14cb3393772 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 29 Mar 2011 11:01:48 +0200
Subject: moc: be able to compile if there are private classes

Reviewed-by: brad
Reviewed-by: thiago
---
 src/corelib/global/qglobal.h     |  9 ++++++++-
 src/corelib/kernel/qobjectdefs.h | 12 ++++++++----
 src/tools/moc/generator.cpp      |  8 ++++----
 tests/auto/moc/tst_moc.cpp       | 22 +++++++++++++++++++++-
 4 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 8dd8850..cf63943 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -759,6 +759,7 @@ namespace QT_NAMESPACE {}
 #    endif
 #    if __HP_aCC-0 >= 062000
 #      define Q_DECL_EXPORT     __attribute__((visibility("default")))
+#      define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
 #      define Q_DECL_IMPORT     Q_DECL_EXPORT
 #    endif
 #  else
@@ -773,11 +774,11 @@ namespace QT_NAMESPACE {}
 #elif defined(__WINSCW__) && !defined(Q_CC_NOKIAX86)
 #  define Q_CC_NOKIAX86
 
-
 #else
 #  error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
 #endif
 
+
 #ifdef Q_CC_INTEL
 #  if __INTEL_COMPILER < 1200
 #    define Q_NO_TEMPLATE_FRIENDS
@@ -1238,6 +1239,7 @@ class QDataStream;
 #if defined(Q_OS_LINUX) && defined(Q_CC_RVCT)
 #  define Q_DECL_EXPORT     __attribute__((visibility("default")))
 #  define Q_DECL_IMPORT     __attribute__((visibility("default")))
+#  define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
 #endif
 
 #ifndef Q_DECL_EXPORT
@@ -1245,6 +1247,7 @@ class QDataStream;
 #    define Q_DECL_EXPORT __declspec(dllexport)
 #  elif defined(QT_VISIBILITY_AVAILABLE)
 #    define Q_DECL_EXPORT __attribute__((visibility("default")))
+#    define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
 #  endif
 #  ifndef Q_DECL_EXPORT
 #    define Q_DECL_EXPORT
@@ -1257,6 +1260,10 @@ class QDataStream;
 #    define Q_DECL_IMPORT
 #  endif
 #endif
+#ifndef Q_DECL_HIDDEN
+#  define Q_DECL_HIDDEN
+#endif
+
 
 /*
    Create Qt DLL if QT_DLL is defined (Windows and Symbian only)
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 6bf40f7..4384837 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -163,8 +163,10 @@ public: \
     virtual void *qt_metacast(const char *); \
     QT_TR_FUNCTIONS \
     virtual int qt_metacall(QMetaObject::Call, int, void **); \
-    static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
-private:
+private: \
+    Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \
+    Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
+
 /* tmake ignore Q_OBJECT */
 #define Q_OBJECT_FAKE Q_OBJECT
 /* tmake ignore Q_GADGET */
@@ -480,8 +482,10 @@ struct QMetaObjectExtraData
 #else
     const QMetaObject **objects;
 #endif
-    void (*static_metacall)(QObject *, QMetaObject::Call, int, void **); //from revision 6
-    //int (*static_metacall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5
+
+    typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); //from revision 6
+    //typedef int (*StaticMetaCall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5
+    StaticMetacallFunction static_metacall;
 };
 
 inline const char *QMetaObject::className() const
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index ac769d7..67aba8f 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -330,15 +330,15 @@ void Generator::generateCode()
 
     bool hasExtraData = (cdef->hasQObject && !isQt) || !extraList.isEmpty();
     if (hasExtraData) {
-        fprintf(out, "static const QMetaObjectExtraData qt_meta_extradata2_%s = {\n    ",
-                qualifiedClassNameIdentifier.constData());
+        fprintf(out, "const QMetaObjectExtraData %s::staticMetaObjectExtraData = {\n    ",
+                cdef->qualified.constData());
         if (extraList.isEmpty())
             fprintf(out, "0, ");
         else
             fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData());
 
         if (cdef->hasQObject && !isQt)
-            fprintf(out, " %s::qt_static_metacall", cdef->qualified.constData());
+            fprintf(out, " qt_static_metacall");
         else
             fprintf(out, " 0");
         fprintf(out, " \n};\n\n");
@@ -363,7 +363,7 @@ void Generator::generateCode()
     if (!hasExtraData)
         fprintf(out, "0 }\n");
     else
-        fprintf(out, "&qt_meta_extradata2_%s }\n", qualifiedClassNameIdentifier.constData());
+        fprintf(out, "&staticMetaObjectExtraData }\n");
     fprintf(out, "};\n");
 
     if(isQt)
diff --git a/tests/auto/moc/tst_moc.cpp b/tests/auto/moc/tst_moc.cpp
index 203f0ae..7a8f958 100644
--- a/tests/auto/moc/tst_moc.cpp
+++ b/tests/auto/moc/tst_moc.cpp
@@ -497,7 +497,7 @@ private slots:
     void revisions();
     void warnings_data();
     void warnings();
-
+    void privateClass();
 
 signals:
     void sigWithUnsignedArg(unsigned foo);
@@ -517,6 +517,7 @@ private:
 
 private:
     QString qtIncludePath;
+    class PrivateClass;
 };
 
 void tst_Moc::initTestCase()
@@ -1648,6 +1649,25 @@ void tst_Moc::warnings()
 
     }
 
+class tst_Moc::PrivateClass : public QObject {
+    Q_PROPERTY(int someProperty READ someSlot WRITE someSlot2)
+Q_OBJECT
+Q_SIGNALS:
+    void someSignal();
+public Q_SLOTS:
+    int someSlot() { return 1; }
+    void someSlot2(int) {}
+public:
+    Q_INVOKABLE PrivateClass()  {}
+};
+
+void tst_Moc::privateClass()
+{
+    QVERIFY(PrivateClass::staticMetaObject.indexOfConstructor("PrivateClass()") == 0);
+    QVERIFY(PrivateClass::staticMetaObject.indexOfSignal("someSignal()") > 0);
+}
+
+
 QTEST_APPLESS_MAIN(tst_Moc)
 #include "tst_moc.moc"
 
-- 
cgit v0.12


From 6fcd431d04cf7416179d5ab30f656a6ce3926070 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 24 Mar 2011 17:38:26 +0100
Subject: Fix declarative after the last changes to the QObject internals

---
 src/declarative/qml/qmetaobjectbuilder.cpp                        | 2 +-
 src/declarative/qml/qmetaobjectbuilder_p.h                        | 2 +-
 .../declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp     | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/declarative/qml/qmetaobjectbuilder.cpp b/src/declarative/qml/qmetaobjectbuilder.cpp
index 6a0226f..dc941e2 100644
--- a/src/declarative/qml/qmetaobjectbuilder.cpp
+++ b/src/declarative/qml/qmetaobjectbuilder.cpp
@@ -791,7 +791,7 @@ void QMetaObjectBuilder::addMetaObject
     }
 
     if ((members & StaticMetacall) != 0) {
-        if (priv(prototype->d.data)->revision >= 2) {
+        if (priv(prototype->d.data)->revision >= 6) {
             const QMetaObjectExtraData *extra =
                 (const QMetaObjectExtraData *)(prototype->d.extradata);
             if (extra && extra->static_metacall)
diff --git a/src/declarative/qml/qmetaobjectbuilder_p.h b/src/declarative/qml/qmetaobjectbuilder_p.h
index 2678bff..d7085f8 100644
--- a/src/declarative/qml/qmetaobjectbuilder_p.h
+++ b/src/declarative/qml/qmetaobjectbuilder_p.h
@@ -169,7 +169,7 @@ public:
     int indexOfEnumerator(const QByteArray& name);
     int indexOfClassInfo(const QByteArray& name);
 
-    typedef int (*StaticMetacallFunction)(QMetaObject::Call, int, void **);
+    typedef QMetaObjectExtraData::StaticMetacallFunction StaticMetacallFunction;
 
     QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction() const;
     void setStaticMetacallFunction(QMetaObjectBuilder::StaticMetacallFunction value);
diff --git a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 06baed8..1b9831c 100644
--- a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -140,9 +140,9 @@ void tst_QMetaObjectBuilder::mocVersionCheck()
     // whenenver moc changes.  Once QMetaObjectBuilder has been
     // updated, this test can be changed to check for the next version.
     int version = int(QObject::staticMetaObject.d.data[0]);
-    QVERIFY(version == 4 || version == 5);
+    QVERIFY(version == 4 || version == 5 || version == 6);
     version = int(staticMetaObject.d.data[0]);
-    QVERIFY(version == 4 || version == 5);
+    QVERIFY(version == 4 || version == 5 || version == 6);
 }
 
 void tst_QMetaObjectBuilder::create()
@@ -920,9 +920,9 @@ void tst_QMetaObjectBuilder::relatedMetaObject()
     QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::RelatedMetaObjects));
 }
 
-static int smetacall(QMetaObject::Call, int, void **)
+static void smetacall(QObject *, QMetaObject::Call, int, void **)
 {
-    return 0;
+    return;
 }
 
 void tst_QMetaObjectBuilder::staticMetacall()
-- 
cgit v0.12


From b63e0f7c612f7e63831dbee3565292ddca7dba59 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 29 Mar 2011 11:02:20 +0200
Subject: Optimize QMutexPool

Make the get() function inline
and simplify the hash computation

Reviewed-by: brad
---
 src/corelib/thread/qmutexpool.cpp | 22 ++++++++++------------
 src/corelib/thread/qmutexpool_p.h | 10 +++++++++-
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp
index 13e29c3..144fa35 100644
--- a/src/corelib/thread/qmutexpool.cpp
+++ b/src/corelib/thread/qmutexpool.cpp
@@ -123,22 +123,20 @@ QMutexPool *QMutexPool::instance()
     return globalMutexPool();
 }
 
-/*!
+/*!  \fn QMutexPool::get(void *address)
     Returns a QMutex from the pool. QMutexPool uses the value \a address
     to determine which mutex is returned from the pool.
 */
-QMutex *QMutexPool::get(const void *address)
-{
-    Q_ASSERT_X(address != 0, "QMutexPool::get()", "'address' argument cannot be zero");
-    int index = int((quintptr(address) >> (sizeof(address) >> 1)) % mutexes.count());
-
-    if (!mutexes[index]) {
-        // mutex not created, create one
-        QMutex *newMutex = new QMutex(recursionMode);
-        if (!mutexes[index].testAndSetOrdered(0, newMutex))
-            delete newMutex;
-    }
 
+/*! \internal
+  create the mutex for the given index
+ */
+QMutex *QMutexPool::createMutex(int index)
+{
+    // mutex not created, create one
+    QMutex *newMutex = new QMutex(recursionMode);
+    if (!mutexes[index].testAndSetOrdered(0, newMutex))
+        delete newMutex;
     return mutexes[index];
 }
 
diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h
index 1a45ba9..b2cd210 100644
--- a/src/corelib/thread/qmutexpool_p.h
+++ b/src/corelib/thread/qmutexpool_p.h
@@ -67,11 +67,19 @@ public:
     explicit QMutexPool(QMutex::RecursionMode recursionMode = QMutex::NonRecursive, int size = 131);
     ~QMutexPool();
 
-    QMutex *get(const void *address);
+    inline QMutex *get(const void *address) {
+        int index = uint(quintptr(address)) % mutexes.count();
+        QMutex *m = mutexes[index];
+        if (m)
+            return m;
+        else
+            return createMutex(index);
+    }
     static QMutexPool *instance();
     static QMutex *globalInstanceGet(const void *address);
 
 private:
+    QMutex *createMutex(int index);
     QVarLengthArray<QAtomicPointer<QMutex>, 131> mutexes;
     QMutex::RecursionMode recursionMode;
 };
-- 
cgit v0.12


From 6022cd668435d1dda127e26e71de01982c7441a3 Mon Sep 17 00:00:00 2001
From: Aaron Tunney <ext-aaron.2.tunney@nokia.com>
Date: Wed, 30 Mar 2011 16:46:10 +0100
Subject: Ayschronous Next() change for DNS resolution.

Reviewed-By: Shane Kearns
---
 src/network/kernel/qhostinfo_p.h         |  12 +++-
 src/network/kernel/qhostinfo_symbian.cpp | 116 ++++++++++++++++++-------------
 2 files changed, 77 insertions(+), 51 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index a7e83da..ab3e809 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -236,6 +236,8 @@ public:
     void requestHostLookup();
     int id();
 
+    void returnResults();
+
     QHostInfoResult resultEmitter;
 
 private:
@@ -244,10 +246,13 @@ private:
     void run();
     TInt RunError(TInt aError);
 
-    void processNameResults();
-    void processAddressResults();
+    void processNameResult();
+    void nextNameResult();
+    void processAddressResult();
 
 private:
+    int iId;
+
     const QString iHostName;
     QString iEncodedHostName;
     TPtrC iHostNamePtr;
@@ -263,10 +268,13 @@ private:
 
     QHostInfo iResults;
 
+    QList<QHostAddress> iHostAddresses;
+
     enum {
         EIdle,
         EGetByName,
         EGetByAddress,
+        EGetMoreNames,
         EError
     } iState;
 };
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 02bef40..70ee5b8 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -53,9 +53,12 @@
 #include <private/qsystemerror_p.h>
 #include <private/qnetworksession_p.h>
 
-QT_BEGIN_NAMESPACE
-
+// Header does not exist in the S60 5.0 SDK
+//#include <networking/dnd_err.h>
+const TInt KErrDndNameNotFound = -5120; // Returned when no data found for GetByName
+const TInt KErrDndAddrNotFound = -5121; // Returned when no data found for GetByAddr
 
+QT_BEGIN_NAMESPACE
 
 QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession)
 {
@@ -88,15 +91,14 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     QHostAddress address;
     if (address.setAddress(hostName)) {
         // Reverse lookup
-
         TInetAddr IpAdd;
         IpAdd.Input(qt_QString2TPtrC(hostName));
 
         // Synchronous request. nameResult returns Host Name.
-        hostResolver.GetByAddress(IpAdd, nameResult);
+        err = hostResolver.GetByAddress(IpAdd, nameResult);
         if (err) {
             // TODO - Could there be other errors? Symbian docs don't say.
-            if (err == KErrNotFound) {
+            if (err == KErrDndAddrNotFound) {
                 results.setError(QHostInfo::HostNotFound);
                 results.setErrorString(tr("Host not found"));
             } else {
@@ -131,7 +133,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     err = hostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), nameResult);
     if (err) {
         // TODO - Could there be other errors? Symbian docs don't say.
-        if (err == KErrNotFound) {
+        if (err == KErrDndNameNotFound) {
             results.setError(QHostInfo::HostNotFound);
             results.setErrorString(tr("Host not found"));
         } else {
@@ -159,7 +161,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
         hostAdd.Output(ipAddr);
 
         // Ensure that record is valid (not an alias and with length greater than 0)
-        if (!(nameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
+        if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) {
             hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
         }
     }
@@ -244,7 +246,6 @@ void QSymbianHostResolver::requestHostLookup()
 #endif
     }
     if (err) {
-        // What are we doing with iResults??
         iResults.setError(QHostInfo::UnknownError);
         iResults.setErrorString(QSystemError(err, QSystemError::NativeError).toString());
 
@@ -252,7 +253,6 @@ void QSymbianHostResolver::requestHostLookup()
 
         if (iAddress.setAddress(iHostName)) {
             // Reverse lookup
-
             IpAdd.Input(qt_QString2TPtrC(iHostName));
 
             // Asynchronous request.
@@ -297,7 +297,7 @@ void QSymbianHostResolver::DoCancel()
 #if defined(QHOSTINFO_DEBUG)
     qDebug() << "QSymbianHostResolver::DoCancel" << QThread::currentThreadId() << id() << (int)iState << this;
 #endif
-    if (iState == EGetByAddress || iState == EGetByName) {
+    if (iState == EGetByAddress || iState == EGetByName || iState == EGetMoreNames) {
         //these states have made an async request to host resolver
         iHostResolver.Cancel();
     } else {
@@ -313,11 +313,25 @@ void QSymbianHostResolver::RunL()
 
 void QSymbianHostResolver::run()
 {
-    if (iState == EGetByName)
-        processNameResults();
-    else if (iState == EGetByAddress)
-        processAddressResults();
+    switch (iState) {
+    case EGetByName:
+        processNameResult();
+        break;
+    case EGetByAddress:
+        processAddressResult();
+        break;
+    case EError:
+        returnResults();
+        break;
+    default:
+        iResults.setError(QHostInfo::UnknownError);
+        iResults.setErrorString(QSystemError(KErrCorrupt,QSystemError::NativeError).toString());
+        returnResults();
+    }
+}
 
+void QSymbianHostResolver::returnResults()
+{
     iState = EIdle;
 
     QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
@@ -348,55 +362,57 @@ TInt QSymbianHostResolver::RunError(TInt aError)
     return KErrNone;
 }
 
-void QSymbianHostResolver::processNameResults()
+void QSymbianHostResolver::processNameResult()
 {
-    TInt err = iStatus.Int();
-    if (err < 0) {
-        // TODO - Could there be other errors? Symbian docs don't say.
-        if (err == KErrNotFound) {
-            iResults.setError(QHostInfo::HostNotFound);
-            iResults.setErrorString(QObject::tr("Host not found"));
-        } else {
-            iResults.setError(QHostInfo::UnknownError);
-            iResults.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
-        }
-
-        iHostResolver.Close();
-        return;
-    }
-
-    QList<QHostAddress> hostAddresses;
-
-    TInetAddr hostAdd = iNameResult().iAddr;
-    // 39 is the maximum length of an IPv6 address.
-    TBuf<39> ipAddr;
-
-    // Fill ipAddr with the IP address from hostAdd
-    hostAdd.Output(ipAddr);
-    if (ipAddr.Length() > 0)
-        hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+    if (iStatus.Int() == KErrNone) {
+        TInetAddr hostAdd = iNameResult().iAddr;
+        // 39 is the maximum length of an IPv6 address.
+        TBuf<39> ipAddr;
 
-    // Check if there's more than one IP address linkd to this name
-    while (iHostResolver.Next(iNameResult) == KErrNone) {
-        hostAdd = iNameResult().iAddr;
         hostAdd.Output(ipAddr);
 
         // Ensure that record is valid (not an alias and with length greater than 0)
-        if (!(iNameResult().iFlags & TNameRecord::EAlias) && (ipAddr.Length() > 0)) {
-            hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+        if (!(iNameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) {
+           if (iNameResult().iAddr.Family() == KAfInet) {
+                // IPv4 - prepend
+                iHostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
+            } else {
+                // IPv6 - append
+                iHostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
+            }
         }
-    }
 
-    iResults.setAddresses(hostAddresses);
+        iState = EGetByName;
+        iHostResolver.Next(iNameResult, iStatus);
+        SetActive();
+    }
+    else if (iStatus.Int() == KErrDndNameNotFound) {
+        // No more addresses, so return the results (or an error if there aren't any).
+        if (iHostAddresses.count() > 0) {
+            iResults.setAddresses(iHostAddresses);
+        } else {
+            iState = EError;
+            iResults.setError(QHostInfo::HostNotFound);
+            iResults.setErrorString(QObject::tr("Host not found"));
+        }
+        returnResults();
+    }
+    else {
+        // Unknown error
+        iState = EError;
+        iResults.setError(QHostInfo::UnknownError);
+        iResults.setErrorString(QSystemError(iStatus.Int(),QSystemError::NativeError).toString());
+        returnResults();
+    }
 }
 
-void QSymbianHostResolver::processAddressResults()
+void QSymbianHostResolver::processAddressResult()
 {
     TInt err = iStatus.Int();
 
     if (err < 0) {
         // TODO - Could there be other errors? Symbian docs don't say.
-        if (err == KErrNotFound) {
+        if (err == KErrDndAddrNotFound) {
             iResults.setError(QHostInfo::HostNotFound);
             iResults.setErrorString(QObject::tr("Host not found"));
         } else {
@@ -404,11 +420,13 @@ void QSymbianHostResolver::processAddressResults()
             iResults.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
         }
 
+        returnResults();
         return;
     }
 
     iResults.setHostName(qt_TDesC2QString(iNameResult().iName));
     iResults.setAddresses(QList<QHostAddress>() << iAddress);
+    returnResults();
 }
 
 
-- 
cgit v0.12


From 591081142ce34435b4935d048a392c5727484c16 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 31 Mar 2011 15:37:13 +0100
Subject: Fix error handling in qhostinfo_symbian

De-duplicate error handling into a helper function.
RHostResolver can return a few different errors at the end of the list,
so treat these benign ones the same.
When Next() gives an error, return any results we already obtained.

Reviewed-by: Aaron Tunney
---
 src/network/kernel/qhostinfo_symbian.cpp | 96 ++++++++++++++------------------
 1 file changed, 42 insertions(+), 54 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 70ee5b8..73fed16 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -60,6 +60,25 @@ const TInt KErrDndAddrNotFound = -5121; // Returned when no data found for GetBy
 
 QT_BEGIN_NAMESPACE
 
+static void setError_helper(QHostInfo &info, TInt symbianError)
+{
+    switch (symbianError) {
+    case KErrDndNameNotFound:
+    case KErrDndAddrNotFound:
+    case KErrNotFound:
+    case KErrEof:
+        // various "no more results" error codes
+        info.setError(QHostInfo::HostNotFound);
+        info.setErrorString(QObject::tr("Host not found"));
+        break;
+    default:
+        // Unknown error
+        info.setError(QHostInfo::UnknownError);
+        info.setErrorString(QSystemError(symbianError, QSystemError::NativeError).toString());
+        break;
+    }
+}
+
 QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetworkSession> networkSession)
 {
     QHostInfo results;
@@ -75,9 +94,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     else
         err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
     if (err) {
-        results.setError(QHostInfo::UnknownError);
-        results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
-
+        setError_helper(results, err);
         return results;
     }
 
@@ -97,20 +114,11 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
         // Synchronous request. nameResult returns Host Name.
         err = hostResolver.GetByAddress(IpAdd, nameResult);
         if (err) {
-            // TODO - Could there be other errors? Symbian docs don't say.
-            if (err == KErrDndAddrNotFound) {
-                results.setError(QHostInfo::HostNotFound);
-                results.setErrorString(tr("Host not found"));
-            } else {
-                results.setError(QHostInfo::UnknownError);
-                results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
-            }
-
-            return results;
+            setError_helper(results, err);
+        } else {
+            results.setHostName(qt_TDesC2QString(nameResult().iName));
+            results.setAddresses(QList<QHostAddress>() << address);
         }
-
-        results.setHostName(qt_TDesC2QString(nameResult().iName));
-        results.setAddresses(QList<QHostAddress>() << address);
         return results;
     }
 
@@ -132,15 +140,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     // Synchronous request.
     err = hostResolver.GetByName(qt_QString2TPtrC(QString::fromLatin1(aceHostname)), nameResult);
     if (err) {
-        // TODO - Could there be other errors? Symbian docs don't say.
-        if (err == KErrDndNameNotFound) {
-            results.setError(QHostInfo::HostNotFound);
-            results.setErrorString(tr("Host not found"));
-        } else {
-            results.setError(QHostInfo::UnknownError);
-            results.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
-        }
-
+        setError_helper(results, err);
         return results;
     }
 
@@ -246,9 +246,7 @@ void QSymbianHostResolver::requestHostLookup()
 #endif
     }
     if (err) {
-        iResults.setError(QHostInfo::UnknownError);
-        iResults.setErrorString(QSystemError(err, QSystemError::NativeError).toString());
-
+        setError_helper(iResults, err);
     } else {
 
         if (iAddress.setAddress(iHostName)) {
@@ -324,6 +322,7 @@ void QSymbianHostResolver::run()
         returnResults();
         break;
     default:
+        qWarning("QSymbianHostResolver internal error, bad state in run()");
         iResults.setError(QHostInfo::UnknownError);
         iResults.setErrorString(QSystemError(KErrCorrupt,QSystemError::NativeError).toString());
         returnResults();
@@ -332,6 +331,11 @@ void QSymbianHostResolver::run()
 
 void QSymbianHostResolver::returnResults()
 {
+#if defined(QHOSTINFO_DEBUG)
+    qDebug() << "QSymbianHostResolver::returnResults" << iResults.error() << iResults.errorString();
+    foreach (QHostAddress addr, iResults.addresses())
+        qDebug() << addr;
+#endif
     iState = EIdle;
 
     QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
@@ -350,8 +354,7 @@ TInt QSymbianHostResolver::RunError(TInt aError)
         QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
         manager->lookupFinished(this);
 
-        iResults.setError(QHostInfo::UnknownError);
-        iResults.setErrorString(QSystemError(aError,QSystemError::NativeError).toString());
+        setError_helper(iResults, aError);
 
         resultEmitter.emitResultsReady(iResults);
     }
@@ -386,24 +389,19 @@ void QSymbianHostResolver::processNameResult()
         iHostResolver.Next(iNameResult, iStatus);
         SetActive();
     }
-    else if (iStatus.Int() == KErrDndNameNotFound) {
+    else {
         // No more addresses, so return the results (or an error if there aren't any).
+#if defined(QHOSTINFO_DEBUG)
+        qDebug() << "QSymbianHostResolver::processNameResult with err=" << iStatus.Int() << "count=" << iHostAddresses.count();
+#endif
         if (iHostAddresses.count() > 0) {
             iResults.setAddresses(iHostAddresses);
         } else {
             iState = EError;
-            iResults.setError(QHostInfo::HostNotFound);
-            iResults.setErrorString(QObject::tr("Host not found"));
+            setError_helper(iResults, iStatus.Int());
         }
         returnResults();
     }
-    else {
-        // Unknown error
-        iState = EError;
-        iResults.setError(QHostInfo::UnknownError);
-        iResults.setErrorString(QSystemError(iStatus.Int(),QSystemError::NativeError).toString());
-        returnResults();
-    }
 }
 
 void QSymbianHostResolver::processAddressResult()
@@ -411,21 +409,11 @@ void QSymbianHostResolver::processAddressResult()
     TInt err = iStatus.Int();
 
     if (err < 0) {
-        // TODO - Could there be other errors? Symbian docs don't say.
-        if (err == KErrDndAddrNotFound) {
-            iResults.setError(QHostInfo::HostNotFound);
-            iResults.setErrorString(QObject::tr("Host not found"));
-        } else {
-            iResults.setError(QHostInfo::UnknownError);
-            iResults.setErrorString(QSystemError(err,QSystemError::NativeError).toString());
-        }
-
-        returnResults();
-        return;
+        setError_helper(iResults, err);
+    } else {
+        iResults.setHostName(qt_TDesC2QString(iNameResult().iName));
+        iResults.setAddresses(QList<QHostAddress>() << iAddress);
     }
-
-    iResults.setHostName(qt_TDesC2QString(iNameResult().iName));
-    iResults.setAddresses(QList<QHostAddress>() << iAddress);
     returnResults();
 }
 
-- 
cgit v0.12


From 00121f3184ade624ca9cbb2524222dcab9f67342 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 29 Mar 2011 11:55:58 +0100
Subject: Add partial upgrade rules for Qt's plugins

Allows testing of plugins such as bearer without needing to reinstall
all of Qt. Equivalent to the rules in qbase.pri for the normal DLLs

Reviewed-by: Miikka Heikkinen
---
 src/plugins/qpluginbase.pri | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/plugins/qpluginbase.pri b/src/plugins/qpluginbase.pri
index 45e3976..bcf473f 100644
--- a/src/plugins/qpluginbase.pri
+++ b/src/plugins/qpluginbase.pri
@@ -19,4 +19,23 @@ symbian: {
     TARGET.CAPABILITY = All -Tcb
     TARGET = $${TARGET}$${QT_LIBINFIX}
     load(armcc_warnings)
+
+    # Make partial upgrade SIS file for Qt plugin dll's
+    # Partial upgrade SIS file
+    vendorinfo = \
+        "; Localised Vendor name" \
+        "%{\"Nokia\"}" \
+        " " \
+        "; Unique Vendor name" \
+        ":\"Nokia, Qt\"" \
+        " "
+    isEmpty(QT_LIBINFIX): PARTIAL_UPGRADE_UID = 0x2001E61C
+    else: PARTIAL_UPGRADE_UID = 0xE001E61C
+
+    pu_header = "; Partial upgrade package for testing $${TARGET} changes without reinstalling everything" \
+                "$${LITERAL_HASH}{\"$${TARGET}\"}, ($$PARTIAL_UPGRADE_UID), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU"
+    partial_upgrade.pkg_prerules = pu_header vendorinfo
+    partial_upgrade.files = $$QMAKE_LIBDIR_QT/$${TARGET}.dll
+    partial_upgrade.path = c:/sys/bin
+    DEPLOYMENT += partial_upgrade
 }
-- 
cgit v0.12


From f7a6e37cab7a68451b176d22acf34ed41d4f1d79 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 29 Mar 2011 11:58:32 +0100
Subject: Fix deadlock in QNetworkSession::stop

The mutex added needs to be recursive, as stop calls close internally,
which also needs to lock the mutex.

Reviewed-by: Markus Goetz
---
 src/network/bearer/qnetworksession_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
index b359f80..a92b7ce 100644
--- a/src/network/bearer/qnetworksession_p.h
+++ b/src/network/bearer/qnetworksession_p.h
@@ -75,7 +75,7 @@ class Q_NETWORK_EXPORT QNetworkSessionPrivate : public QObject
 
 public:
     QNetworkSessionPrivate() : QObject(),
-        state(QNetworkSession::Invalid), isOpen(false)
+        state(QNetworkSession::Invalid), isOpen(false), mutex(QMutex::Recursive)
     {}
     virtual ~QNetworkSessionPrivate()
     {}
-- 
cgit v0.12


From e2078f5099d4db1aa2c59d2c9fa9fa8efc5a6c46 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Fri, 1 Apr 2011 10:30:59 +0200
Subject: move semun declaration to qcore_unix_p.h
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

according to X/OPEN we have to define semun ourselves but on some
systems sem.h will have it, so let's use a prefixed one (qt_semun).

this allows to avoid the code duplication and makes things a bit easier
to undesrtand

Merge-request: 2586
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 src/corelib/kernel/qcore_unix_p.h            |  9 ++++++++
 src/corelib/kernel/qsystemsemaphore_unix.cpp |  7 ------
 src/gui/embedded/qlock.cpp                   | 32 ++++++++++------------------
 src/gui/embedded/qwslock.cpp                 | 13 +++--------
 src/gui/embedded/qwssignalhandler.cpp        | 16 ++++----------
 5 files changed, 27 insertions(+), 50 deletions(-)

diff --git a/src/corelib/kernel/qcore_unix_p.h b/src/corelib/kernel/qcore_unix_p.h
index 2e84f3b..33df0da 100644
--- a/src/corelib/kernel/qcore_unix_p.h
+++ b/src/corelib/kernel/qcore_unix_p.h
@@ -319,6 +319,15 @@ timeval qt_gettime(); // in qelapsedtimer_mac.cpp or qtimestamp_unix.cpp
 Q_CORE_EXPORT int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept,
                                  const struct timeval *tv);
 
+// according to X/OPEN we have to define semun ourselves
+// we use prefix as on some systems sem.h will have it
+struct semid_ds;
+union qt_semun {
+    int val;                    /* value for SETVAL */
+    struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */
+    unsigned short *array;      /* array for GETALL, SETALL */
+};
+
 QT_END_NAMESPACE
 
 #endif
diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp
index a68abd3..55b65b7 100644
--- a/src/corelib/kernel/qsystemsemaphore_unix.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp
@@ -64,13 +64,6 @@
 
 QT_BEGIN_NAMESPACE
 
-// We have to define this as on some sem.h will have it
-union qt_semun {
-    int val;                    /* value for SETVAL */
-    struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */
-    unsigned short *array;      /* array for GETALL, SETALL */
-};
-
 QSystemSemaphorePrivate::QSystemSemaphorePrivate() :
         semaphore(-1), createdFile(false),
         createdSemaphore(false), unix_key(-1), error(QSystemSemaphore::NoError)
diff --git a/src/gui/embedded/qlock.cpp b/src/gui/embedded/qlock.cpp
index b169a9b..9c1103f 100644
--- a/src/gui/embedded/qlock.cpp
+++ b/src/gui/embedded/qlock.cpp
@@ -82,34 +82,24 @@ QT_END_NAMESPACE
 
 #else // QT_NO_QWS_MULTIPROCESS
 
+#if defined(Q_OS_DARWIN)
+#  define Q_NO_SEMAPHORE
+#endif
+
 #include "qwssignalhandler_p.h"
 
 #include <unistd.h>
 #include <sys/types.h>
-#if defined(Q_OS_DARWIN)
-#   define Q_NO_SEMAPHORE
-#   include <sys/stat.h>
-#   include <sys/file.h>
-#else // Q_OS_DARWIN
-#   include <sys/sem.h>
-#   if (defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) && !defined(QT_LINUXBASE)) \
-    || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD) \
-    || defined(Q_OS_BSDI)
-        /* union semun is defined by including <sys/sem.h> */
-#   else
-/* according to X/OPEN we have to define it ourselves */
-union semun {
-    int val;                    /* value for SETVAL */
-    struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */
-    unsigned short *array;      /* array for GETALL, SETALL */
-};
-#   endif
-#endif // Q_OS_DARWIN
+#if defined(Q_NO_SEMAPHORE)
+#  include <sys/stat.h>
+#  include <sys/file.h>
+#else
+#  include <sys/sem.h>
+#endif
 #include <sys/ipc.h>
 #include <string.h>
 #include <errno.h>
 #include <qdebug.h>
-#include <signal.h>
 
 #include <private/qcore_unix_p.h> // overrides QT_OPEN
 
@@ -177,7 +167,7 @@ QLock::QLock(const QString &filename, char id, bool create)
     data->id = semget(semkey,0,0);
     data->owned = create;
     if (create) {
-        semun arg; arg.val = 0;
+        qt_semun arg; arg.val = 0;
         if (data->id != -1)
             semctl(data->id,0,IPC_RMID,arg);
         data->id = semget(semkey,1,IPC_CREAT|0600);
diff --git a/src/gui/embedded/qwslock.cpp b/src/gui/embedded/qwslock.cpp
index 5841841..324d813 100644
--- a/src/gui/embedded/qwslock.cpp
+++ b/src/gui/embedded/qwslock.cpp
@@ -60,21 +60,14 @@
 #endif
 #include <unistd.h>
 
+#include <private/qcore_unix_p.h>
+
 QT_BEGIN_NAMESPACE
 
 #ifdef QT_NO_SEMAPHORE
 #error QWSLock currently requires semaphores
 #endif
 
-#ifndef Q_OS_BSD4
-union semun {
-    int val;
-    struct semid_ds *buf;
-    unsigned short *array;
-    struct seminfo  *__buf;
-};
-#endif
-
 QWSLock::QWSLock()
 {
     semId = semget(IPC_PRIVATE, 3, IPC_CREAT | 0666);
@@ -85,7 +78,7 @@ QWSLock::QWSLock()
     }
     QWSSignalHandler::instance()->addSemaphore(semId);
 
-    semun semval;
+    qt_semun semval;
     semval.val = 1;
 
     if (semctl(semId, BackingStore, SETVAL, semval) == -1) {
diff --git a/src/gui/embedded/qwssignalhandler.cpp b/src/gui/embedded/qwssignalhandler.cpp
index 49b7e94..cc18beb 100644
--- a/src/gui/embedded/qwssignalhandler.cpp
+++ b/src/gui/embedded/qwssignalhandler.cpp
@@ -47,21 +47,13 @@
 #ifndef QT_NO_QWS_MULTIPROCESS
 #  include <sys/ipc.h>
 #  include <sys/sem.h>
+
+#  include <private/qcore_unix_p.h>
 #endif
 #include <signal.h>
 
 QT_BEGIN_NAMESPACE
 
-#ifndef Q_OS_BSD4
-union semun {
-    int val;
-    struct semid_ds *buf;
-    unsigned short *array;
-    struct seminfo  *__buf;
-};
-#endif
-
-
 class QWSSignalHandlerPrivate : public QWSSignalHandler
 {
 public:
@@ -106,7 +98,7 @@ void QWSSignalHandler::removeSemaphore(int semno)
 {
     const int index = semaphores.lastIndexOf(semno);
     if (index != -1) {
-        semun semval;
+        qt_semun semval;
         semval.val = 0;
         semctl(semaphores.at(index), 0, IPC_RMID, semval);
         semaphores.remove(index);
@@ -121,7 +113,7 @@ void QWSSignalHandler::handleSignal(int signum)
     signal(signum, h->oldHandlers[signum]);
 
 #ifndef QT_NO_QWS_MULTIPROCESS
-    semun semval;
+    qt_semun semval;
     semval.val = 0;
     for (int i = 0; i < h->semaphores.size(); ++i)
         semctl(h->semaphores.at(i), 0, IPC_RMID, semval);
-- 
cgit v0.12


From f285904ae2f376c39ee3538aa2362e9632534700 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Fri, 1 Apr 2011 10:31:00 +0200
Subject: fix order of #include-s on SPARC
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

on some systems (i.e. on SPARC), the order of IPC-related includes is
meaningful; sys/types.h, then sys/ipc.h, then sys/sem.h, and so on

Merge-request: 2586
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 src/gui/embedded/qlock.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/gui/embedded/qlock.cpp b/src/gui/embedded/qlock.cpp
index 9c1103f..d429b93 100644
--- a/src/gui/embedded/qlock.cpp
+++ b/src/gui/embedded/qlock.cpp
@@ -90,20 +90,19 @@ QT_END_NAMESPACE
 
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/ipc.h>
 #if defined(Q_NO_SEMAPHORE)
 #  include <sys/stat.h>
 #  include <sys/file.h>
 #else
 #  include <sys/sem.h>
 #endif
-#include <sys/ipc.h>
 #include <string.h>
 #include <errno.h>
 #include <qdebug.h>
 
 #include <private/qcore_unix_p.h> // overrides QT_OPEN
 
-
 QT_BEGIN_NAMESPACE
 
 #define MAX_LOCKS   200            // maximum simultaneous read locks
-- 
cgit v0.12


From 467fdd578e6787497f2b702dca0cf38afdc0e6de Mon Sep 17 00:00:00 2001
From: Marco Alanen <denravonska@gmail.com>
Date: Fri, 1 Apr 2011 10:52:19 +0200
Subject: Fix bug when catching exceptions in tests.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Resets currentTestObject if an exception is caught while executing a
test suite. This is required or else subsequent test executions will
trigger an assert.

Task-number: QTBUG-3869
Merge-request: 1163
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
---
 src/testlib/qtestcase.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 287d8e6..9a0d087 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1865,6 +1865,8 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
              IOPMAssertionRelease(powerID);
          }
 #endif
+         currentTestObject = 0;
+
          // Rethrow exception to make debugging easier.
          throw;
          return 1;
-- 
cgit v0.12


From a150eddcf1ef46edf3ad7e72234316e087b0aec4 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Wed, 30 Mar 2011 14:55:34 +0200
Subject: Fix horizontal centered text drawing without word wrap

In this case we can't use line width to align the text, we have to
use the rectangle width given in QPainter::drawText for alignment
instead.

Reviewed-by: Eskil
(cherry picked from commit b92a31da01ee50fed4b10282e79f812167faf659)
---
 src/gui/painting/qpainter.cpp | 17 ++++++++++++-----
 src/gui/text/qtextengine.cpp  | 16 ++++++++++++++++
 src/gui/text/qtextengine_p.h  |  1 +
 src/gui/text/qtextlayout.cpp  | 19 +------------------
 4 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 14fb772..64ef549 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -8149,10 +8149,6 @@ start_lengthVariant:
     engine.option.setTextDirection(layout_direction);
     if (tf & Qt::AlignJustify)
         engine.option.setAlignment(Qt::AlignJustify);
-    else if (tf & Qt::AlignRight)
-        engine.option.setAlignment(Qt::AlignRight);
-    else if (tf & Qt::AlignHCenter)
-        engine.option.setAlignment(Qt::AlignHCenter);
     else
         engine.option.setAlignment(Qt::AlignLeft); // do not do alignment twice
 
@@ -8248,7 +8244,18 @@ start_lengthVariant:
 
         for (int i = 0; i < textLayout.lineCount(); i++) {
             QTextLine line = textLayout.lineAt(i);
-            line.draw(painter, QPointF(r.x(), r.y() + yoff));
+
+            qreal advance = line.horizontalAdvance();
+            xoff = 0;
+            if (tf & Qt::AlignRight) {
+                QTextEngine *eng = textLayout.engine();
+                xoff = r.width() - advance -
+                    eng->leadingSpaceWidth(eng->lines[line.lineNumber()]).toReal();
+            }
+            else if (tf & Qt::AlignHCenter)
+                xoff = (r.width() - advance) / 2;
+
+            line.draw(painter, QPointF(r.x() + xoff, r.y() + yoff));
         }
 
         if (restore) {
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index a63fdbf..6aa333c 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -2725,6 +2725,22 @@ void QTextEngine::resolveAdditionalFormats() const
     specialData->resolvedFormatIndices = indices;
 }
 
+QFixed QTextEngine::leadingSpaceWidth(const QScriptLine &line)
+{
+    if (!line.hasTrailingSpaces
+        || (option.flags() & QTextOption::IncludeTrailingSpaces)
+        || !isRightToLeft())
+        return QFixed();
+
+    int pos = line.length;
+    const HB_CharAttributes *attributes = this->attributes();
+    if (!attributes)
+        return QFixed();
+    while (pos > 0 && attributes[line.from + pos - 1].whiteSpace)
+        --pos;
+    return width(line.from + pos, line.length - pos);
+}
+
 QStackTextEngine::QStackTextEngine(const QString &string, const QFont &f)
     : QTextEngine(string, f),
       _layoutData(string, _memory, MemSize)
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index 50d1ff8..366c5c3 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -609,6 +609,7 @@ public:
     QString elidedText(Qt::TextElideMode mode, const QFixed &width, int flags = 0) const;
 
     void shapeLine(const QScriptLine &line);
+    QFixed leadingSpaceWidth(const QScriptLine &line);
 
 private:
     void setBoundary(int strPos) const;
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 8eff7d2..afe6949 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -66,23 +66,6 @@ QT_BEGIN_NAMESPACE
 #define SuppressText 0x5012
 #define SuppressBackground 0x513
 
-static inline QFixed leadingSpaceWidth(QTextEngine *eng, const QScriptLine &line)
-{
-    if (!line.hasTrailingSpaces
-        || (eng->option.flags() & QTextOption::IncludeTrailingSpaces)
-        || !(eng->option.alignment() & Qt::AlignRight)
-        || !eng->isRightToLeft())
-        return QFixed();
-
-    int pos = line.length;
-    const HB_CharAttributes *attributes = eng->attributes();
-    if (!attributes)
-        return QFixed();
-    while (pos > 0 && attributes[line.from + pos - 1].whiteSpace)
-        --pos;
-    return eng->width(line.from + pos, line.length - pos);
-}
-
 static QFixed alignLine(QTextEngine *eng, const QScriptLine &line)
 {
     QFixed x = 0;
@@ -93,7 +76,7 @@ static QFixed alignLine(QTextEngine *eng, const QScriptLine &line)
         if (align & Qt::AlignJustify && eng->isRightToLeft())
             align = Qt::AlignRight;
         if (align & Qt::AlignRight)
-            x = line.width - (line.textAdvance + leadingSpaceWidth(eng, line));
+            x = line.width - (line.textAdvance + eng->leadingSpaceWidth(line));
         else if (align & Qt::AlignHCenter)
             x = (line.width - line.textAdvance)/2;
     }
-- 
cgit v0.12


From 9660d056a7040798c61f64cfb609181ead72f0c3 Mon Sep 17 00:00:00 2001
From: Pavel Mogilevskiy <pmogilevskiy@gmail.com>
Date: Fri, 1 Apr 2011 11:29:29 +0200
Subject: Chnaged Q_AUTOTEST_EXPORT marco into Q_GUI_EXPORT for QZipWriter
 class
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 1162
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>

[ Symbols for QZipReader were previously exported with
959ab5d84d67ec84c2342b083e362ca75613e8cb. There's no good reason not to
do the same for QZipWriter. Classes remain private API. -- João ]
---
 src/gui/text/qzipwriter_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/text/qzipwriter_p.h b/src/gui/text/qzipwriter_p.h
index 0ee445e..153ef19 100644
--- a/src/gui/text/qzipwriter_p.h
+++ b/src/gui/text/qzipwriter_p.h
@@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE
 class QZipWriterPrivate;
 
 
-class Q_AUTOTEST_EXPORT QZipWriter
+class Q_GUI_EXPORT QZipWriter
 {
 public:
     QZipWriter(const QString &fileName, QIODevice::OpenMode mode = (QIODevice::WriteOnly | QIODevice::Truncate) );
-- 
cgit v0.12


From 2365b2dfd57770875b6eefb165ec27f3bf65dd0c Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@trolltech.com>
Date: Sat, 20 Feb 2010 02:07:32 +0100
Subject: QStringBuilder now support building QByteArray

This breaks source compatibility if one made its own QConcatenable
as it nows require a Prefered type.
And also sometimes if QT_USE_FAST_OPERATOR_PLUS was used, and
the result of an addition between two QByteArray is used directly

Reviewed-by: Denis
---
 src/corelib/tools/qbytearray.h               |   8 ++
 src/corelib/tools/qstringbuilder.cpp         |  26 +++-
 src/corelib/tools/qstringbuilder.h           | 175 ++++++++++++++++++++++-----
 tests/auto/qstringbuilder1/stringbuilder.cpp |  30 +++++
 4 files changed, 205 insertions(+), 34 deletions(-)

diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index 70d865a..6957022 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -548,6 +548,8 @@ inline bool operator>=(const QByteArray &a1, const char *a2)
 { return qstrcmp(a1, a2) >= 0; }
 inline bool operator>=(const char *a1, const QByteArray &a2)
 { return qstrcmp(a1, a2) >= 0; }
+#ifndef QT_USE_FAST_OPERATOR_PLUS
+# ifndef QT_USE_FAST_CONCATENATION
 inline const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
 { return QByteArray(a1) += a2; }
 inline const QByteArray operator+(const QByteArray &a1, const char *a2)
@@ -558,6 +560,8 @@ inline const QByteArray operator+(const char *a1, const QByteArray &a2)
 { return QByteArray(a1) += a2; }
 inline const QByteArray operator+(char a1, const QByteArray &a2)
 { return QByteArray(&a1, 1) += a2; }
+# endif // QT_USE_FAST_CONCATENATION
+#endif // QT_USE_FAST_OPERATOR_PLUS
 inline QBool QByteArray::contains(const char *c) const
 { return QBool(indexOf(c) != -1); }
 inline QByteArray &QByteArray::replace(char before, const char *c)
@@ -600,4 +604,8 @@ QT_END_NAMESPACE
 
 QT_END_HEADER
 
+#ifdef QT_USE_FAST_CONCATENATION
+#include <QtCore/qstring.h>
+#endif
+
 #endif // QBYTEARRAY_H
diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp
index 7d75de7..a5dff88 100644
--- a/src/corelib/tools/qstringbuilder.cpp
+++ b/src/corelib/tools/qstringbuilder.cpp
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include "qstringbuilder.h"
+#include <QtCore/qtextcodec.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -146,7 +147,9 @@ QT_BEGIN_NAMESPACE
     Converts the \c QLatin1Literal into a \c QString object.
 */
 
-/*! \internal */
+/*! \internal
+   Note: The len contains the ending \0
+ */
 void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out)
 {
 #ifndef QT_NO_TEXTCODEC
@@ -166,4 +169,25 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out
     }
 }
 
+/*! \internal */
+void QAbstractConcatenable::convertToAscii(const QChar* a, int len, char*& out) 
+{
+#ifndef QT_NO_TEXTCODEC
+    if (QString::codecForCStrings) {
+        QByteArray tmp = QString::codecForCStrings->fromUnicode(a, len);
+        memcpy(out, tmp.constData(), tmp.size());
+        out += tmp.length();
+        return;
+    }
+#endif
+    if (len == -1) {
+        while (a->unicode())
+            convertToLatin1(*a++, out);
+    } else {
+        for (int i = 0; i < len; ++i)
+            convertToLatin1(a[i], out);
+    }
+}
+
+
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
index d230d67..614346c 100644
--- a/src/corelib/tools/qstringbuilder.h
+++ b/src/corelib/tools/qstringbuilder.h
@@ -43,6 +43,7 @@
 #define QSTRINGBUILDER_H
 
 #include <QtCore/qstring.h>
+#include <QtCore/qbytearray.h>
 
 #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
 #  if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)
@@ -78,7 +79,7 @@ struct Q_CORE_EXPORT QAbstractConcatenable
 {
 protected:
     static void convertFromAscii(const char *a, int len, QChar *&out);
-
+    static void convertToAscii(const QChar *a, int len, char *&out);
     static inline void convertFromAscii(char a, QChar *&out)
     {
 #ifndef QT_NO_TEXTCODEC
@@ -88,6 +89,21 @@ protected:
 #endif
             *out++ = QLatin1Char(a);
     }
+
+    static inline void convertToAscii(QChar a, char *&out)
+    {
+#ifndef QT_NO_TEXTCODEC
+        if (QString::codecForCStrings)
+            *out++ = a.toAscii(); //###
+        else
+#endif
+            convertToLatin1(a, out);
+    }
+
+    static inline void convertToLatin1(QChar a, char *&out)
+    {
+        *out++ = a.unicode() > 0xff ? '?' : char(a.unicode());
+    }
 };
 
 template <typename T> struct QConcatenable {};
@@ -97,14 +113,16 @@ class QStringBuilder
 {
 public:
     QStringBuilder(const A &a_, const B &b_) : a(a_), b(b_) {}
-
-    operator QString() const
+private:
+    friend class QByteArray;
+    friend class QString;
+    template <typename T> T convertTo() const
     {
         const uint size = QConcatenable< QStringBuilder<A, B> >::size(*this);
-        QString s(size, Qt::Uninitialized);
+        T s(size, Qt::Uninitialized);
 
-        QChar *d = s.data();
-        const QChar * const start = d;
+        typename T::iterator d = s.data();
+        typename T::const_iterator const start = d;
         QConcatenable< QStringBuilder<A, B> >::appendTo(*this, d);
 
         if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(size) != d - start) {
@@ -114,7 +132,14 @@ public:
         }
         return s;
     }
-    QByteArray toLatin1() const { return QString(*this).toLatin1(); }
+
+    typedef QConcatenable<QStringBuilder<A, B> > Concatenable;
+    typedef typename Concatenable::ConvertTo ConvertTo;
+public:
+    operator ConvertTo() const { return convertTo<ConvertTo>(); }
+
+    QByteArray toLatin1() const { return convertTo<QString>().toLatin1(); }
+    int size() const { return Concatenable::size(*this); }
 
     const A &a;
     const B &b;
@@ -134,53 +159,80 @@ class QStringBuilder <QString, QString>
         const QString &b;
 };
 
+template <>
+class QStringBuilder <QByteArray, QByteArray>
+{
+    public:
+        QStringBuilder(const QByteArray &a_, const QByteArray &b_) : a(a_), b(b_) {}
+
+        operator QByteArray() const
+        { QByteArray r(a); r += b; return r; }
+
+        const QByteArray &a;
+        const QByteArray &b;
+};
+
+
 template <> struct QConcatenable<char> : private QAbstractConcatenable
 {
     typedef char type;
+    typedef QByteArray ConvertTo;
     enum { ExactSize = true };
     static int size(const char) { return 1; }
-    static inline void appendTo(const char c, QChar *&out)
+#ifndef QT_NO_CAST_FROM_ASCII
+    static inline QT_ASCII_CAST_WARN void appendTo(const char c, QChar *&out)
     {
         QAbstractConcatenable::convertFromAscii(c, out);
     }
+#endif
+    static inline void appendTo(const char c, char *&out)
+    { *out++ = c; }
 };
 
 template <> struct QConcatenable<QLatin1Char>
 {
     typedef QLatin1Char type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QLatin1Char) { return 1; }
     static inline void appendTo(const QLatin1Char c, QChar *&out)
-    {
-        *out++ = c;
-    }
+    { *out++ = c; }
+    static inline void appendTo(const QLatin1Char c, char *&out)
+    { *out++ = c.toLatin1(); }
 };
 
-template <> struct QConcatenable<QChar>
+template <> struct QConcatenable<QChar> : private QAbstractConcatenable
 {
     typedef QChar type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QChar) { return 1; }
     static inline void appendTo(const QChar c, QChar *&out)
-    {
-        *out++ = c;
-    }
+    { *out++ = c; }
+#ifndef QT_NO_CAST_TO_ASCII
+    static inline QT_ASCII_CAST_WARN void appendTo(const QChar c, char *&out)
+    { convertToAscii(c, out); }
+#endif
 };
 
-template <> struct QConcatenable<QCharRef>
+template <> struct QConcatenable<QCharRef> : private QAbstractConcatenable
 {
     typedef QCharRef type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QCharRef &) { return 1; }
     static inline void appendTo(const QCharRef &c, QChar *&out)
-    {
-        *out++ = QChar(c);
-    }
+    { *out++ = QChar(c); }
+#ifndef QT_NO_CAST_TO_ASCII
+    static inline QT_ASCII_CAST_WARN void appendTo(const QCharRef &c, char *&out)
+    { convertToAscii(c, out); }
+#endif
 };
 
 template <> struct QConcatenable<QLatin1String>
 {
     typedef QLatin1String type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QLatin1String &a) { return qstrlen(a.latin1()); }
     static inline void appendTo(const QLatin1String &a, QChar *&out)
@@ -188,12 +240,17 @@ template <> struct QConcatenable<QLatin1String>
         for (const char *s = a.latin1(); *s; )
             *out++ = QLatin1Char(*s++);
     }
-
+    static inline void appendTo(const QLatin1String &a, char *&out)
+    {
+        for (const char *s = a.latin1(); *s; )
+            *out++ = *s++;
+    }
 };
 
 template <> struct QConcatenable<QLatin1Literal>
 {
     typedef QLatin1Literal type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QLatin1Literal &a) { return a.size(); }
     static inline void appendTo(const QLatin1Literal &a, QChar *&out)
@@ -201,11 +258,17 @@ template <> struct QConcatenable<QLatin1Literal>
         for (const char *s = a.data(); *s; )
             *out++ = QLatin1Char(*s++);
     }
+    static inline void appendTo(const QLatin1Literal &a, char *&out)
+    {
+        for (const char *s = a.data(); *s; )
+            *out++ = *s++;
+    }
 };
 
-template <> struct QConcatenable<QString>
+template <> struct QConcatenable<QString> : private QAbstractConcatenable
 {
     typedef QString type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QString &a) { return a.size(); }
     static inline void appendTo(const QString &a, QChar *&out)
@@ -214,81 +277,127 @@ template <> struct QConcatenable<QString>
         memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
         out += n;
     }
+#ifndef QT_NO_CAST_TO_ASCII
+    static inline QT_ASCII_CAST_WARN void appendTo(const QString &a, char *&out)
+    { convertToAscii(a.constData(), a.length(), out); }
+#endif
 };
 
-template <> struct QConcatenable<QStringRef>
+template <> struct QConcatenable<QStringRef> : private QAbstractConcatenable
 {
     typedef QStringRef type;
+    typedef QString ConvertTo;
     enum { ExactSize = true };
     static int size(const QStringRef &a) { return a.size(); }
-    static inline void appendTo(QStringRef a, QChar *&out)
+    static inline void appendTo(const QStringRef &a, QChar *&out)
     {
         const int n = a.size();
         memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
         out += n;
     }
+#ifndef QT_NO_CAST_TO_ASCII
+    static inline QT_ASCII_CAST_WARN void appendTo(const QStringRef &a, char *&out)
+    { convertToAscii(a.constData(), a.length(), out); }
+#endif
+
 };
 
-#ifndef QT_NO_CAST_FROM_ASCII
 template <int N> struct QConcatenable<char[N]> : private QAbstractConcatenable
 {
     typedef char type[N];
+    typedef QByteArray ConvertTo;
     enum { ExactSize = false };
-    static int size(const char[N])
+    static int size(const char[N]) { return N - 1; }
+#ifndef QT_NO_CAST_FROM_ASCII
+    static inline void QT_ASCII_CAST_WARN appendTo(const char a[N], QChar *&out)
     {
-        return N - 1;
+        QAbstractConcatenable::convertFromAscii(a, N, out);
     }
-    static inline void appendTo(const char a[N], QChar *&out)
+#endif
+    static inline void appendTo(const char a[N], char *&out)
     {
-        QAbstractConcatenable::convertFromAscii(a, N, out);
+        while (*a)
+            *out++ = *a++;
     }
 };
 
 template <int N> struct QConcatenable<const char[N]> : private QAbstractConcatenable
 {
     typedef const char type[N];
+    typedef QByteArray ConvertTo;
     enum { ExactSize = false };
     static int size(const char[N]) { return N - 1; }
-    static inline void appendTo(const char a[N], QChar *&out)
+#ifndef QT_NO_CAST_FROM_ASCII
+    static inline void QT_ASCII_CAST_WARN appendTo(const char a[N], QChar *&out)
     {
         QAbstractConcatenable::convertFromAscii(a, N, out);
     }
+#endif
+    static inline void appendTo(const char a[N], char *&out)
+    {
+        while (*a)
+            *out++ = *a++;
+    }
 };
 
 template <> struct QConcatenable<const char *> : private QAbstractConcatenable
 {
     typedef char const *type;
+    typedef QByteArray ConvertTo;
     enum { ExactSize = false };
     static int size(const char *a) { return qstrlen(a); }
-    static inline void appendTo(const char *a, QChar *&out)
+#ifndef QT_NO_CAST_FROM_ASCII
+    static inline void QT_ASCII_CAST_WARN appendTo(const char *a, QChar *&out)
+    { QAbstractConcatenable::convertFromAscii(a, -1, out); }
+#endif
+    static inline void appendTo(const char *a, char *&out)
     {
-        QAbstractConcatenable::convertFromAscii(a, -1, out);
+        while (*a)
+            *out++ = *a++;
     }
 };
 
 template <> struct QConcatenable<QByteArray> : private QAbstractConcatenable
 {
     typedef QByteArray type;
+    typedef QByteArray ConvertTo;
     enum { ExactSize = false };
     static int size(const QByteArray &ba) { return ba.size(); }
+#ifndef QT_NO_CAST_FROM_ASCII
     static inline void appendTo(const QByteArray &ba, QChar *&out)
     {
         // adding 1 because convertFromAscii expects the size including the null-termination
         QAbstractConcatenable::convertFromAscii(ba.constData(), ba.size() + 1, out);
     }
-};
 #endif
+    static inline void appendTo(const QByteArray &ba, char *&out)
+    {
+        const char *a = ba.constData();
+        const char * const end = ba.end();
+        while (a != end)
+            *out++ = *a++;
+    }
+};
+
+namespace QtStringBuilder {
+    template <typename A, typename B> struct ConvertToTypeHelper
+    { typedef A ConvertTo; };
+    template <typename T> struct ConvertToTypeHelper<T, QString>
+    { typedef QString ConvertTo; };
+};
+
 
 template <typename A, typename B>
 struct QConcatenable< QStringBuilder<A, B> >
 {
     typedef QStringBuilder<A, B> type;
+    typedef typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;
     enum { ExactSize = QConcatenable<A>::ExactSize && QConcatenable<B>::ExactSize };
     static int size(const type &p)
     {
         return QConcatenable<A>::size(p.a) + QConcatenable<B>::size(p.b);
     }
-    static inline void appendTo(const QStringBuilder<A, B> &p, QChar *&out)
+    template<typename T> static inline void appendTo(const type &p, T *&out)
     {
         QConcatenable<A>::appendTo(p.a, out);
         QConcatenable<B>::appendTo(p.b, out);
diff --git a/tests/auto/qstringbuilder1/stringbuilder.cpp b/tests/auto/qstringbuilder1/stringbuilder.cpp
index f3c0ea9..30d1ba3 100644
--- a/tests/auto/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/qstringbuilder1/stringbuilder.cpp
@@ -137,4 +137,34 @@ void runScenario()
 
     string = QString::fromLatin1(LITERAL);
     QCOMPARE(QByteArray(qPrintable(string P string)), QByteArray(string.toLatin1() + string.toLatin1()));
+
+
+
+    //QByteArray
+    {
+        QByteArray ba = LITERAL;
+        QByteArray superba = ba P ba P LITERAL;
+        QCOMPARE(superba, QByteArray(LITERAL LITERAL LITERAL));
+
+        QByteArray testWith0 = ba P "test\0with\0zero" P ba;
+        QCOMPARE(testWith0, QByteArray(LITERAL "test" LITERAL));
+
+        QByteArray ba2 = ba P '\0' + LITERAL;
+        QCOMPARE(ba2, QByteArray(LITERAL "\0" LITERAL, ba.size()*2+1));
+
+        const char *mmh = "test\0foo";
+        QCOMPARE(QByteArray(ba P mmh P ba), testWith0);
+
+        char mmh2[5];
+        strncpy(mmh2, mmh, 5);
+        QCOMPARE(QByteArray(ba P mmh2 P ba), testWith0);
+
+        QByteArray raw = QByteArray::fromRawData(UTF8_LITERAL_EXTRA, UTF8_LITERAL_LEN);
+        QByteArray r = "hello" P raw;
+        QByteArray r2 = "hello" UTF8_LITERAL;
+        QCOMPARE(r, r2);
+        r2 = QByteArray("hello\0") P UTF8_LITERAL;
+        QCOMPARE(r, r2);
+    }
+
 }
-- 
cgit v0.12


From 7101a3fafb40cacb855ee07036ce4baacc5d202b Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@trolltech.com>
Date: Sun, 21 Feb 2010 18:48:50 +0100
Subject: Compile with QStringBuilder and QByteArray

Reviewed-by: Denis
---
 src/corelib/io/qprocess_unix.cpp             | 4 ++--
 src/corelib/kernel/qtranslator.cpp           | 2 +-
 src/declarative/qml/qdeclarativeproperty.cpp | 2 +-
 src/gui/styles/qstylehelper_p.h              | 1 +
 src/gui/text/qzip.cpp                        | 2 +-
 src/gui/util/qcompleter.cpp                  | 2 +-
 src/tools/moc/moc.cpp                        | 4 ++--
 src/tools/moc/preprocessor.cpp               | 2 +-
 8 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index ba61bda..b7505ce 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -493,8 +493,8 @@ static char **_q_dupEnvironment(const QHash<QByteArray, QByteArray> &environment
     }
 
     if (needToAddLibraryPath)
-        envp[(*envc)++] = ::strdup(QByteArray(libraryPath) + '=' +
-                                 envLibraryPath);
+        envp[(*envc)++] = ::strdup(QByteArray(QByteArray(libraryPath) + '=' +
+                                 envLibraryPath).constData());
     return envp;
 }
 
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index fcb455f..4e9e6ca 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -837,7 +837,7 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source
         numerus = numerusHelper(n, numerusRulesArray, numerusRulesLength);
 
     for (;;) {
-        quint32 h = elfHash(QByteArray(sourceText) + comment);
+        quint32 h = elfHash(QByteArray(QByteArray(sourceText) + comment).constData());
 
         const uchar *start = offsetArray;
         const uchar *end = start + ((numItems-1) << 3);
diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp
index 0dd0edb..7f74da4 100644
--- a/src/declarative/qml/qdeclarativeproperty.cpp
+++ b/src/declarative/qml/qdeclarativeproperty.cpp
@@ -1029,7 +1029,7 @@ bool QDeclarativePropertyPrivate::writeEnumProperty(const QMetaProperty &prop, i
             else
                 v = QVariant(menum.keyToValue(value.toByteArray()));
         } else if (v.userType() != QVariant::Int && v.userType() != QVariant::UInt) {
-            int enumMetaTypeId = QMetaType::type(QByteArray(menum.scope()) + "::" + menum.name());
+            int enumMetaTypeId = QMetaType::type(QByteArray(menum.scope() + QByteArray("::") + menum.name()));
             if ((enumMetaTypeId == 0) || (v.userType() != enumMetaTypeId) || !v.constData())
                 return false;
             v = QVariant(*reinterpret_cast<const int *>(v.constData()));
diff --git a/src/gui/styles/qstylehelper_p.h b/src/gui/styles/qstylehelper_p.h
index 559f7f7..27587e3 100644
--- a/src/gui/styles/qstylehelper_p.h
+++ b/src/gui/styles/qstylehelper_p.h
@@ -110,6 +110,7 @@ template <typename T>
     enum { ExactSize = true };
     static int size(const HexString<T> &) { return sizeof(T) * 2; }
     static inline void appendTo(const HexString<T> &str, QChar *&out) { str.write(out); }
+    typedef QString ConvertTo;
 };
 
 QT_END_NAMESPACE
diff --git a/src/gui/text/qzip.cpp b/src/gui/text/qzip.cpp
index 0f7edae..9f21886 100644
--- a/src/gui/text/qzip.cpp
+++ b/src/gui/text/qzip.cpp
@@ -572,7 +572,7 @@ void QZipWriterPrivate::addEntry(EntryType type, const QString &fileName, const
         "directory",
         "file     ",
         "symlink  " };
-    ZDEBUG() << "adding" << entryTypes[type] <<":" << fileName.toUtf8().data() << (type == 2 ? (" -> " + contents).constData() : "");
+    ZDEBUG() << "adding" << entryTypes[type] <<":" << fileName.toUtf8().data() << (type == 2 ? QByteArray(" -> " + contents).constData() : "");
 #endif
 
     if (! (device->isOpen() || device->open(QIODevice::WriteOnly))) {
diff --git a/src/gui/util/qcompleter.cpp b/src/gui/util/qcompleter.cpp
index 27684bf..0cb3bbd 100644
--- a/src/gui/util/qcompleter.cpp
+++ b/src/gui/util/qcompleter.cpp
@@ -926,7 +926,7 @@ void QCompleterPrivate::_q_fileSystemModelDirectoryLoaded(const QString &path)
     // If we hide the popup because there was no match because the model was not loaded yet,
     // we re-start the completion when we get the results
     if (hiddenBecauseNoMatch
-        && prefix.startsWith(path) && prefix != (path + '/')
+        && prefix.startsWith(path) && prefix != (path + QLatin1Char('/'))
         && widget) {
         q->complete();
     }
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 5078b28..4a2ba68 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -292,8 +292,8 @@ void Moc::parseFunctionArguments(FunctionDef *def)
             arg.rightType += ' ';
             arg.rightType += lexem();
         }
-        arg.normalizedType = normalizeType(arg.type.name + ' ' + arg.rightType);
-        arg.typeNameForCast = normalizeType(noRef(arg.type.name) + "(*)" + arg.rightType);
+        arg.normalizedType = normalizeType(QByteArray(arg.type.name + ' ' + arg.rightType));
+        arg.typeNameForCast = normalizeType(QByteArray(noRef(arg.type.name) + "(*)" + arg.rightType));
         if (test(EQ))
             arg.isDefault = true;
         def->arguments += arg;
diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp
index 6410d40..fbea82d 100644
--- a/src/tools/moc/preprocessor.cpp
+++ b/src/tools/moc/preprocessor.cpp
@@ -807,7 +807,7 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
                         continue;
                     QByteArray frameworkCandidate = include.left(slashPos);
                     frameworkCandidate.append(".framework/Headers/");
-                    fi.setFile(QString::fromLocal8Bit(p.path + '/' + frameworkCandidate), QString::fromLocal8Bit(include.mid(slashPos + 1)));
+                    fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate)), QString::fromLocal8Bit(include.mid(slashPos + 1)));
                 } else {
                     fi.setFile(QString::fromLocal8Bit(p.path), QString::fromLocal8Bit(include));
                 }
-- 
cgit v0.12


From bade388c7aae4b166ab442b1933ea59c5d4c482a Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@trolltech.com>
Date: Sun, 21 Feb 2010 18:49:35 +0100
Subject: Fix autotest when using QStringBuilder

---
 tests/auto/qbytearray/tst_qbytearray.cpp | 12 +++++-----
 tests/auto/qstring/tst_qstring.cpp       | 38 ++++++++++++++++----------------
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/tests/auto/qbytearray/tst_qbytearray.cpp b/tests/auto/qbytearray/tst_qbytearray.cpp
index 5fff22a..0dea9be 100644
--- a/tests/auto/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/qbytearray/tst_qbytearray.cpp
@@ -898,12 +898,12 @@ void tst_QByteArray::indexOf_data()
     QByteArray veryBigHaystack(500, 'a');
     veryBigHaystack += 'B';
     QTest::newRow("BoyerMooreStressTest") << veryBigHaystack << veryBigHaystack << 0 << 0;
-    QTest::newRow("BoyerMooreStressTest2") << veryBigHaystack + 'c' << veryBigHaystack << 0 << 0;
-    QTest::newRow("BoyerMooreStressTest3") << 'c' + veryBigHaystack << veryBigHaystack << 0 << 1;
-    QTest::newRow("BoyerMooreStressTest4") << veryBigHaystack << veryBigHaystack + 'c' << 0 << -1;
-    QTest::newRow("BoyerMooreStressTest5") << veryBigHaystack << 'c' + veryBigHaystack << 0 << -1;
-    QTest::newRow("BoyerMooreStressTest6") << 'd' + veryBigHaystack << 'c' + veryBigHaystack << 0 << -1;
-    QTest::newRow("BoyerMooreStressTest6") << veryBigHaystack + 'c' << 'c' + veryBigHaystack << 0 << -1;
+    QTest::newRow("BoyerMooreStressTest2") << QByteArray(veryBigHaystack + 'c') <<  QByteArray(veryBigHaystack) << 0 << 0;
+    QTest::newRow("BoyerMooreStressTest3") << QByteArray('c' + veryBigHaystack) <<  QByteArray(veryBigHaystack) << 0 << 1;
+    QTest::newRow("BoyerMooreStressTest4") << QByteArray(veryBigHaystack) <<  QByteArray(veryBigHaystack + 'c') << 0 << -1;
+    QTest::newRow("BoyerMooreStressTest5") << QByteArray(veryBigHaystack) <<  QByteArray('c' + veryBigHaystack) << 0 << -1;
+    QTest::newRow("BoyerMooreStressTest6") << QByteArray('d' + veryBigHaystack) <<  QByteArray('c' + veryBigHaystack) << 0 << -1;
+    QTest::newRow("BoyerMooreStressTest6") << QByteArray(veryBigHaystack + 'c') <<  QByteArray('c' + veryBigHaystack) << 0 << -1;
 }
 
 void tst_QByteArray::indexOf()
diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp
index abc8d9a..25e16fe 100644
--- a/tests/auto/qstring/tst_qstring.cpp
+++ b/tests/auto/qstring/tst_qstring.cpp
@@ -697,11 +697,11 @@ void tst_QString::acc_01()
     QVERIFY(a<=c);
     QVERIFY(!(c<=a));
     QVERIFY(!(d<=a));
-    QCOMPARE(a+b,(QString)"ABCABC");
-    QCOMPARE(a	+"XXXX",(QString)"ABCXXXX");
-    QCOMPARE(a+'X',(QString)"ABCX");
-    QCOMPARE("XXXX"+a,(QString)"XXXXABC");
-    QCOMPARE('X'+a,(QString)"XABC");
+    QCOMPARE(QString(a+b),(QString)"ABCABC");
+    QCOMPARE(QString(a+"XXXX"),(QString)"ABCXXXX");
+    QCOMPARE(QString(a+'X'),(QString)"ABCX");
+    QCOMPARE(QString("XXXX"+a),(QString)"XXXXABC");
+    QCOMPARE(QString('X'+a),(QString)"XABC");
     a = (const char*)0;
     QVERIFY(a.isNull());
     QVERIFY(*a.toLatin1().constData() == '\0');
@@ -1060,12 +1060,12 @@ void tst_QString::indexOf_data()
     QString veryBigHaystack(500, 'a');
     veryBigHaystack += 'B';
     QTest::newRow("BoyerMooreStressTest") << veryBigHaystack << veryBigHaystack << 0 << true << 0;
-    QTest::newRow("BoyerMooreStressTest2") << veryBigHaystack + 'c' << veryBigHaystack << 0 << true << 0;
-    QTest::newRow("BoyerMooreStressTest3") << 'c' + veryBigHaystack << veryBigHaystack << 0 << true << 1;
-    QTest::newRow("BoyerMooreStressTest4") << veryBigHaystack << veryBigHaystack + 'c' << 0 << true << -1;
-    QTest::newRow("BoyerMooreStressTest5") << veryBigHaystack << 'c' + veryBigHaystack << 0 << true << -1;
-    QTest::newRow("BoyerMooreStressTest6") << 'd' + veryBigHaystack << 'c' + veryBigHaystack << 0 << true << -1;
-    QTest::newRow("BoyerMooreStressTest6") << veryBigHaystack + 'c' << 'c' + veryBigHaystack << 0 << true << -1;
+    QTest::newRow("BoyerMooreStressTest2") << QString(veryBigHaystack + 'c') << veryBigHaystack << 0 << true << 0;
+    QTest::newRow("BoyerMooreStressTest3") << QString('c' + veryBigHaystack) << veryBigHaystack << 0 << true << 1;
+    QTest::newRow("BoyerMooreStressTest4") << veryBigHaystack << QString(veryBigHaystack + 'c') << 0 << true << -1;
+    QTest::newRow("BoyerMooreStressTest5") << veryBigHaystack << QString('c' + veryBigHaystack) << 0 << true << -1;
+    QTest::newRow("BoyerMooreStressTest6") << QString('d' + veryBigHaystack) << QString('c' + veryBigHaystack) << 0 << true << -1;
+    QTest::newRow("BoyerMooreStressTest6") << QString(veryBigHaystack + 'c') << QString('c' + veryBigHaystack) << 0 << true << -1;
 
     QTest::newRow("BoyerMooreInsensitiveStressTest") << veryBigHaystack << veryBigHaystack << 0 << false << 0;
 
@@ -1175,14 +1175,14 @@ void tst_QString::indexOf2_data()
     QString whale = "a5zby6cx7dw8evf9ug0th1si2rj3qkp4lomn";
     QString minnow = "zby";
     QTest::newRow( "data40" ) << whale << minnow << 2;
-    QTest::newRow( "data41" ) << (whale + whale) << minnow << 2;
-    QTest::newRow( "data42" ) << (minnow + whale) << minnow << 0;
+    QTest::newRow( "data41" ) << QString(whale + whale) << minnow << 2;
+    QTest::newRow( "data42" ) << QString(minnow + whale) << minnow << 0;
     QTest::newRow( "data43" ) << whale << whale << 0;
-    QTest::newRow( "data44" ) << (whale + whale) << whale << 0;
-    QTest::newRow( "data45" ) << whale << (whale + whale) << -1;
-    QTest::newRow( "data46" ) << (whale + whale) << (whale + whale) << 0;
-    QTest::newRow( "data47" ) << (whale + whale) << (whale + minnow) << -1;
-    QTest::newRow( "data48" ) << (minnow + whale) << whale << (int)minnow.length();
+    QTest::newRow( "data44" ) << QString(whale + whale) << whale << 0;
+    QTest::newRow( "data45" ) << whale << QString(whale + whale) << -1;
+    QTest::newRow( "data46" ) << QString(whale + whale) << QString(whale + whale) << 0;
+    QTest::newRow( "data47" ) << QString(whale + whale) << QString(whale + minnow) << -1;
+    QTest::newRow( "data48" ) << QString(minnow + whale) << whale << (int)minnow.length();
 }
 
 void tst_QString::indexOf2()
@@ -1631,7 +1631,7 @@ void tst_QString::toLower()
     QCOMPARE( QString("`ABYZ{").toLower(), QString("`abyz{"));
     QCOMPARE( QString("`abyz{").toLower(), QString("`abyz{"));
 
-    QCOMPARE( QString(1, QChar(0x130)).toLower(), QString(1, QChar(0x69)) + QChar(0x307));
+    QCOMPARE( QString(1, QChar(0x130)).toLower(), QString(QString(1, QChar(0x69)) + QChar(0x307)));
 
     QString lower;
     lower += QChar(QChar::highSurrogate(0x10428));
-- 
cgit v0.12


From f0a4e3f79266ce5f0a7066ad43de4d05dc94a5d2 Mon Sep 17 00:00:00 2001
From: Zeno Albisser <zeno.albisser@nokia.com>
Date: Wed, 30 Mar 2011 14:43:17 +0200
Subject: linking doc of QLocale with QApplication::keyboardInputLocale()

Reviewed-by: Denis Dzyubenko
Task-number: QTBUG-17099
---
 src/corelib/tools/qlocale.qdoc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index f6b1d27..605e3e0 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -88,6 +88,9 @@
     This constructor converts the locale name to a language/country
     pair; it does not use the system locale database.
 
+    \note For the current keyboard input locale take a look at
+    QApplication::keyboardInputLocale().
+
     QLocale's data is based on Common Locale Data Repository v1.8.1.
 
     The double-to-string and string-to-double conversion functions are
@@ -110,7 +113,8 @@
     This product includes software developed by the University of
     California, Berkeley and its contributors.
 
-    \sa QString::arg(), QString::toInt(), QString::toDouble()
+    \sa QString::arg(), QString::toInt(), QString::toDouble(),
+    QApplication::keyboardInputLocale()
 */
 
 /*!
-- 
cgit v0.12


From 8454a6992e8b560efc72d75be1f8dbb442093519 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 30 Mar 2011 13:00:17 +0200
Subject: Fix compilation warnings

---
 src/corelib/tools/qstringbuilder.h | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
index 614346c..260b574 100644
--- a/src/corelib/tools/qstringbuilder.h
+++ b/src/corelib/tools/qstringbuilder.h
@@ -118,14 +118,14 @@ private:
     friend class QString;
     template <typename T> T convertTo() const
     {
-        const uint size = QConcatenable< QStringBuilder<A, B> >::size(*this);
-        T s(size, Qt::Uninitialized);
+        const uint len = QConcatenable< QStringBuilder<A, B> >::size(*this);
+        T s(len, Qt::Uninitialized);
 
         typename T::iterator d = s.data();
         typename T::const_iterator const start = d;
         QConcatenable< QStringBuilder<A, B> >::appendTo(*this, d);
 
-        if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(size) != d - start) {
+        if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(len) != d - start) {
             // this resize is necessary since we allocate a bit too much
             // when dealing with variable sized 8-bit encodings
             s.resize(d - start);
@@ -384,8 +384,7 @@ namespace QtStringBuilder {
     { typedef A ConvertTo; };
     template <typename T> struct ConvertToTypeHelper<T, QString>
     { typedef QString ConvertTo; };
-};
-
+}
 
 template <typename A, typename B>
 struct QConcatenable< QStringBuilder<A, B> >
-- 
cgit v0.12


From 90f18aa904c6c4371f954392cf99cbaeb404ae7d Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 31 Mar 2011 14:35:12 +0200
Subject: Fix broken test on windows

stringbuilder.cpp(160) : error C2666: 'operator +' : 2 overloads have similar conversions
stringbuilder.h(416): could be 'QStringBuilder<A,B> operator +<QByteArray,char[5]>(const A &,const B (&))'
            with
            [
                A=QByteArray,
                B=char [5]
            ]
            or       'built-in C++ operator+(__int64, char [5])'
            while trying to match the argument list '(QByteArray, char [5])'

The reason is the cast to QNoImplicitBoolCast (which is int)
---
 tests/auto/qstringbuilder1/stringbuilder.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/tests/auto/qstringbuilder1/stringbuilder.cpp b/tests/auto/qstringbuilder1/stringbuilder.cpp
index 30d1ba3..3c8ddc2 100644
--- a/tests/auto/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/qstringbuilder1/stringbuilder.cpp
@@ -155,10 +155,6 @@ void runScenario()
         const char *mmh = "test\0foo";
         QCOMPARE(QByteArray(ba P mmh P ba), testWith0);
 
-        char mmh2[5];
-        strncpy(mmh2, mmh, 5);
-        QCOMPARE(QByteArray(ba P mmh2 P ba), testWith0);
-
         QByteArray raw = QByteArray::fromRawData(UTF8_LITERAL_EXTRA, UTF8_LITERAL_LEN);
         QByteArray r = "hello" P raw;
         QByteArray r2 = "hello" UTF8_LITERAL;
-- 
cgit v0.12


From db9a81e5cc0f18e4b6dae5edf2309c6fc90b9eb3 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Fri, 1 Apr 2011 13:51:06 +0200
Subject: Make sure we don't use subpixel positions in full hinting mode

Some of the text can start from subpixel positions (start from
100.5 for instance), we need to make sure they stick to pixel grid
in this case.

Reviewed-by: Eskil
(cherry picked from commit bf03b38d2b32a0cfca181398597884e4252466f4)
---
 src/gui/painting/qpaintengine_raster.cpp | 7 +------
 src/gui/painting/qtextureglyphcache.cpp  | 2 +-
 src/gui/text/qfontengine_ft.cpp          | 2 ++
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 9f3b9b9..6902543 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -3191,15 +3191,10 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
             rightShift = 3; // divide by 8
 
         int margin = cache->glyphMargin();
-
-        bool supportsSubPixelPositions = fontEngine->supportsSubPixelPositions();
-
         const uchar *bits = image.bits();
         for (int i=0; i<numGlyphs; ++i) {
 
-            QFixed subPixelPosition;
-            if (supportsSubPixelPositions)
-                subPixelPosition = cache->subPixelPositionForX(positions[i].x);
+            QFixed subPixelPosition = cache->subPixelPositionForX(positions[i].x);
             QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], subPixelPosition);
             const QTextureGlyphCache::Coord &c = cache->coords[glyph];
             if (c.isNull())
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index f0db805..727852d 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -102,7 +102,7 @@ int QTextureGlyphCache::calculateSubPixelPositionCount(glyph_t glyph) const
 
 QFixed QTextureGlyphCache::subPixelPositionForX(QFixed x) const
 {
-    if (m_subPixelPositionCount == 0)
+    if (m_subPixelPositionCount <= 1)
         return QFixed();
 
     QFixed subPixelPosition;
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index db0156a..08eb6bb 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -1430,6 +1430,8 @@ QFontEngineFT::QGlyphSet *QFontEngineFT::loadTransformedGlyphSet(const QTransfor
 QFixed QFontEngineFT::subPixelPositionForX(QFixed x)
 {
     int m_subPixelPositionCount = 4;
+    if (!supportsSubPixelPositions())
+        return 0;
 
     QFixed subPixelPosition;
     if (x != 0) {
-- 
cgit v0.12


From 33ca59cd1827195cb7ef91a18c0775568471d4ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 1 Apr 2011 14:26:42 +0200
Subject: Fixed compilation of wayland plugin when there's no GL support.

---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index d54a0fe..e3b2d46 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -82,10 +82,12 @@ struct wl_visual *QWaylandDisplay::argbPremultipliedVisual()
     return wl_display_get_premultiplied_argb_visual(mDisplay);
 }
 
+#ifdef QT_WAYLAND_GL_SUPPORT
 QWaylandGLIntegration * QWaylandDisplay::eglIntegration()
 {
     return mEglIntegration;
 }
+#endif
 
 void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell,
                                            uint32_t time, uint32_t edges,
-- 
cgit v0.12


From bbc4cf1bad3c40fce3c42cf74409cdc163b04c01 Mon Sep 17 00:00:00 2001
From: Siddharth Mathur <siddharth.mathur@nokia.com>
Date: Fri, 5 Mar 2010 16:52:51 -0500
Subject: QNetworkDiskCache: change file organization

Faster disk cache for mobile devices. Reduce file-system touching
operations and work around FAT performance issues. Features new
on-disk layout. Cached objects are now saved in multiple
subdirectories and filenames are shorter in length.

Merge-Request: 2505
Reviewed-by: Peter Hartmann
---
 src/network/access/qnetworkdiskcache.cpp           | 84 ++++++++++++++++------
 src/network/access/qnetworkdiskcache_p.h           |  5 +-
 .../qdeclarativedom/data/importlib/sublib/qmldir   |  2 -
 .../qnetworkdiskcache/tst_qnetworkdiskcache.cpp    | 31 ++++----
 4 files changed, 78 insertions(+), 44 deletions(-)

diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp
index 2040b01..a5c0b3d 100644
--- a/src/network/access/qnetworkdiskcache.cpp
+++ b/src/network/access/qnetworkdiskcache.cpp
@@ -50,13 +50,15 @@
 #include <qdir.h>
 #include <qdatetime.h>
 #include <qdiriterator.h>
-#include <qcryptographichash.h>
 #include <qurl.h>
-
+#include <qcryptographichash.h>
 #include <qdebug.h>
 
-#define CACHE_PREFIX  QLatin1String("cache_")
-#define CACHE_POSTFIX QLatin1String(".cache")
+#define CACHE_POSTFIX QLatin1String(".d")
+#define PREPARED_SLASH QLatin1String("prepared/")
+#define CACHE_VERSION 7
+#define DATA_DIR QLatin1String("data")
+
 #define MAX_COMPRESSION_SIZE (1024 * 1024 * 3)
 
 #ifndef QT_NO_NETWORKDISKCACHE
@@ -153,6 +155,9 @@ void QNetworkDiskCache::setCacheDirectory(const QString &cacheDir)
     d->cacheDirectory = dir.absolutePath();
     if (!d->cacheDirectory.endsWith(QLatin1Char('/')))
         d->cacheDirectory += QLatin1Char('/');
+
+    d->dataDirectory = d->cacheDirectory + DATA_DIR + QString::number(CACHE_VERSION) + QLatin1Char('/');
+    d->prepareLayout();
 }
 
 /*!
@@ -244,6 +249,27 @@ void QNetworkDiskCache::insert(QIODevice *device)
     d->inserting.erase(it);
 }
 
+
+/*!
+    Create subdirectories and other housekeeping on the filesystem.
+    Prevents too many files from being present in any single directory.
+*/
+void QNetworkDiskCachePrivate::prepareLayout()
+{
+    QDir helper;
+    helper.mkpath(cacheDirectory + PREPARED_SLASH);
+
+    //Create directory and subdirectories 0-F
+    helper.mkpath(dataDirectory);
+    for ( uint i = 0; i < 16 ; i++ ) {
+        QString str = QString::number(i, 16);
+        QString subdir = dataDirectory + str;
+        helper.mkdir(subdir);
+    }
+
+}
+
+
 void QNetworkDiskCachePrivate::storeItem(QCacheItem *cacheItem)
 {
     Q_Q(QNetworkDiskCache);
@@ -324,7 +350,7 @@ bool QNetworkDiskCachePrivate::removeFile(const QString &file)
         return false;
     QFileInfo info(file);
     QString fileName = info.fileName();
-    if (!fileName.endsWith(CACHE_POSTFIX) || !fileName.startsWith(CACHE_PREFIX))
+    if (!fileName.endsWith(CACHE_POSTFIX))
         return false;
     qint64 size = info.size();
     if (QFile::remove(file)) {
@@ -409,7 +435,6 @@ QIODevice *QNetworkDiskCache::data(const QUrl &url)
 #endif
             if (p) {
                 buffer->setData((const char *)p, size);
-                file.take()->setParent(buffer.data());
             } else {
                 buffer->setData(file->readAll());
             }
@@ -508,6 +533,9 @@ qint64 QNetworkDiskCache::expire()
         return 0;
     }
 
+    // close file handle to prevent "in use" error when QFile::remove() is called
+    d->lastItem.reset();
+
     QDir::Filters filters = QDir::AllDirs | QDir:: Files | QDir::NoDotAndDotDot;
     QDirIterator it(cacheDirectory(), filters, QDirIterator::Subdirectories);
 
@@ -517,7 +545,7 @@ qint64 QNetworkDiskCache::expire()
         QString path = it.next();
         QFileInfo info = it.fileInfo();
         QString fileName = info.fileName();
-        if (fileName.endsWith(CACHE_POSTFIX) && fileName.startsWith(CACHE_PREFIX)) {
+        if (fileName.endsWith(CACHE_POSTFIX)) {
             cacheItems.insert(info.created(), path);
             totalSize += info.size();
         }
@@ -544,8 +572,6 @@ qint64 QNetworkDiskCache::expire()
                 << "Kept:" << cacheItems.count() - removedFiles;
     }
 #endif
-    if (removedFiles > 0)
-        d->lastItem.reset();
     return totalSize;
 }
 
@@ -564,7 +590,10 @@ void QNetworkDiskCache::clear()
     d->maximumCacheSize = size;
 }
 
-QByteArray QNetworkDiskCachePrivate::generateId(const QUrl &url) const
+/*!
+    Given a URL, generates a unique enough filename (and subdirectory)
+ */
+QString QNetworkDiskCachePrivate::uniqueFileName(const QUrl &url)
 {
     QUrl cleanUrl = url;
     cleanUrl.setPassword(QString());
@@ -572,29 +601,32 @@ QByteArray QNetworkDiskCachePrivate::generateId(const QUrl &url) const
 
     QCryptographicHash hash(QCryptographicHash::Sha1);
     hash.addData(cleanUrl.toEncoded());
-    return hash.result().toHex();
+    // convert sha1 to base36 form and return first 8 bytes for use as string
+    QByteArray id =  QByteArray::number(*(qlonglong*)hash.result().data(), 36).left(8);
+    // generates <one-char subdir>/<8-char filname.d>
+    uint code = (uint)id.at(id.length()-1) % 16;
+    QString pathFragment = QString::number(code, 16) + QLatin1String("/")
+                             + QLatin1String(id) + CACHE_POSTFIX;
+
+    return pathFragment;
 }
 
 QString QNetworkDiskCachePrivate::tmpCacheFileName() const
 {
-    QDir dir;
-    dir.mkpath(cacheDirectory + QLatin1String("prepared/"));
-    return cacheDirectory + QLatin1String("prepared/") + CACHE_PREFIX + QLatin1String("XXXXXX") + CACHE_POSTFIX;
+    //The subdirectory is presumed to be already read for use.
+    return cacheDirectory + PREPARED_SLASH + QLatin1String("XXXXXX") + CACHE_POSTFIX;
 }
 
+/*!
+    Genrates fully qualified path of cached resource from a URL.
+ */
 QString QNetworkDiskCachePrivate::cacheFileName(const QUrl &url) const
 {
     if (!url.isValid())
         return QString();
-    QString directory = cacheDirectory + url.scheme() + QLatin1Char('/');
-    if (!QFile::exists(directory)) {
-        // ### make a static QDir function for this...
-        QDir dir;
-        dir.mkpath(directory);
-    }
 
-    QString fileName = CACHE_PREFIX + QLatin1String(generateId(url)) + CACHE_POSTFIX;
-    return  directory + fileName;
+    QString fullpath = dataDirectory + uniqueFileName(url);
+    return  fullpath;
 }
 
 /*!
@@ -631,7 +663,7 @@ bool QCacheItem::canCompress() const
 enum
 {
     CacheMagic = 0xe8,
-    CurrentCacheVersion = 7
+    CurrentCacheVersion = CACHE_VERSION
 };
 
 void QCacheItem::writeHeader(QFile *device) const
@@ -682,6 +714,12 @@ bool QCacheItem::read(QFile *device, bool readData)
         data.setData(qUncompress(dataBA));
         data.open(QBuffer::ReadOnly);
     }
+
+    // quick and dirty check if metadata's URL field and the file's name are in synch
+    QString expectedFilename = QNetworkDiskCachePrivate::uniqueFileName(metaData.url());
+    if (!device->fileName().endsWith(expectedFilename))
+        return false;
+
     return metaData.isValid();
 }
 
diff --git a/src/network/access/qnetworkdiskcache_p.h b/src/network/access/qnetworkdiskcache_p.h
index 8659066..13db04f 100644
--- a/src/network/access/qnetworkdiskcache_p.h
+++ b/src/network/access/qnetworkdiskcache_p.h
@@ -104,14 +104,17 @@ public:
         , currentCacheSize(-1)
         {}
 
-    QByteArray generateId(const QUrl &url) const;
+    static QString uniqueFileName(const QUrl &url);
     QString cacheFileName(const QUrl &url) const;
     QString tmpCacheFileName() const;
     bool removeFile(const QString &file);
     void storeItem(QCacheItem *item);
+    void prepareLayout();
+    static quint32 crc32(const char *data, uint len);
 
     mutable QCacheItem lastItem;
     QString cacheDirectory;
+    QString dataDirectory;
     qint64 maximumCacheSize;
     qint64 currentCacheSize;
 
diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
index 98d6b74..e69de29 100644
--- a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
+++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
@@ -1,2 +0,0 @@
-Foo 1.1 Foo.qml
-Foo 1.0 Foo.qml
diff --git a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index e974fcc..91b0164 100644
--- a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -46,6 +46,8 @@
 #include "../../shared/util.h"
 
 #define EXAMPLE_URL "http://user:pass@www.example.com/#foo"
+//cached objects are organized into these many subdirs
+#define NUM_SUBDIRECTORIES 16
 
 class tst_QNetworkDiskCache : public QObject
 {
@@ -176,8 +178,7 @@ void tst_QNetworkDiskCache::initTestCase()
     cache.clear();
     QString s = QDir::tempPath() + "/diskCache/";
     QDir dir;
-    dir.rmdir(s + "http");
-    dir.rmdir(s + "https");
+    dir.rmdir(s + "data7"); // the number is the internal cache version
     dir.rmdir(s + "prepared");
     dir.rmdir(s);
 }
@@ -277,16 +278,16 @@ void tst_QNetworkDiskCache::clear()
     QVERIFY(cache.cacheSize() > qint64(0));
 
     QString cacheDirectory = cache.cacheDirectory();
-    QCOMPARE(countFiles(cacheDirectory).count(), 3);
+    QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 3);
     cache.clear();
-    QCOMPARE(countFiles(cacheDirectory).count(), 2);
+    QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 2);
 
     // don't delete files that it didn't create
-    QTemporaryFile file(cacheDirectory + "/cache_XXXXXX");
+    QTemporaryFile file(cacheDirectory + "/XXXXXX");
     if (file.open()) {
-        QCOMPARE(countFiles(cacheDirectory).count(), 3);
+        QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 3);
         cache.clear();
-        QCOMPARE(countFiles(cacheDirectory).count(), 3);
+        QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 3);
     }
 }
 
@@ -317,12 +318,6 @@ void tst_QNetworkDiskCache::data()
     QUrl url(EXAMPLE_URL);
     cache.setupWithOne(url, data);
 
-    // flush the cache
-    QTemporaryFile file(cache.cacheDirectory() + "/cache_XXXXXX.cache");
-    if (file.open()) {
-        cache.call_fileMetaData(file.fileName());
-    }
-
     for (int i = 0; i < 3; ++i) {
         QIODevice *d = cache.data(url);
         QVERIFY(d);
@@ -362,9 +357,9 @@ void tst_QNetworkDiskCache::remove()
     QUrl url(EXAMPLE_URL);
     cache.setupWithOne(url);
     QString cacheDirectory = cache.cacheDirectory();
-    QCOMPARE(countFiles(cacheDirectory).count(), 3);
+    QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 3);
     cache.remove(url);
-    QCOMPARE(countFiles(cacheDirectory).count(), 2);
+    QCOMPARE(countFiles(cacheDirectory).count(), NUM_SUBDIRECTORIES + 2);
 }
 
 void tst_QNetworkDiskCache::setCacheDirectory_data()
@@ -414,7 +409,7 @@ void tst_QNetworkDiskCache::fileMetaData()
 
     QString cacheDirectory = cache.cacheDirectory();
     QStringList list = countFiles(cacheDirectory);
-    QCOMPARE(list.count(), 3);
+    QCOMPARE(list.count(), NUM_SUBDIRECTORIES + 3);
     foreach(QString fileName, list) {
         QFileInfo info(fileName);
         if (info.isFile()) {
@@ -491,7 +486,7 @@ void tst_QNetworkDiskCache::oldCacheVersionFile()
     if (pass == 0) {
         QString name;
         {
-        QTemporaryFile file(cache.cacheDirectory() + "/cache_XXXXXX.cache");
+        QTemporaryFile file(cache.cacheDirectory() + "/XXXXXX.d");
         file.setAutoRemove(false);
         QVERIFY(file.open());
         QDataStream out(&file);
@@ -507,7 +502,7 @@ void tst_QNetworkDiskCache::oldCacheVersionFile()
         QVERIFY(!QFile::exists(name));
     } else {
         QStringList files = countFiles(cache.cacheDirectory());
-        QCOMPARE(files.count(), 3);
+        QCOMPARE(files.count(), NUM_SUBDIRECTORIES + 3);
         // find the file
         QString cacheFile;
         foreach (QString file, files) {
-- 
cgit v0.12


From a3b79f7449fc960da1b3ae39e0127c875c43b90f Mon Sep 17 00:00:00 2001
From: Siddharth Mathur <siddharth.mathur@nokia.com>
Date: Fri, 5 Mar 2010 17:00:02 -0500
Subject: Speed benchmark for QNetworkDiskCache

Merge-Request: 2505
Reviewed-by: Peter Hartmann
---
 tests/benchmarks/network/access/access.pro         |   3 +-
 .../access/qnetworkdiskcache/qnetworkdiskcache.pro |  15 +
 .../qnetworkdiskcache/tst_qnetworkdiskcache.cpp    | 435 +++++++++++++++++++++
 3 files changed, 452 insertions(+), 1 deletion(-)
 create mode 100644 tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
 create mode 100644 tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp

diff --git a/tests/benchmarks/network/access/access.pro b/tests/benchmarks/network/access/access.pro
index 43357e2..6cbd367 100644
--- a/tests/benchmarks/network/access/access.pro
+++ b/tests/benchmarks/network/access/access.pro
@@ -1,4 +1,5 @@
 TEMPLATE = subdirs
 SUBDIRS = \
         qfile_vs_qnetworkaccessmanager \
-        qnetworkreply
+        qnetworkreply \
+        qnetworkdiskcache
diff --git a/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
new file mode 100644
index 0000000..7f665b3
--- /dev/null
+++ b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -0,0 +1,15 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_qnetworkdiskcache
+DEPENDPATH += .
+INCLUDEPATH += .
+
+QT += gui # for QDesktopServices
+QT += network testlib
+
+CONFIG += release
+
+# Input
+SOURCES += tst_qnetworkdiskcache.cpp
+
+
diff --git a/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
new file mode 100644
index 0000000..b87e327
--- /dev/null
+++ b/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -0,0 +1,435 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QNetworkDiskCache>
+#include <QNetworkCacheMetaData>
+#include <QDir>
+#include <QBuffer>
+#include <QTextStream>
+#include <QDebug>
+#include <QtTest/QtTest>
+#include <QIODevice>
+#include <QDesktopServices>
+
+
+
+enum Numbers { NumFakeCacheObjects   = 200,    //entries in pre-populated cache
+               NumInsertions  = 100,           //insertions to be timed
+               NumRemovals    = 100,           //removals to be timed
+               NumReadContent = 100,           //meta requests to be timed
+               HugeCacheLimit = 50*1024*1024,  // max size for a big cache
+               TinyCacheLimit = 1*512*1024}; //  max size for a tiny cache
+
+const QString fakeURLbase = "http://127.0.0.1/fake/";
+//fake HTTP body aka payload
+const QByteArray payload("Qt rocks!");
+
+class tst_qnetworkdiskcache : public QObject
+{
+    Q_OBJECT
+private:
+    void injectFakeData();
+    void insertOneItem();
+    bool isUrlCached(quint32 id);
+    void cleanRecursive(QString &path);
+    void cleanupCacheObject();
+    void initCacheObject();
+    QString cacheDir;
+    QNetworkDiskCache *cache;
+    
+public slots:    
+    void initTestCase();
+    void cleanupTestCase();
+    
+private slots:
+
+    void timeInsertion_data();
+    void timeInsertion();
+    void timeRead_data();
+    void timeRead();
+    void timeRemoval_data();
+    void timeRemoval();
+
+    void timeExpiration_data();
+    void timeExpiration();
+};
+
+
+void tst_qnetworkdiskcache::initTestCase()
+{
+    cache = 0;
+}
+
+
+void tst_qnetworkdiskcache::cleanupTestCase()
+{
+    cleanupCacheObject();
+    cleanRecursive(cacheDir);
+}
+
+void tst_qnetworkdiskcache::timeInsertion_data()
+{
+    QTest::addColumn<QString>("cacheRootDirectory");
+
+    QString cacheLoc = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+    QTest::newRow("QDesktopServices Cache Location") << cacheLoc;
+#ifdef Q_OS_SYMBIAN
+    if (QDir::drives().contains(QFileInfo("E:\\")))
+        QTest::newRow("Symbian E: drive") << cacheLoc.replace(0, 1, QString("E"));
+#endif
+
+}
+
+//This functions times an insert() operation.
+//You can run it after populating the cache with
+//fake data so that more realistic performance
+//estimates are obtained.
+void tst_qnetworkdiskcache::timeInsertion()
+{
+
+    QFETCH(QString, cacheRootDirectory);
+
+    cacheDir = QString( cacheRootDirectory + QDir::separator() + "man_qndc");
+    QDir d;
+    qDebug() << "Setting cache directory to = " << d.absoluteFilePath(cacheDir);
+
+    //Housekeeping
+    cleanRecursive(cacheDir); // slow op.
+    initCacheObject();
+
+    cache->setCacheDirectory(cacheDir);
+    cache->setMaximumCacheSize(qint64(HugeCacheLimit));
+    cache->clear();
+
+    //populate some fake data to simulate partially full cache
+    injectFakeData(); // SLOW
+
+    //Sanity-check that the first URL that we insert below isn't already in there.
+    QVERIFY(isUrlCached(NumFakeCacheObjects) == false);
+
+    // IMPORTANT: max cache size should be HugeCacheLimit, to avoid evictions below
+    //time insertion of previously-uncached URLs.
+    QBENCHMARK_ONCE { 
+        for (quint32 i = NumFakeCacheObjects; i < (NumFakeCacheObjects + NumInsertions); i++) {
+            //prepare metata for url
+            QNetworkCacheMetaData meta;
+            QString fakeURL;
+            QTextStream stream(&fakeURL);
+            stream << fakeURLbase << i;
+            QUrl url(fakeURL);
+            meta.setUrl(url);
+            meta.setSaveToDisk(true);
+
+            //commit payload and metadata to disk
+            QIODevice *device = cache->prepare(meta);
+            device->write(payload);
+            cache->insert(device);
+        }
+    }
+
+    //SLOW cleanup
+    cleanupCacheObject();
+    cleanRecursive(cacheDir);
+
+}
+
+void tst_qnetworkdiskcache::timeRead_data()
+{
+    QTest::addColumn<QString>("cacheRootDirectory");
+
+    QString cacheLoc = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+    QTest::newRow("QDesktopServices Cache Location") << cacheLoc;
+#ifdef Q_OS_SYMBIAN
+    if (QDir::drives().contains(QFileInfo("E:\\")))
+        QTest::newRow("Symbian E: drive") << cacheLoc.replace(0, 1, QString("E"));
+#endif
+
+}
+
+//Times metadata as well payload lookup
+// i.e metaData(), rawHeaders() and data()
+void tst_qnetworkdiskcache::timeRead()
+{
+
+    QFETCH(QString, cacheRootDirectory);
+
+    cacheDir = QString( cacheRootDirectory + QDir::separator() + "man_qndc");
+    QDir d;
+    qDebug() << "Setting cache directory to = " << d.absoluteFilePath(cacheDir);
+
+    //Housekeeping
+    cleanRecursive(cacheDir); // slow op.
+    initCacheObject();
+    cache->setCacheDirectory(cacheDir);
+    cache->setMaximumCacheSize(qint64(HugeCacheLimit));
+    cache->clear();
+
+    //populate some fake data to simulate partially full cache
+    injectFakeData();
+
+    //Entries in the cache should be > what we try to remove
+    QVERIFY(NumFakeCacheObjects > NumReadContent);
+
+    //time metadata lookup of previously inserted URL.
+    QBENCHMARK_ONCE {
+        for (quint32 i = 0; i < NumReadContent; i++) {
+            QString fakeURL;
+            QTextStream stream(&fakeURL);
+            stream << fakeURLbase << i;
+            QUrl url(fakeURL);
+
+            QNetworkCacheMetaData qndc = cache->metaData(url);
+            QVERIFY(qndc.isValid()); // we must have read the metadata
+
+            QNetworkCacheMetaData::RawHeaderList raw(qndc.rawHeaders());
+            QVERIFY(raw.size()); // we must have parsed the headers from the meta
+
+            QIODevice *iodevice(cache->data(url));
+            QVERIFY(iodevice);    //must not be NULL
+            iodevice->close();
+            delete iodevice;
+        }
+    }
+
+    //Cleanup (slow)
+    cleanupCacheObject();
+    cleanRecursive(cacheDir);
+
+}
+
+void tst_qnetworkdiskcache::timeRemoval_data()
+{
+    QTest::addColumn<QString>("cacheRootDirectory");
+
+    QString cacheLoc = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+    QTest::newRow("QDesktopServices Cache Location") << cacheLoc;
+#ifdef Q_OS_SYMBIAN
+    if (QDir::drives().contains(QFileInfo("E:\\")))
+        QTest::newRow("Symbian E: drive") << cacheLoc.replace(0, 1, QString("E"));
+#endif
+
+}
+
+void tst_qnetworkdiskcache::timeRemoval()
+{
+
+    QFETCH(QString, cacheRootDirectory);
+
+    cacheDir = QString( cacheRootDirectory + QDir::separator() + "man_qndc");
+    QDir d;
+    qDebug() << "Setting cache directory to = " << d.absoluteFilePath(cacheDir);
+
+    //Housekeeping
+    initCacheObject();
+    cleanRecursive(cacheDir); // slow op.
+    cache->setCacheDirectory(cacheDir);
+    // Make max cache size HUGE, so that evictions don't happen below
+    cache->setMaximumCacheSize(qint64(HugeCacheLimit));
+    cache->clear();
+
+    //populate some fake data to simulate partially full cache
+    injectFakeData();
+
+    //Sanity-check that the URL is already in there somewhere
+    QVERIFY(isUrlCached(NumRemovals-1) == true);
+    //Entries in the cache should be > what we try to remove
+    QVERIFY(NumFakeCacheObjects > NumRemovals);
+
+    //time removal of previously-inserted URL.
+    QBENCHMARK_ONCE { 
+        for (quint32 i = 0; i < NumRemovals; i++) {
+            QString fakeURL;
+            QTextStream stream(&fakeURL);
+            stream << fakeURLbase << i;
+            QUrl url(fakeURL);
+            cache->remove(url);
+        }
+    }
+
+    //Cleanup (slow)
+    cleanupCacheObject();
+    cleanRecursive(cacheDir);
+
+}
+
+void tst_qnetworkdiskcache::timeExpiration_data()
+{
+    QTest::addColumn<QString>("cacheRootDirectory");
+
+    QString cacheLoc = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+    QTest::newRow("QDesktopServices Cache Location") << cacheLoc;
+#ifdef Q_OS_SYMBIAN
+    if (QDir::drives().contains(QFileInfo("E:\\")))
+        QTest::newRow("Symbian E: drive") << cacheLoc.replace(0, 1, QString("E"));
+#endif
+
+}
+void tst_qnetworkdiskcache::timeExpiration()
+{
+
+    QFETCH(QString, cacheRootDirectory);
+
+    cacheDir = QString( cacheRootDirectory + QDir::separator() + "man_qndc");
+    QDir d;
+    qDebug() << "Setting cache directory to = " << d.absoluteFilePath(cacheDir);
+
+    //Housekeeping
+    initCacheObject();
+    cleanRecursive(cacheDir); // slow op.
+    cache->setCacheDirectory(cacheDir);
+    // Make max cache size HUGE, so that evictions don't happen below
+    cache->setMaximumCacheSize(qint64(HugeCacheLimit));
+    cache->clear();
+
+    //populate some fake data to simulate partially full cache
+    injectFakeData();
+
+    //Sanity-check that the URL is already in there somewhere
+    QVERIFY(isUrlCached(NumRemovals-1) == true);
+    //Entries in the cache should be > what we try to remove
+    QVERIFY(NumFakeCacheObjects > NumRemovals);
+
+
+    //Set cache limit lower, so this force 1 round of eviction
+    cache->setMaximumCacheSize(qint64(TinyCacheLimit));
+
+    //time insertions of additional content, which is likely to internally cause evictions
+    QBENCHMARK_ONCE {
+        for (quint32 i = NumFakeCacheObjects; i < (NumFakeCacheObjects + NumInsertions); i++) {
+            //prepare metata for url
+            QNetworkCacheMetaData meta;
+            QString fakeURL;
+            QTextStream stream(&fakeURL);
+            stream << fakeURLbase << i;//codescanner::leave
+            QUrl url(fakeURL);
+            meta.setUrl(url);
+            meta.setSaveToDisk(true);
+
+            //commit payload and metadata to disk
+            QIODevice *device = cache->prepare(meta);
+            device->write(payload);
+            cache->insert(device); // this should trigger evictions, if TinyCacheLimit is small enough
+        }
+    }
+
+    //Cleanup (slow)
+    cleanupCacheObject();
+    cleanRecursive(cacheDir);
+
+}
+// This function simulates a partially or fully occupied disk cache
+// like a normal user of a cache might encounter is real-life browsing.
+// The point of this is to trigger degradation in file-system and media performance
+// that occur due to the quantity and layout of data.
+void tst_qnetworkdiskcache::injectFakeData()
+{
+
+    QNetworkCacheMetaData::RawHeaderList headers;
+    headers.append(qMakePair(QByteArray("X-TestHeader"),QByteArray("HeaderValue")));
+
+
+    //Prep cache dir with fake data using QNetworkDiskCache APIs
+    for (quint32 i = 0; i < NumFakeCacheObjects; i++) {
+
+        //prepare metata for url
+        QNetworkCacheMetaData meta;
+        QString fakeURL;
+        QTextStream stream(&fakeURL);
+        stream << fakeURLbase << i;
+        QUrl url(fakeURL);
+        meta.setUrl(url);
+        meta.setRawHeaders(headers);
+        meta.setSaveToDisk(true);
+
+        //commit payload and metadata to disk
+        QIODevice *device = cache->prepare(meta);
+        device->write(payload);
+        cache->insert(device);
+    }
+
+}
+
+
+// Checks if the fake URL #id is already cached or not.
+bool tst_qnetworkdiskcache::isUrlCached(quint32 id)
+{
+    QString str;
+    QTextStream stream(&str);
+    stream << fakeURLbase << id;
+    QUrl url(str);
+    QIODevice *iod = cache->data(url);
+    return ((iod == 0) ? false : true) ;
+
+}
+
+
+// Utility function for recursive directory cleanup.
+void tst_qnetworkdiskcache::cleanRecursive(QString &path)
+{
+    QDirIterator it(path, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
+    while (it.hasNext()) {
+        QFile f(it.next());
+        bool err = f.remove();
+        Q_UNUSED(err);
+    }
+
+    QDirIterator it2(path, QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
+    while (it2.hasNext()) {
+        QString s(it2.next());
+        QDir dir(s);
+        dir.rmdir(s);
+    }
+}
+
+void tst_qnetworkdiskcache::cleanupCacheObject()
+{
+    delete cache;
+    cache = 0;
+}
+
+void tst_qnetworkdiskcache::initCacheObject()
+{
+
+   cache = new QNetworkDiskCache();
+
+}
+QTEST_MAIN(tst_qnetworkdiskcache)
+#include "tst_qnetworkdiskcache.moc"
-- 
cgit v0.12


From 151e48fef2a74a7d153a5a8eaff1088a4b1a9043 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Fri, 1 Apr 2011 14:58:26 +0200
Subject: QNetworkDiskCache: clean up after merge request

changes include whitespace, parenting, recovering erroneously deleted
code etc.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkdiskcache.cpp                       |  8 ++++----
 .../declarative/qdeclarativedom/data/importlib/sublib/qmldir   |  2 ++
 tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp         |  1 +
 .../network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp | 10 +++++-----
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp
index a5c0b3d..271494d 100644
--- a/src/network/access/qnetworkdiskcache.cpp
+++ b/src/network/access/qnetworkdiskcache.cpp
@@ -261,12 +261,11 @@ void QNetworkDiskCachePrivate::prepareLayout()
 
     //Create directory and subdirectories 0-F
     helper.mkpath(dataDirectory);
-    for ( uint i = 0; i < 16 ; i++ ) {
+    for (uint i = 0; i < 16 ; i++) {
         QString str = QString::number(i, 16);
         QString subdir = dataDirectory + str;
         helper.mkdir(subdir);
     }
-
 }
 
 
@@ -435,6 +434,7 @@ QIODevice *QNetworkDiskCache::data(const QUrl &url)
 #endif
             if (p) {
                 buffer->setData((const char *)p, size);
+                file.take()->setParent(buffer.data());
             } else {
                 buffer->setData(file->readAll());
             }
@@ -605,7 +605,7 @@ QString QNetworkDiskCachePrivate::uniqueFileName(const QUrl &url)
     QByteArray id =  QByteArray::number(*(qlonglong*)hash.result().data(), 36).left(8);
     // generates <one-char subdir>/<8-char filname.d>
     uint code = (uint)id.at(id.length()-1) % 16;
-    QString pathFragment = QString::number(code, 16) + QLatin1String("/")
+    QString pathFragment = QString::number(code, 16) + QLatin1Char('/')
                              + QLatin1String(id) + CACHE_POSTFIX;
 
     return pathFragment;
@@ -618,7 +618,7 @@ QString QNetworkDiskCachePrivate::tmpCacheFileName() const
 }
 
 /*!
-    Genrates fully qualified path of cached resource from a URL.
+    Generates fully qualified path of cached resource from a URL.
  */
 QString QNetworkDiskCachePrivate::cacheFileName(const QUrl &url) const
 {
diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
index e69de29..98d6b74 100644
--- a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
+++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir
@@ -0,0 +1,2 @@
+Foo 1.1 Foo.qml
+Foo 1.0 Foo.qml
diff --git a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index 91b0164..28c6027 100644
--- a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -181,6 +181,7 @@ void tst_QNetworkDiskCache::initTestCase()
     dir.rmdir(s + "data7"); // the number is the internal cache version
     dir.rmdir(s + "prepared");
     dir.rmdir(s);
+    dir.rmdir(s + "http"); // delete directory used by 4.7 and earlier (would make the tests fail)
 }
 
 // This will be called after the last test function is executed.
diff --git a/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index b87e327..55cbf55 100644
--- a/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/benchmarks/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -74,11 +74,11 @@ private:
     void initCacheObject();
     QString cacheDir;
     QNetworkDiskCache *cache;
-    
-public slots:    
+
+public slots:
     void initTestCase();
     void cleanupTestCase();
-    
+
 private slots:
 
     void timeInsertion_data();
@@ -147,7 +147,7 @@ void tst_qnetworkdiskcache::timeInsertion()
 
     // IMPORTANT: max cache size should be HugeCacheLimit, to avoid evictions below
     //time insertion of previously-uncached URLs.
-    QBENCHMARK_ONCE { 
+    QBENCHMARK_ONCE {
         for (quint32 i = NumFakeCacheObjects; i < (NumFakeCacheObjects + NumInsertions); i++) {
             //prepare metata for url
             QNetworkCacheMetaData meta;
@@ -274,7 +274,7 @@ void tst_qnetworkdiskcache::timeRemoval()
     QVERIFY(NumFakeCacheObjects > NumRemovals);
 
     //time removal of previously-inserted URL.
-    QBENCHMARK_ONCE { 
+    QBENCHMARK_ONCE {
         for (quint32 i = 0; i < NumRemovals; i++) {
             QString fakeURL;
             QTextStream stream(&fakeURL);
-- 
cgit v0.12


From 3e48a64a37c87c6ac1ef30e0528bd6b4d1c6939a Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Fri, 1 Apr 2011 16:20:02 +0200
Subject: Added some more error handling to the elf2e32_qtwrapper.

RevBy:    Liang Qi
---
 bin/elf2e32_qtwrapper.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index 02f4f0d..d44b2da 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -125,7 +125,7 @@ while (1) {
         }
         open($newDefFile, "< $defoutput[1]") or die("Could not open $defoutput[1]");
         open($tmpDefFile, "> $defoutput[1].tmp") or die("Could not open $defoutput[1].tmp");
-        print($tmpDefFile "EXPORTS\n");
+        print($tmpDefFile "EXPORTS\n") or die("Could not write to temporary DEF file: $!");
         $fixupFile = "$defoutput[1].tmp";
         while (1) {
             my $origDefLine;
@@ -210,9 +210,9 @@ while (1) {
                 # Auto-absent symbols.
                 $extraData .= " ABSENT";
             }
-            print($tmpDefFile "\t$sym \@ $ordinal $extraData\n");
+            print($tmpDefFile "\t$sym \@ $ordinal $extraData\n") or die("Could not write to temporary DEF file: $!");
         }
-        print($tmpDefFile "\n");
+        print($tmpDefFile "\n") or die("Could not write to temporary DEF file: $!");
         close($origDefFile) if ($definput[1]);
         close($newDefFile);
         close($tmpDefFile);
@@ -260,6 +260,6 @@ if ($buildingLibrary) {
     }
 
     if ($differenceFound) {
-        copy($tmpdso[1], $dso[1]);
+        copy($tmpdso[1], $dso[1]) or die("Could not copy $tmpdso[1] to $dso[1]: $!");
     }
 }
-- 
cgit v0.12


From 73d6632feb9b20fa37949a3f5b66ae30c5561eeb Mon Sep 17 00:00:00 2001
From: Eckhart Koppen <eckhart.koppen@nokia.com>
Date: Fri, 1 Apr 2011 17:50:47 +0300
Subject: Updated DEF files

Absented missing functions

Reviewed-by: TrustMe
---
 src/s60installs/bwins/QtGuiu.def    | 10 +++++++---
 src/s60installs/bwins/QtOpenGLu.def | 21 +++++++++++++++++++++
 src/s60installs/bwins/QtOpenVGu.def |  1 +
 src/s60installs/eabi/QtGuiu.def     |  6 +++---
 src/s60installs/eabi/QtOpenGLu.def  |  4 ++--
 src/s60installs/eabi/QtOpenVGu.def  |  2 +-
 6 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index 8f56e20..e740405 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -5028,7 +5028,7 @@ EXPORTS
 	?hasSelection@QItemSelectionModel@@QBE_NXZ @ 5027 NONAME ; bool QItemSelectionModel::hasSelection(void) const
 	?hasSelection@QTextCursor@@QBE_NXZ @ 5028 NONAME ; bool QTextCursor::hasSelection(void) const
 	?hasStaticContents@QWindowSurface@@IBE_NXZ @ 5029 NONAME ; bool QWindowSurface::hasStaticContents(void) const
-	?hasStaticContentsSupport@QWindowSurface@@UBE_NXZ @ 5030 NONAME ; bool QWindowSurface::hasStaticContentsSupport(void) const
+	?hasStaticContentsSupport@QWindowSurface@@UBE_NXZ @ 5030 NONAME ABSENT ; bool QWindowSurface::hasStaticContentsSupport(void) const
 	?hasThemeIcon@QIcon@@SA_NABVQString@@@Z @ 5031 NONAME ; bool QIcon::hasThemeIcon(class QString const &)
 	?hasTracking@QAbstractSlider@@QBE_NXZ @ 5032 NONAME ; bool QAbstractSlider::hasTracking(void) const
 	?hasTranslateOnlySceneTransform@QGraphicsItemPrivate@@QAE_NXZ @ 5033 NONAME ; bool QGraphicsItemPrivate::hasTranslateOnlySceneTransform(void)
@@ -12853,7 +12853,7 @@ EXPORTS
 	?updateAll@QGraphicsViewPrivate@@QAEXXZ @ 12852 NONAME ; void QGraphicsViewPrivate::updateAll(void)
 	?updateMicroFocus@QGraphicsItem@@IAEXXZ @ 12853 NONAME ; void QGraphicsItem::updateMicroFocus(void)
 	?populate@QTextureGlyphCache@@QAEXPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12854 NONAME ABSENT ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
-	?hasPartialUpdateSupport@QWindowSurface@@UBE_NXZ @ 12855 NONAME ; bool QWindowSurface::hasPartialUpdateSupport(void) const
+	?hasPartialUpdateSupport@QWindowSurface@@UBE_NXZ @ 12855 NONAME ABSENT ; bool QWindowSurface::hasPartialUpdateSupport(void) const
 	?scroll@QRuntimePixmapData@@UAE_NHHABVQRect@@@Z @ 12856 NONAME ; bool QRuntimePixmapData::scroll(int, int, class QRect const &)
 	?qt_draw_glyphs@@YAXPAVQPainter@@PBIPBVQPointF@@H@Z @ 12857 NONAME ; void qt_draw_glyphs(class QPainter *, unsigned int const *, class QPointF const *, int)
 	?nativeDisplay@QEgl@@YAHXZ @ 12858 NONAME ; int QEgl::nativeDisplay(void)
@@ -13165,7 +13165,7 @@ EXPORTS
 	?metaObject@QFlickGesture@@UBEPBUQMetaObject@@XZ @ 13164 NONAME ; struct QMetaObject const * QFlickGesture::metaObject(void) const
 	?renderHintsChanged@QBlitterPaintEngine@@UAEXXZ @ 13165 NONAME ; void QBlitterPaintEngine::renderHintsChanged(void)
 	?supportedDropActions@QAbstractProxyModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 13166 NONAME ; class QFlags<enum Qt::DropAction> QAbstractProxyModel::supportedDropActions(void) const
-	?hasStaticContentsSupport@QRasterWindowSurface@@UBE_NXZ @ 13167 NONAME ; bool QRasterWindowSurface::hasStaticContentsSupport(void) const
+	?hasStaticContentsSupport@QRasterWindowSurface@@UBE_NXZ @ 13167 NONAME ABSENT ; bool QRasterWindowSurface::hasStaticContentsSupport(void) const
 	?fillRect@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQBrush@@@Z @ 13168 NONAME ; void QBlitterPaintEngine::fillRect(class QRectF const &, class QBrush const &)
 	?setGlyphIndexes@QGlyphs@@QAEXABV?$QVector@I@@@Z @ 13169 NONAME ; void QGlyphs::setGlyphIndexes(class QVector<unsigned int> const &)
 	?alphaMapBoundingBox@QFontEngine@@UAE?AUglyph_metrics_t@@IABVQTransform@@W4GlyphFormat@1@@Z @ 13170 NONAME ; struct glyph_metrics_t QFontEngine::alphaMapBoundingBox(unsigned int, class QTransform const &, enum QFontEngine::GlyphFormat)
@@ -13371,4 +13371,8 @@ EXPORTS
 	?activeScrollers@QScroller@@SA?AV?$QList@PAVQScroller@@@@XZ @ 13370 NONAME ; class QList<class QScroller *> QScroller::activeScrollers(void)
 	?drawGlyphs@QPainter@@QAEXABVQPointF@@ABVQGlyphs@@@Z @ 13371 NONAME ; void QPainter::drawGlyphs(class QPointF const &, class QGlyphs const &)
 	??4QTextFrameFormat@@QAEAAV0@ABV0@@Z @ 13372 NONAME ABSENT ; class QTextFrameFormat & QTextFrameFormat::operator=(class QTextFrameFormat const &)
+	?hasFeature@QWindowSurface@@QBE_NW4WindowSurfaceFeature@1@@Z @ 13373 NONAME ; bool QWindowSurface::hasFeature(enum QWindowSurface::WindowSurfaceFeature) const
+	?leadingSpaceWidth@QTextEngine@@QAE?AUQFixed@@ABUQScriptLine@@@Z @ 13374 NONAME ; struct QFixed QTextEngine::leadingSpaceWidth(struct QScriptLine const &)
+	?features@QRasterWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13375 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QRasterWindowSurface::features(void) const
+	?features@QWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13376 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QWindowSurface::features(void) const
 
diff --git a/src/s60installs/bwins/QtOpenGLu.def b/src/s60installs/bwins/QtOpenGLu.def
index d16ff06..1798afa 100644
--- a/src/s60installs/bwins/QtOpenGLu.def
+++ b/src/s60installs/bwins/QtOpenGLu.def
@@ -833,4 +833,25 @@ EXPORTS
 	?glShaderSource@QGLFunctions@@QAEXIHPAPBDPBH@Z @ 832 NONAME ; void QGLFunctions::glShaderSource(unsigned int, int, char const * *, int const *)
 	?glGetShaderPrecisionFormat@QGLFunctions@@QAEXIIPAH0@Z @ 833 NONAME ; void QGLFunctions::glGetShaderPrecisionFormat(unsigned int, unsigned int, int *, int *)
 	?insert@QGLContextGroupResourceBase@@QAEXPBVQGLContext@@PAX@Z @ 834 NONAME ; void QGLContextGroupResourceBase::insert(class QGLContext const *, void *)
+	?hibernate@QGLPixmapData@@QAEXXZ @ 835 NONAME ; void QGLPixmapData::hibernate(void)
+	?idealFormat@QGLPixmapData@@QAE?AW4Format@QImage@@AAV3@V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 836 NONAME ; enum QImage::Format QGLPixmapData::idealFormat(class QImage &, class QFlags<enum Qt::ImageConversionFlag>)
+	?simpleProgram@QGLEngineSharedShaders@@QAEPAVQGLShaderProgram@@XZ @ 837 NONAME ; class QGLShaderProgram * QGLEngineSharedShaders::simpleProgram(void)
+	?blitProgram@QGLEngineSharedShaders@@QAEPAVQGLShaderProgram@@XZ @ 838 NONAME ; class QGLShaderProgram * QGLEngineSharedShaders::blitProgram(void)
+	??0QGLEngineSharedShaders@@QAE@PBVQGLContext@@@Z @ 839 NONAME ; QGLEngineSharedShaders::QGLEngineSharedShaders(class QGLContext const *)
+	?qShaderSnippets@QGLEngineSharedShaders@@0PAPBDA @ 840 NONAME ; char const * * QGLEngineSharedShaders::qShaderSnippets
+	?shadersForContext@QGLEngineSharedShaders@@SAPAV1@PBVQGLContext@@@Z @ 841 NONAME ; class QGLEngineSharedShaders * QGLEngineSharedShaders::shadersForContext(class QGLContext const *)
+	?cleanupCustomStage@QGLEngineSharedShaders@@QAEXPAVQGLCustomShaderStage@@@Z @ 842 NONAME ; void QGLEngineSharedShaders::cleanupCustomStage(class QGLCustomShaderStage *)
+	?clear@QGLTextureGlyphCache@@QAEXXZ @ 843 NONAME ; void QGLTextureGlyphCache::clear(void)
+	?getStaticMetaObject@QGLEngineSharedShaders@@SAABUQMetaObject@@XZ @ 844 NONAME ; struct QMetaObject const & QGLEngineSharedShaders::getStaticMetaObject(void)
+	?detachTextureFromPool@QGLPixmapData@@QAEXXZ @ 845 NONAME ; void QGLPixmapData::detachTextureFromPool(void)
+	??1QGLEngineSharedShaders@@QAE@XZ @ 846 NONAME ; QGLEngineSharedShaders::~QGLEngineSharedShaders(void)
+	?findProgramInCache@QGLEngineSharedShaders@@QAEPAVQGLEngineShaderProg@@ABV2@@Z @ 847 NONAME ; class QGLEngineShaderProg * QGLEngineSharedShaders::findProgramInCache(class QGLEngineShaderProg const &)
+	?reclaimTexture@QGLPixmapData@@QAEXXZ @ 848 NONAME ; void QGLPixmapData::reclaimTexture(void)
+	?destroyTexture@QGLPixmapData@@QAEXXZ @ 849 NONAME ; void QGLPixmapData::destroyTexture(void)
+	?features@QGLWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 850 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QGLWindowSurface::features(void) const
+	?releaseCachedResources@QGLGraphicsSystem@@UAEXXZ @ 851 NONAME ; void QGLGraphicsSystem::releaseCachedResources(void)
+	??_EQGLEngineSharedShaders@@QAE@I@Z @ 852 NONAME ; QGLEngineSharedShaders::~QGLEngineSharedShaders(unsigned int)
+	?staticMetaObject@QGLEngineSharedShaders@@2UQMetaObject@@B @ 853 NONAME ; struct QMetaObject const QGLEngineSharedShaders::staticMetaObject
+	?cleanup@QGLContextGroupResourceBase@@QAEXPBVQGLContext@@@Z @ 854 NONAME ; void QGLContextGroupResourceBase::cleanup(class QGLContext const *)
+	?forceToImage@QGLPixmapData@@QAEXXZ @ 855 NONAME ; void QGLPixmapData::forceToImage(void)
 
diff --git a/src/s60installs/bwins/QtOpenVGu.def b/src/s60installs/bwins/QtOpenVGu.def
index 18f576b..113e75a 100644
--- a/src/s60installs/bwins/QtOpenVGu.def
+++ b/src/s60installs/bwins/QtOpenVGu.def
@@ -183,4 +183,5 @@ EXPORTS
 	?initFromNativeImageHandle@QVGPixmapData@@QAE_NPAXABVQString@@@Z @ 182 NONAME ; bool QVGPixmapData::initFromNativeImageHandle(void *, class QString const &)
 	?createFromNativeImageHandleProvider@QVGPixmapData@@QAEXXZ @ 183 NONAME ; void QVGPixmapData::createFromNativeImageHandleProvider(void)
 	?releaseNativeImageHandle@QVGPixmapData@@QAEXXZ @ 184 NONAME ; void QVGPixmapData::releaseNativeImageHandle(void)
+	?features@QVGWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 185 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QVGWindowSurface::features(void) const
 
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index fc256e4..ca83384 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -8830,7 +8830,7 @@ EXPORTS
 	_ZNK14QWindowSurface10grabWidgetEPK7QWidgetRK5QRect @ 8829 NONAME
 	_ZNK14QWindowSurface14staticContentsEv @ 8830 NONAME
 	_ZNK14QWindowSurface17hasStaticContentsEv @ 8831 NONAME
-	_ZNK14QWindowSurface24hasStaticContentsSupportEv @ 8832 NONAME
+	_ZNK14QWindowSurface24hasStaticContentsSupportEv @ 8832 NONAME ABSENT
 	_ZNK14QWindowSurface6offsetEPK7QWidget @ 8833 NONAME
 	_ZNK14QWindowSurface6windowEv @ 8834 NONAME
 	_ZNK14QWindowSurface8geometryEv @ 8835 NONAME
@@ -12034,7 +12034,7 @@ EXPORTS
 	_ZNK13QS60MainAppUi15ApplicationRectEv @ 12033 NONAME
 	_ZNK14QPlainTextEdit8anchorAtERK6QPoint @ 12034 NONAME
 	_ZNK14QWidgetPrivate22childAtRecursiveHelperERK6QPointbb @ 12035 NONAME
-	_ZNK14QWindowSurface23hasPartialUpdateSupportEv @ 12036 NONAME
+	_ZNK14QWindowSurface23hasPartialUpdateSupportEv @ 12036 NONAME ABSENT
 	_ZNK15QGraphicsWidget18autoFillBackgroundEv @ 12037 NONAME
 	_ZNK17QRasterPixmapData7toImageERK5QRect @ 12038 NONAME
 	_ZNK18QRuntimePixmapData11paintEngineEv @ 12039 NONAME
@@ -12394,7 +12394,7 @@ EXPORTS
 	_ZNK20QBlittablePixmapData6metricEN12QPaintDevice17PaintDeviceMetricE @ 12393 NONAME
 	_ZNK20QBlittablePixmapData7toImageEv @ 12394 NONAME
 	_ZNK20QBlittablePixmapData9blittableEv @ 12395 NONAME
-	_ZNK20QRasterWindowSurface24hasStaticContentsSupportEv @ 12396 NONAME
+	_ZNK20QRasterWindowSurface24hasStaticContentsSupportEv @ 12396 NONAME ABSENT
 	_ZNK5QFont17hintingPreferenceEv @ 12397 NONAME
 	_ZNK7QGlyphs12glyphIndexesEv @ 12398 NONAME
 	_ZNK7QGlyphs4fontEv @ 12399 NONAME
diff --git a/src/s60installs/eabi/QtOpenGLu.def b/src/s60installs/eabi/QtOpenGLu.def
index 251521a..c1ad795 100644
--- a/src/s60installs/eabi/QtOpenGLu.def
+++ b/src/s60installs/eabi/QtOpenGLu.def
@@ -755,6 +755,6 @@ EXPORTS
 	_ZN22QGLEngineSharedShadersC2EPK10QGLContext @ 754 NONAME
 	_ZN22QGLEngineSharedShadersD1Ev @ 755 NONAME
 	_ZN22QGLEngineSharedShadersD2Ev @ 756 NONAME
-	_ZNK16QGLWindowSurface23hasPartialUpdateSupportEv @ 757 NONAME
-	_ZThn8_NK16QGLWindowSurface23hasPartialUpdateSupportEv @ 758 NONAME
+	_ZNK16QGLWindowSurface23hasPartialUpdateSupportEv @ 757 NONAME ABSENT
+	_ZThn8_NK16QGLWindowSurface23hasPartialUpdateSupportEv @ 758 NONAME ABSENT
 
diff --git a/src/s60installs/eabi/QtOpenVGu.def b/src/s60installs/eabi/QtOpenVGu.def
index 7e91b83..a1be1fc 100644
--- a/src/s60installs/eabi/QtOpenVGu.def
+++ b/src/s60installs/eabi/QtOpenVGu.def
@@ -213,5 +213,5 @@ EXPORTS
 	_ZN13QVGPixmapData25initFromNativeImageHandleEPvRK7QString @ 212 NONAME
 	_ZN13QVGPixmapData35createFromNativeImageHandleProviderEv @ 213 NONAME
 	_ZNK13QVGPixmapData14ensureReadbackEb @ 214 NONAME
-	_ZNK16QVGWindowSurface24hasStaticContentsSupportEv @ 215 NONAME
+	_ZNK16QVGWindowSurface24hasStaticContentsSupportEv @ 215 NONAME ABSENT
 
-- 
cgit v0.12


From 991f59a295e7678165b1db7befc9beac8bdbe503 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 1 Apr 2011 17:36:26 +0200
Subject: Moved all XCB event handling back into the main thread.

There are to many synchronization problems if any GL call can lead the
event processing thread to stall.
---
 src/plugins/platforms/xcb/qglxintegration.cpp   |   2 -
 src/plugins/platforms/xcb/qxcbconnection.cpp    | 241 ++++++++----------------
 src/plugins/platforms/xcb/qxcbconnection.h      |  23 +--
 src/plugins/platforms/xcb/qxcbwindow.cpp        |   4 -
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp |  23 +--
 src/plugins/platforms/xcb/qxcbwindowsurface.h   |   3 -
 6 files changed, 86 insertions(+), 210 deletions(-)

diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index d1171b8..19a9503 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -137,7 +137,6 @@ void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
 void QGLXContext::makeCurrent()
 {
     Q_XCB_NOOP(m_screen->connection());
-    m_screen->connection()->setEventProcessingEnabled(false);
     QPlatformGLContext::makeCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), m_drawable, m_context);
     Q_XCB_NOOP(m_screen->connection());
@@ -148,7 +147,6 @@ void QGLXContext::doneCurrent()
     Q_XCB_NOOP(m_screen->connection());
     QPlatformGLContext::doneCurrent();
     glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), 0, 0);
-    m_screen->connection()->setEventProcessingEnabled(true);
     Q_XCB_NOOP(m_screen->connection());
 }
 
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 05d3440..ec1fc1b 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -47,6 +47,7 @@
 #include <QtAlgorithms>
 #include <QSocketNotifier>
 #include <QtGui/private/qapplication_p.h>
+#include <QAbstractEventDispatcher>
 
 #include <QtCore/QDebug>
 
@@ -76,8 +77,6 @@ extern "C" {
 
 QXcbConnection::QXcbConnection(const char *displayName)
     : m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
-    , m_pauseId(0)
-    , m_enabled(true)
 #ifdef XCB_USE_DRI2
     , m_dri2_major(0)
     , m_dri2_minor(0)
@@ -114,12 +113,6 @@ QXcbConnection::QXcbConnection(const char *displayName)
         xcb_screen_next(&it);
     }
 
-    m_connectionEventListener = xcb_generate_id(xcb_connection());
-    xcb_create_window(xcb_connection(), XCB_COPY_FROM_PARENT,
-                      m_connectionEventListener, m_screens.at(0)->root(),
-                      0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_ONLY,
-                      m_screens.at(0)->screen()->root_visual, 0, 0);
-
     m_keyboard = new QXcbKeyboard(this);
 
     initializeAllAtoms();
@@ -128,50 +121,15 @@ QXcbConnection::QXcbConnection(const char *displayName)
     initializeDri2();
 #endif
 
-    start();
-}
+    QSocketNotifier *notifier = new QSocketNotifier(xcb_get_file_descriptor(xcb_connection()), QSocketNotifier::Read, this);
+    connect(notifier, SIGNAL(activated(int)), this, SLOT(processXcbEvents()));
 
-void QXcbConnection::sendConnectionEvent(QXcbAtom::Atom atom, uint id)
-{
-    xcb_client_message_event_t event;
-    memset(&event, 0, sizeof(event));
-
-    event.response_type = XCB_CLIENT_MESSAGE;
-    event.format = 32;
-    event.sequence = 0;
-    event.window = m_connectionEventListener;
-    event.type = atom;
-    event.data.data32[0] = id;
-
-    Q_XCB_CALL(xcb_send_event(xcb_connection(), false, m_connectionEventListener, XCB_EVENT_MASK_NO_EVENT, (const char *)&event));
-    xcb_flush(xcb_connection());
-}
-
-void QXcbConnection::setEventProcessingEnabled(bool enabled)
-{
-    if (enabled == m_enabled)
-        return;
-
-    if (!enabled) {
-        sendConnectionEvent(QXcbAtom::_QT_PAUSE_CONNECTION, uint(m_pauseId));
-        m_connectionLock.lock();
-        m_pauseId.fetchAndAddOrdered(1);
-    } else {
-        m_connectionLock.unlock();
-        m_connectionWaitCondition.wakeAll();
-    }
-
-    m_enabled = enabled;
+    QAbstractEventDispatcher *dispatcher = QAbstractEventDispatcher::instance(qApp->thread());
+    connect(dispatcher, SIGNAL(awake()), this, SLOT(processXcbEvents()));
 }
 
 QXcbConnection::~QXcbConnection()
 {
-    setEventProcessingEnabled(true);
-
-    sendConnectionEvent(QXcbAtom::_QT_CLOSE_CONNECTION);
-    wait();
-
-    xcb_destroy_window(xcb_connection(), m_connectionEventListener);
     qDeleteAll(m_screens);
 
 #ifdef XCB_USE_XLIB
@@ -417,128 +375,93 @@ void QXcbConnection::log(const char *file, int line, int sequence)
     info.sequence = sequence;
     info.file = file;
     info.line = line;
-
-    QMutexLocker locker(&m_callLogMutex);
-    m_callLog << info;
 }
 #endif
 
-void QXcbConnection::run()
+void QXcbConnection::processXcbEvents()
 {
-    QMutexLocker locker(&m_connectionLock);
-    fd_set readset;
-    int xcb_fd = xcb_get_file_descriptor(xcb_connection());
-    FD_ZERO(&readset);
-    FD_SET(xcb_fd, &readset);
-    int result;
-    while (true) {
-        while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
-            bool handled = true;
-
-            uint response_type = event->response_type & ~0x80;
-
-            if (!response_type) {
-                xcb_generic_error_t *error = (xcb_generic_error_t *)event;
-
-                uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
-                uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
-
-                printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
-                       int(error->error_code), xcb_errors[clamped_error_code],
-                       int(error->sequence), int(error->resource_id),
-                       int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
-                       int(error->minor_code));
-#ifdef Q_XCB_DEBUG
-                QMutexLocker locker(&m_callLogMutex);
-                int i = 0;
-                for (; i < m_callLog.size(); ++i) {
-                    if (m_callLog.at(i).sequence == error->sequence) {
-                        printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                        break;
-                    } else if (m_callLog.at(i).sequence > error->sequence) {
-                        printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                        if (i > 0)
-                            printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
-                        break;
-                    }
-                }
-                if (i == m_callLog.size() && !m_callLog.isEmpty())
-                    printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
-#endif
-                continue;
-            }
+    while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
+        bool handled = true;
 
-#ifdef Q_XCB_DEBUG
-            {
-                QMutexLocker locker(&m_callLogMutex);
-                int i = 0;
-                for (; i < m_callLog.size(); ++i)
-                    if (m_callLog.at(i).sequence >= event->sequence)
-                        break;
-                m_callLog.remove(0, i);
-            }
-#endif
+        uint response_type = event->response_type & ~0x80;
 
-            if (response_type == XCB_CLIENT_MESSAGE) {
-                xcb_client_message_event_t *ev = (xcb_client_message_event_t *)event;
+        if (!response_type) {
+            xcb_generic_error_t *error = (xcb_generic_error_t *)event;
 
-                if (ev->type == QXcbAtom::_QT_CLOSE_CONNECTION)
-                    return;
+            uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
+            uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
 
-                if (ev->type == QXcbAtom::_QT_PAUSE_CONNECTION) {
-                    if (ev->data.data32[0] == uint(m_pauseId))
-                        m_connectionWaitCondition.wait(&m_connectionLock);
-                    continue;
+            printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
+                   int(error->error_code), xcb_errors[clamped_error_code],
+                   int(error->sequence), int(error->resource_id),
+                   int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
+                   int(error->minor_code));
+#ifdef Q_XCB_DEBUG
+            int i = 0;
+            for (; i < m_callLog.size(); ++i) {
+                if (m_callLog.at(i).sequence == error->sequence) {
+                    printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                    break;
+                } else if (m_callLog.at(i).sequence > error->sequence) {
+                    printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+                    if (i > 0)
+                        printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+                    break;
                 }
             }
-
-            switch (response_type) {
-            case XCB_EXPOSE:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
-            case XCB_BUTTON_PRESS:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent);
-            case XCB_BUTTON_RELEASE:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
-            case XCB_MOTION_NOTIFY:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
-            case XCB_CONFIGURE_NOTIFY:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
-            case XCB_CLIENT_MESSAGE:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_client_message_event_t, window, handleClientMessageEvent);
-            case XCB_ENTER_NOTIFY:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
-            case XCB_LEAVE_NOTIFY:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
-            case XCB_FOCUS_IN:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent);
-            case XCB_FOCUS_OUT:
-                HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent);
-            case XCB_KEY_PRESS:
-                HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent);
-            case XCB_KEY_RELEASE:
-                HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
-            case XCB_MAPPING_NOTIFY:
-                m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event);
-                break;
-            default:
-                handled = false;
-                break;
-            }
-            if (handled)
-                printXcbEvent("Handled XCB event", event);
-            else
-                printXcbEvent("Unhandled XCB event", event);
+            if (i == m_callLog.size() && !m_callLog.isEmpty())
+                printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
+#endif
+            continue;
         }
 
-        do {
-            result = select(xcb_fd + 1, &readset, 0, 0, 0);
-        } while (result == -1 && errno == EINTR);
-
-        if (result <= 0 || !FD_ISSET(xcb_fd, &readset))
-            continue;
+#ifdef Q_XCB_DEBUG
+        {
+            int i = 0;
+            for (; i < m_callLog.size(); ++i)
+                if (m_callLog.at(i).sequence >= event->sequence)
+                    break;
+            m_callLog.remove(0, i);
+        }
+#endif
 
+        switch (response_type) {
+        case XCB_EXPOSE:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
+        case XCB_BUTTON_PRESS:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent);
+        case XCB_BUTTON_RELEASE:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
+        case XCB_MOTION_NOTIFY:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
+        case XCB_CONFIGURE_NOTIFY:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
+        case XCB_CLIENT_MESSAGE:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_client_message_event_t, window, handleClientMessageEvent);
+        case XCB_ENTER_NOTIFY:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
+        case XCB_LEAVE_NOTIFY:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
+        case XCB_FOCUS_IN:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent);
+        case XCB_FOCUS_OUT:
+            HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent);
+        case XCB_KEY_PRESS:
+            HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent);
+        case XCB_KEY_RELEASE:
+            HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
+        case XCB_MAPPING_NOTIFY:
+            m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event);
+            break;
+        default:
+            handled = false;
+            break;
+        }
+        if (handled)
+            printXcbEvent("Handled XCB event", event);
+        else
+            printXcbEvent("Unhandled XCB event", event);
     }
-    fprintf(stderr, "I/O error in xcb_wait_for_event\n");
 }
 
 static const char * xcb_atomnames = {
@@ -580,9 +503,6 @@ static const char * xcb_atomnames = {
     "_QT_SCROLL_DONE\0"
     "_QT_INPUT_ENCODING\0"
 
-    "_QT_CLOSE_CONNECTION\0"
-    "_QT_PAUSE_CONNECTION\0"
-
     "_MOTIF_WM_HINTS\0"
 
     "DTWM_IS_RUNNING\0"
@@ -738,13 +658,8 @@ void QXcbConnection::initializeAllAtoms() {
 void QXcbConnection::sync()
 {
     // from xcb_aux_sync
-    bool wasEnabled = m_enabled;
-    setEventProcessingEnabled(false);
     xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
     free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
-
-    if (wasEnabled)
-        setEventProcessingEnabled(true);
 }
 
 #if defined(XCB_USE_EGL)
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 7088184..53846f1 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -44,10 +44,8 @@
 #include <xcb/xcb.h>
 
 #include <QList>
-#include <QMutex>
+#include <QObject>
 #include <QVector>
-#include <QWaitCondition>
-#include <QThread>
 
 #define Q_XCB_DEBUG
 
@@ -93,10 +91,6 @@ namespace QXcbAtom {
         _QT_SCROLL_DONE,
         _QT_INPUT_ENCODING,
 
-        // Qt/XCB specific
-        _QT_CLOSE_CONNECTION,
-        _QT_PAUSE_CONNECTION,
-
         _MOTIF_WM_HINTS,
 
         DTWM_IS_RUNNING,
@@ -222,7 +216,7 @@ namespace QXcbAtom {
 
 class QXcbKeyboard;
 
-class QXcbConnection : public QThread
+class QXcbConnection : public QObject
 {
     Q_OBJECT
 public:
@@ -242,8 +236,6 @@ public:
 
     QXcbKeyboard *keyboard() const { return m_keyboard; }
 
-    void setEventProcessingEnabled(bool enabled);
-
 #ifdef XCB_USE_XLIB
     void *xlib_display() const { return m_xlib_display; }
 #endif
@@ -261,8 +253,8 @@ public:
 
     void sync();
 
-protected:
-    void run();
+private slots:
+    void processXcbEvents();
 
 private:
     void initializeAllAtoms();
@@ -281,12 +273,6 @@ private:
 
     QByteArray m_displayName;
 
-    xcb_window_t m_connectionEventListener;
-    QMutex m_connectionLock;
-    QWaitCondition m_connectionWaitCondition;
-    QAtomicInt m_pauseId;
-    bool m_enabled;
-
     QXcbKeyboard *m_keyboard;
 
 #if defined(XCB_USE_XLIB)
@@ -311,7 +297,6 @@ private:
         int line;
     };
     QVector<CallInfo> m_callLog;
-    QMutex m_callLogMutex;
     void log(const char *file, int line, int sequence);
     template <typename cookie_t>
     friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line);
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 7aeb557..1f4a13c 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -113,7 +113,6 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
         && QApplicationPrivate::platformIntegration()->hasOpenGL())
     {
-        connection()->setEventProcessingEnabled(false);
 #if defined(XCB_USE_GLX)
         XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
 #elif defined(XCB_USE_EGL)
@@ -142,7 +141,6 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
         } else {
             qFatal("no window!");
         }
-        connection()->setEventProcessingEnabled(true);
     } else
 #endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
     {
@@ -431,7 +429,6 @@ QPlatformGLContext *QXcbWindow::glContext() const
         return 0;
     }
     if (!m_context) {
-        connection()->setEventProcessingEnabled(false);
 #if defined(XCB_USE_GLX)
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
         that->m_context = new QGLXContext(m_window, m_screen, widget()->platformWindowFormat());
@@ -450,7 +447,6 @@ QPlatformGLContext *QXcbWindow::glContext() const
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
         that->m_context = new QDri2Context(that);
 #endif
-        connection()->setEventProcessingEnabled(true);
     }
     return m_context;
 }
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 4c0d862..a4607dc 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -62,7 +62,7 @@ public:
     QImage *image() { return &m_qimage; }
 
     void put(xcb_window_t window, const QPoint &dst, const QRect &source);
-    void preparePaint(const QRegion &region, QMutex *mutex);
+    void preparePaint(const QRegion &region);
 
 private:
     void destroy();
@@ -148,15 +148,12 @@ void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &s
     Q_XCB_NOOP(connection());
 }
 
-void QXcbShmImage::preparePaint(const QRegion &region, QMutex *mutex)
+void QXcbShmImage::preparePaint(const QRegion &region)
 {
     // to prevent X from reading from the image region while we're writing to it
     if (m_dirty.intersects(region)) {
         connection()->sync();
-        mutex->lock();
         m_dirty = QRegion();
-    } else {
-        mutex->lock();
     }
 }
 
@@ -170,7 +167,6 @@ QXcbWindowSurface::QXcbWindowSurface(QWidget *widget, bool setDefaultSurface)
 
 QXcbWindowSurface::~QXcbWindowSurface()
 {
-    QMutexLocker locker(&m_surfaceLock);
     delete m_image;
 }
 
@@ -181,12 +177,11 @@ QPaintDevice *QXcbWindowSurface::paintDevice()
 
 void QXcbWindowSurface::beginPaint(const QRegion &region)
 {
-    m_image->preparePaint(region, &m_surfaceLock);
+    m_image->preparePaint(region);
 }
 
 void QXcbWindowSurface::endPaint(const QRegion &)
 {
-    m_surfaceLock.unlock();
 }
 
 void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
@@ -201,8 +196,6 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
     extern QWidgetData* qt_widget_data(QWidget *);
     QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
 
-    QMutexLocker locker(&m_surfaceLock);
-
     QVector<QRect> rects = region.rects();
     for (int i = 0; i < rects.size(); ++i)
         m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
@@ -217,15 +210,9 @@ void QXcbWindowSurface::resize(const QSize &size)
 
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
 
-    connection()->setEventProcessingEnabled(false);
-    m_surfaceLock.lock();
-
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
     Q_XCB_NOOP(connection());
-
-    m_surfaceLock.unlock();
-    connection()->setEventProcessingEnabled(true);
 }
 
 extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
@@ -235,14 +222,12 @@ bool QXcbWindowSurface::scroll(const QRegion &area, int dx, int dy)
     if (m_image->image()->isNull())
         return false;
 
-    m_image->preparePaint(area, &m_surfaceLock);
+    m_image->preparePaint(area);
 
     const QVector<QRect> rects = area.rects();
     for (int i = 0; i < rects.size(); ++i)
         qt_scrollRectInImage(*m_image->image(), rects.at(i), QPoint(dx, dy));
 
-    m_surfaceLock.unlock();
-
     return true;
 }
 
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
index e508fe6..f87e122 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.h
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -48,8 +48,6 @@
 
 #include "qxcbobject.h"
 
-#include <QMutex>
-
 class QXcbShmImage;
 
 class QXcbWindowSurface : public QXcbObject, public QWindowSurface
@@ -68,7 +66,6 @@ public:
 
 private:
     QXcbShmImage *m_image;
-    QMutex m_surfaceLock;
 };
 
 #endif
-- 
cgit v0.12


From 9c365ff16abec339c3930444dc1722a419f07dad Mon Sep 17 00:00:00 2001
From: Eckhart Koppen <eckhart.koppen@nokia.com>
Date: Mon, 4 Apr 2011 08:03:39 +0300
Subject: Updated QtGui DEF file for ARMV5

Added missing functions

Reviewed-by: TrustMe
---
 src/s60installs/eabi/QtGuiu.def | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index ca83384..cfbca55 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12433,4 +12433,7 @@ EXPORTS
 	_ZTV20QBlittablePixmapData @ 12432 NONAME
 	_ZTV9QScroller @ 12433 NONAME
 	_Zls6QDebugPK13QSymbianEvent @ 12434 NONAME
+	_ZN11QTextEngine17leadingSpaceWidthERK11QScriptLine @ 12435 NONAME
+	_ZNK14QWindowSurface8featuresEv @ 12436 NONAME
+	_ZNK20QRasterWindowSurface8featuresEv @ 12437 NONAME
 
-- 
cgit v0.12


From f7c7232208a3680a81615bfc697548e9ad7ffa02 Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Mon, 4 Apr 2011 09:13:17 +0200
Subject: Fixed detection of internal errors in the elf2e32_qtwrapper script.

Reviewed-by: Trust me
---
 bin/elf2e32_qtwrapper.pl | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index d44b2da..6675012 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -219,14 +219,12 @@ while (1) {
 
         $definput[1] = "$defoutput[1].tmp";
 
-        if (!$foundBrokenSymbols || $errors) {
-            last;
-        }
-
-        print("Rerunning elf2e32 due to DEF file / ELF file mismatch\n");
-    } else {
+    }
+    if (!$foundBrokenSymbols || $errors) {
         last;
     }
+
+    print("Rerunning elf2e32 due to DEF file / ELF file mismatch\n");
 };
 
 if ($fixupFile) {
-- 
cgit v0.12


From 0a330c0479a363bc5ab2e2c036fd938b52f4c92c Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Mon, 4 Apr 2011 09:52:31 +0200
Subject: Added debugging output to elf2e32_qtwrapper.

Reviewed-by: Trust me
---
 bin/elf2e32_qtwrapper.pl | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index 6675012..8b8eab9 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -81,9 +81,37 @@ my $fixupFile = "";
 my $runCount = 0;
 my $returnCode = 0;
 
+# For debugging. Make it nonzero to give verbose output.
+my $debugScript = 1;
+my @usedDefFiles;
+sub recordDefFile {
+    return if (!$debugScript);
+
+    my ($msg, $file) = @_;
+    my $content = "$msg, $file:\n";
+    my $defFileFd;
+    if (!open($defFileFd, "< $file")) {
+        print("Warning: Could not open $file (for debug analysis)\n");
+        return;
+    }
+    while (<$defFileFd>) {
+        $content .= $_;
+    }
+
+    push(@usedDefFiles, $content);
+}
+sub printRecordedDefFiles {
+    return if (!$debugScript);
+
+    foreach (@usedDefFiles) {
+        print ("$_\n");
+    }
+}
+
 while (1) {
     if (++$runCount > 2) {
         print("Internal error in $0, link succeeded, but exports may be wrong.\n");
+        printRecordedDefFiles;
         last;
     }
 
@@ -110,6 +138,9 @@ while (1) {
     }
     close($elf2e32Pipe);
 
+    recordDefFile("Run no $runCount, elf2e32 DEF file input", "$definput[1]");
+    recordDefFile("Run no $runCount, elf2e32 DEF file output", "$defoutput[1]");
+
     if ($errors) {
         $returnCode = 1;
         last;
-- 
cgit v0.12


From ae9a504def982f32111bbcc28788d7ad1cadaa10 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Sat, 2 Apr 2011 19:28:09 +0200
Subject: moc: qobject_cast cannot be used if the class privately iherit from
 QObject

because the qobject_cast function do not have the right to access the
staticMetaObject.
---
 src/tools/moc/generator.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 67aba8f..aea156d 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -920,7 +920,9 @@ void Generator::generateStaticMetacall()
         else
             fprintf(out, "    ");
         fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n");
-        fprintf(out, "        Q_ASSERT(qobject_cast<%s *>(_o));\n", cdef->classname.constData());
+#ifndef QT_NO_DEBUG
+        fprintf(out, "        Q_ASSERT(staticMetaObject.cast(_o));\n");
+#endif
         fprintf(out, "        %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
         fprintf(out, "        switch (_id) {\n");
         for (int methodindex = 0; methodindex < methodList.size(); ++methodindex) {
-- 
cgit v0.12


From cc46428d5b421b3ebc3a2ff3171b5197af008022 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 4 Apr 2011 12:13:48 +0200
Subject: Wayland: Allways have a userPtr for QWaylandWindow

So that we can use it without having to check for 0 in input handling

Conflicts:

	src/plugins/platforms/wayland/qwaylandinputdevice.cpp
---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 6 ++++--
 src/plugins/platforms/wayland/qwaylanddisplay.h   | 2 +-
 src/plugins/platforms/wayland/qwaylandwindow.cpp  | 7 +++----
 3 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index e3b2d46..b79f355 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -54,9 +54,11 @@
 #include <fcntl.h>
 #include <stdio.h>
 
-struct wl_surface *QWaylandDisplay::createSurface()
+struct wl_surface *QWaylandDisplay::createSurface(void *handle)
 {
-    return wl_compositor_create_surface(mCompositor);
+    struct wl_surface * surface = wl_compositor_create_surface(mCompositor);
+    wl_surface_set_user_data(surface, handle);
+    return surface;
 }
 
 struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd,
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index fc26ad2..481f829 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -63,7 +63,7 @@ public:
 
     void createNewScreen(struct wl_output *output, QRect geometry);
     QList<QPlatformScreen *> screens() const { return mScreens; }
-    struct wl_surface *createSurface();
+    struct wl_surface *createSurface(void *handle);
     struct wl_buffer *createShmBuffer(int fd, int width, int height,
                                       uint32_t stride,
                                       struct wl_visual *visual);
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index a912a83..9e851b3 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -56,7 +56,7 @@ QWaylandWindow::QWaylandWindow(QWidget *window)
     static WId id = 1;
     mWindowId = id++;
 
-    mSurface = mDisplay->createSurface();
+    mSurface = mDisplay->createSurface(this);
 }
 
 QWaylandWindow::~QWaylandWindow()
@@ -76,13 +76,12 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent)
 
 void QWaylandWindow::setVisible(bool visible)
 {
-    if (!mSurface) {
-        mSurface = mDisplay->createSurface();
+    if (!mSurface && visible) {
+        mSurface = mDisplay->createSurface(this);
         newSurfaceCreated();
     }
 
     if (visible) {
-        wl_surface_set_user_data(mSurface, this);
         wl_surface_map_toplevel(mSurface);
     } else {
         wl_surface_destroy(mSurface);
-- 
cgit v0.12


From 05f2b1c912e09be9cb9f1128494d315c53698d02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 4 Apr 2011 12:19:57 +0200
Subject: Lighthouse: Add drawable bit to the glx config selection rutine

So that we can use the same thing when creating glx pixmaps
---
 src/plugins/platforms/glxconvenience/qglxconvenience.cpp          | 8 ++++----
 src/plugins/platforms/glxconvenience/qglxconvenience.h            | 4 ++--
 .../gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp      | 2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
index 08972f7..f548ad9 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -25,14 +25,14 @@ enum {
 #undef FontChange
 #endif
 
-QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format)
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format, int drawableBit)
 {
     QVector<int> spec(48);
     int i = 0;
 
     spec[i++] = GLX_LEVEL;
     spec[i++] = 0;
-    spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = GLX_WINDOW_BIT;
+    spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = drawableBit;
 
     if (format.rgba()) {
         spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_RGBA_BIT;
@@ -77,13 +77,13 @@ QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format)
     return spec;
 }
 
-GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindowFormat &format)
+GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindowFormat &format, int drawableBit)
 {
     bool reduced = true;
     GLXFBConfig chosenConfig = 0;
     QPlatformWindowFormat reducedFormat = format;
     while (!chosenConfig && reduced) {
-        QVector<int> spec = qglx_buildSpec(reducedFormat);
+        QVector<int> spec = qglx_buildSpec(reducedFormat, drawableBit);
         int confcount = 0;
         GLXFBConfig *configs;
         configs = glXChooseFBConfig(display, screen,spec.constData(),&confcount);
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.h b/src/plugins/platforms/glxconvenience/qglxconvenience.h
index a3cfd9a..6b65e08 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.h
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.h
@@ -7,9 +7,9 @@
 #include <GL/glx.h>
 
 XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format);
-GLXFBConfig qglx_findConfig(Display *display, int screen, const QPlatformWindowFormat &format);
+GLXFBConfig qglx_findConfig(Display *display, int screen, const QPlatformWindowFormat &format, int drawableBit = GLX_WINDOW_BIT);
 QPlatformWindowFormat qglx_platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
-QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format);
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format, int drawableBit = GLX_WINDOW_BIT);
 QPlatformWindowFormat qglx_reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
 
 #endif // QGLXCONVENIENCE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
index d5806bb..f98e026 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -33,7 +33,7 @@ QWaylandXPixmapGLXContext::QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegrati
     , mWindow(window)
     , mBuffer(0)
     , mPixmap(0)
-    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat(),GLX_PIXMAP_BIT))
     , mGlxPixmap(0)
 {
     XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
-- 
cgit v0.12


From e8d31fa99352c18d469394d65c80541b7788440c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 4 Apr 2011 12:35:25 +0200
Subject: Process XCB events on aboutToBlock() instead of awake().

We want the XCB events to be processed right before calling select(),
to make sure any remaining events in the queue are flushed.
---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index ec1fc1b..2a220af 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -125,7 +125,7 @@ QXcbConnection::QXcbConnection(const char *displayName)
     connect(notifier, SIGNAL(activated(int)), this, SLOT(processXcbEvents()));
 
     QAbstractEventDispatcher *dispatcher = QAbstractEventDispatcher::instance(qApp->thread());
-    connect(dispatcher, SIGNAL(awake()), this, SLOT(processXcbEvents()));
+    connect(dispatcher, SIGNAL(aboutToBlock()), this, SLOT(processXcbEvents()));
 }
 
 QXcbConnection::~QXcbConnection()
-- 
cgit v0.12


From da7674a6465a311504927c0b8ed65feaf22ab5fa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Mon, 14 Feb 2011 17:55:29 +0100
Subject: Test should fail, debug output here is useless

Reviewed-by: Olivier Goffart
Reviewed-by: Harald Fernengel
Reviewed-by: Robin Burchell
---
 tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
index f89e033..91d62b0 100644
--- a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
+++ b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
@@ -359,10 +359,7 @@ void tst_QTemporaryFile::stressTest()
     for (int i = 0; i < iterations; ++i) {
         QTemporaryFile file;
         file.setAutoRemove(false);
-        if (!file.open()) {
-            qDebug() << "Could not open File:" << file.fileName();
-            continue;
-        }
+        QVERIFY2(file.open(), qPrintable(file.errorString()));
         QVERIFY(!names.contains(file.fileName()));
         names.insert(file.fileName());
     }
-- 
cgit v0.12


From a029db3e1c8de5ff20395904b9e37a009a2924c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Mon, 14 Feb 2011 17:57:04 +0100
Subject: Adding unicode test case for QTemporaryFile

Task-number: QTBUG-4796
Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp | 122 +++++++++++++++++++++++
 1 file changed, 122 insertions(+)

diff --git a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
index 91d62b0..e44aa1c 100644
--- a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
+++ b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
@@ -75,6 +75,10 @@ public:
 public slots:
     void init();
     void cleanup();
+
+    void initTestCase();
+    void cleanupTestCase();
+
 private slots:
     void construction();
     void fileTemplate();
@@ -97,9 +101,24 @@ private slots:
     void setTemplateAfterOpen();
     void autoRemoveAfterFailedRename();
 
+    void QTBUG_4796_data();
+    void QTBUG_4796();
+
 public:
 };
 
+void tst_QTemporaryFile::initTestCase()
+{
+    // For QTBUG_4796
+    QVERIFY(QDir("test-XXXXXX").exists() || QDir().mkdir("test-XXXXXX"));
+}
+
+void tst_QTemporaryFile::cleanupTestCase()
+{
+    // From QTBUG_4796
+    QVERIFY(QDir().rmdir("test-XXXXXX"));
+}
+
 void tst_QTemporaryFile::construction()
 {
     QTemporaryFile file(0);
@@ -591,5 +610,108 @@ void tst_QTemporaryFile::autoRemoveAfterFailedRename()
     cleaner.reset();
 }
 
+void tst_QTemporaryFile::QTBUG_4796_data()
+{
+    QTest::addColumn<QString>("prefix");
+    QTest::addColumn<QString>("suffix");
+    QTest::addColumn<bool>("openResult");
+
+    QString unicode = QString::fromUtf8("\xc3\xa5\xc3\xa6\xc3\xb8");
+
+    QTest::newRow("<empty>") << QString() << QString() << true;
+    QTest::newRow("blaXXXXXX") << QString("bla") << QString() << true;
+    QTest::newRow("XXXXXXbla") << QString() << QString("bla") << true;
+    QTest::newRow("does-not-exist/qt_temp.XXXXXX") << QString("does-not-exist/qt_temp") << QString() << false;
+    QTest::newRow("XXXXXX<unicode>") << QString() << unicode << true;
+    QTest::newRow("<unicode>XXXXXX") << unicode << QString() << true;
+    QTest::newRow("<unicode>XXXXXX<unicode>") << unicode << unicode << true;
+}
+
+void tst_QTemporaryFile::QTBUG_4796()
+{
+    QVERIFY(QDir("test-XXXXXX").exists());
+
+    struct CleanOnReturn
+    {
+        ~CleanOnReturn()
+        {
+            Q_FOREACH(QString tempName, tempNames)
+                QFile::remove(tempName);
+        }
+
+        void reset()
+        {
+            tempNames.clear();
+        }
+
+        QStringList tempNames;
+    };
+
+    CleanOnReturn cleaner;
+
+    QFETCH(QString, prefix);
+    QFETCH(QString, suffix);
+    QFETCH(bool, openResult);
+
+    {
+        QString fileTemplate1 = prefix + QString("XX") + suffix;
+        QString fileTemplate2 = prefix + QString("XXXX") + suffix;
+        QString fileTemplate3 = prefix + QString("XXXXXX") + suffix;
+        QString fileTemplate4 = prefix + QString("XXXXXXXX") + suffix;
+
+        QTemporaryFile file1(fileTemplate1);
+        QTemporaryFile file2(fileTemplate2);
+        QTemporaryFile file3(fileTemplate3);
+        QTemporaryFile file4(fileTemplate4);
+        QTemporaryFile file5("test-XXXXXX/" + fileTemplate1);
+        QTemporaryFile file6("test-XXXXXX/" + fileTemplate3);
+
+        QCOMPARE(file1.open(), openResult);
+        QCOMPARE(file2.open(), openResult);
+        QCOMPARE(file3.open(), openResult);
+        QCOMPARE(file4.open(), openResult);
+        QCOMPARE(file5.open(), openResult);
+        QCOMPARE(file6.open(), openResult);
+
+        QCOMPARE(file1.exists(), openResult);
+        QCOMPARE(file2.exists(), openResult);
+        QCOMPARE(file3.exists(), openResult);
+        QCOMPARE(file4.exists(), openResult);
+        QCOMPARE(file5.exists(), openResult);
+        QCOMPARE(file6.exists(), openResult);
+
+        // make sure the file exists under the *correct* name
+        if (openResult) {
+            cleaner.tempNames << file1.fileName()
+                << file2.fileName()
+                << file3.fileName()
+                << file4.fileName()
+                << file5.fileName()
+                << file6.fileName();
+
+            QVERIFY(file1.fileName().startsWith(fileTemplate1 + QLatin1Char('.')));
+            QVERIFY(file2.fileName().startsWith(fileTemplate2 + QLatin1Char('.')));
+            QVERIFY(file5.fileName().startsWith("test-XXXXXX/" + fileTemplate1 + QLatin1Char('.')));
+            QVERIFY(file6.fileName().startsWith("test-XXXXXX/" + prefix));
+
+            if (!prefix.isEmpty()) {
+                QVERIFY(file3.fileName().startsWith(prefix));
+                QVERIFY(file4.fileName().startsWith(prefix));
+            }
+
+            if (!suffix.isEmpty()) {
+                QVERIFY(file3.fileName().endsWith(suffix));
+                QVERIFY(file4.fileName().endsWith(suffix));
+                QVERIFY(file6.fileName().endsWith(suffix));
+            }
+        }
+    }
+
+    Q_FOREACH(QString const &tempName, cleaner.tempNames)
+        QVERIFY( !QFile::exists(tempName) );
+
+    cleaner.reset();
+}
+
 QTEST_MAIN(tst_QTemporaryFile)
 #include "tst_qtemporaryfile.moc"
-- 
cgit v0.12


From 892f78d6531ddfd698932e886ead4e66dbd4f0a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 30 Mar 2011 14:11:33 +0200
Subject: Extending fileTemplate autotest

... to also verify template prefix and corner cases with runs of less
than 6 Xs.

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp | 40 +++++++++++++++---------
 1 file changed, 26 insertions(+), 14 deletions(-)

diff --git a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
index e44aa1c..b6b0d3c 100644
--- a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
+++ b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp
@@ -163,26 +163,35 @@ void tst_QTemporaryFile::cleanup()
 void tst_QTemporaryFile::fileTemplate_data()
 {
     QTest::addColumn<QString>("constructorTemplate");
+    QTest::addColumn<QString>("prefix");
     QTest::addColumn<QString>("suffix");
     QTest::addColumn<QString>("fileTemplate");
 
-    QTest::newRow("constructor default")          << "" << "" << "";
-    QTest::newRow("constructor with xxx sufix") << "qt_XXXXXXxxx" << "xxx" << "";
-    QTest::newRow("constructor with xXx sufix") << "qt_XXXXXXxXx" << "xXx" << "";
-    QTest::newRow("constructor with no sufix") << "qt_XXXXXX" << "" << "";
-    QTest::newRow("constructor with >6 X's and xxx suffix") << "qt_XXXXXXXXXXxxx" << "xxx" << "";
-    QTest::newRow("constructor with >6 X's, no suffix") << "qt_XXXXXXXXXX" << "" << "";
-
-    QTest::newRow("set template, no suffix") << "" << "" << "foo";
-    QTest::newRow("set template, with lowercase XXXXXX") << "" << "xxxxxx" << "qt_XXXXXXxxxxxx";
-    QTest::newRow("set template, with xxx") << "" << ".xxx" << "qt_XXXXXX.xxx";
-    QTest::newRow("set template, with >6 X's") << "" << ".xxx" << "qt_XXXXXXXXXXXXXX.xxx";
-    QTest::newRow("set template, with >6 X's, no suffix") << "" << "" << "qt_XXXXXXXXXXXXXX";
+    QTest::newRow("constructor default") << "" << "." << "" << "";
+    QTest::newRow("constructor with xxx sufix") << "qt_XXXXXXxxx" << "qt_" << "xxx" << "";
+    QTest::newRow("constructor with xXx sufix") << "qt_XXXXXXxXx" << "qt_" << "xXx" << "";
+    QTest::newRow("constructor with no sufix") << "qt_XXXXXX" << "qt_" << "" << "";
+    QTest::newRow("constructor with >6 X's and xxx suffix") << "qt_XXXXXXXXXXxxx" << "qt_" << "xxx" << "";
+    QTest::newRow("constructor with >6 X's, no suffix") << "qt_XXXXXXXXXX" << "qt_" << "" << "";
+
+    QTest::newRow("constructor with XXXX suffix") << "qt_XXXXXX_XXXX" << "qt_" << "_XXXX" << "";
+    QTest::newRow("constructor with XXXXX suffix") << "qt_XXXXXX_XXXXX" << "qt_" << "_XXXXX" << "";
+    QTest::newRow("constructor with XXXX prefix") << "qt_XXXX" << "qt_XXXX." << "" << "";
+    QTest::newRow("constructor with XXXXX prefix") << "qt_XXXXX" << "qt_XXXXX." << "" << "";
+    QTest::newRow("constructor with XXXX  prefix and suffix") << "qt_XXXX_XXXXXX_XXXX" << "qt_XXXX_" << "_XXXX" << "";
+    QTest::newRow("constructor with XXXXX prefix and suffix") << "qt_XXXXX_XXXXXX_XXXXX" << "qt_XXXXX_" << "_XXXXX" << "";
+
+    QTest::newRow("set template, no suffix") << "" << "foo" << "" << "foo";
+    QTest::newRow("set template, with lowercase XXXXXX") << "" << "qt_" << "xxxxxx" << "qt_XXXXXXxxxxxx";
+    QTest::newRow("set template, with xxx") << "" << "qt_" << ".xxx" << "qt_XXXXXX.xxx";
+    QTest::newRow("set template, with >6 X's") << "" << "qt_" << ".xxx" << "qt_XXXXXXXXXXXXXX.xxx";
+    QTest::newRow("set template, with >6 X's, no suffix") << "" << "qt_" << "" << "qt_XXXXXXXXXXXXXX";
 }
 
 void tst_QTemporaryFile::fileTemplate()
 {
     QFETCH(QString, constructorTemplate);
+    QFETCH(QString, prefix);
     QFETCH(QString, suffix);
     QFETCH(QString, fileTemplate);
 
@@ -192,8 +201,11 @@ void tst_QTemporaryFile::fileTemplate()
 
     QCOMPARE(file.open(), true);
 
-    QCOMPARE(file.fileName().right(suffix.length()), suffix);
-    file.close();
+    if (prefix.length())
+        QCOMPARE(file.fileName().left(prefix.length()), prefix);
+
+    if (suffix.length())
+        QCOMPARE(file.fileName().right(suffix.length()), suffix);
 }
 
 
-- 
cgit v0.12


From ff3148f0516c4c10ced6535708341b2a10b4e616 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Fri, 25 Mar 2011 17:11:53 +0100
Subject: Remove duplicate #include

---
 src/corelib/io/qtemporaryfile.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 56ed746..1a07d08 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -49,7 +49,6 @@
 #include "private/qabstractfileengine_p.h"
 #include "private/qfsfileengine_p.h"
 
-#include <stdlib.h>
 #if !defined(Q_OS_WINCE)
 #  include <errno.h>
 #  include <sys/stat.h>
-- 
cgit v0.12


From 83bd00bb75fafa7fa6526e7ef2091227ee35fdc6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 10 Nov 2010 11:32:19 +0100
Subject: Removing dead code in QTemporaryFile

The option to create a directory is never used, so let's drop it. There
are bigger issues with this code.

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 1a07d08..835f24f 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -108,7 +108,7 @@ QT_BEGIN_NAMESPACE
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-static int _gettemp(char *path, int *doopen, int domkdir, int slen)
+static int _gettemp(char *path, int *doopen, int slen)
 {
     char *start, *trv, *suffp;
     QT_STATBUF sbuf;
@@ -119,11 +119,6 @@ static int _gettemp(char *path, int *doopen, int domkdir, int slen)
     pid_t pid;
 #endif
 
-    if (doopen && domkdir) {
-        errno = EINVAL;
-        return 0;
-    }
-
     for (trv = path; *trv; ++trv)
         ;
     trv -= slen;
@@ -166,7 +161,7 @@ static int _gettemp(char *path, int *doopen, int domkdir, int slen)
      * check the target directory; if you have six X's and it
      * doesn't exist this runs for a *very* long time.
      */
-    if (doopen || domkdir) {
+    if (doopen) {
         for (;; --trv) {
             if (trv <= path)
                 break;
@@ -234,15 +229,6 @@ static int _gettemp(char *path, int *doopen, int domkdir, int slen)
             }
             if (errno != EEXIST)
                 return 0;
-        } else if (domkdir) {
-#ifdef Q_OS_WIN
-            if (QT_MKDIR(path) == 0)
-#else
-            if (QT_MKDIR(path, 0700) == 0)
-#endif
-                return 1;
-            if (errno != EEXIST)
-                return 0;
         }
 #ifndef Q_OS_WIN
         else if (QT_LSTAT(path, &sbuf))
@@ -281,7 +267,7 @@ static int _gettemp(char *path, int *doopen, int domkdir, int slen)
 static int qt_mkstemps(char *path, int slen)
 {
     int fd = 0;
-    return (_gettemp(path, &fd, 0, slen) ? fd : -1);
+    return (_gettemp(path, &fd, slen) ? fd : -1);
 }
 #endif
 
@@ -391,7 +377,7 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
     setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(errno));
     return false;
 #else
-    if (!_gettemp(filename, 0, 0, suffixLength)) {
+    if (!_gettemp(filename, 0, suffixLength)) {
         delete [] filename;
         return false;
     }
-- 
cgit v0.12


From 1c09fc7013f0058ff96c52a39637d0167d084dce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Thu, 11 Nov 2010 15:22:49 +0100
Subject: QTemporaryFile: More dead code elimination

There are exactly 2 uses of the _gettemp function: one for windows
platforms, one for all others. Windows requests a file name, others
request a valid file descriptor for that file name.

Despite the 2 distinct use cases, the code was full of #ifdefs to keep
never used code paths compiling.

With this change the qt_mkstemp wrapper is eliminated, together with
dead code inside if (doopen) {} blocks on Windows platforms. The more
proper Q_OS_WIN macro is preferred to Q_WS_WIN.

_gettemp is also changed to return the valid file descriptor on
non-Windows platforms.

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 113 ++++++++++----------------------------
 1 file changed, 29 insertions(+), 84 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 835f24f..bb38906 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -65,9 +65,6 @@
 
 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
 # include <process.h>
-# if defined(_MSC_VER) && _MSC_VER >= 1400
-#  include <share.h>
-# endif
 #endif
 
 #if defined(Q_OS_WINCE)
@@ -108,7 +105,7 @@ QT_BEGIN_NAMESPACE
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-static int _gettemp(char *path, int *doopen, int slen)
+static int _gettemp(char *path, int slen)
 {
     char *start, *trv, *suffp;
     QT_STATBUF sbuf;
@@ -126,7 +123,7 @@ static int _gettemp(char *path, int *doopen, int slen)
     --trv;
     if (trv < path) {
         errno = EINVAL;
-        return 0;
+        return -1;
     }
 #if defined(Q_OS_WIN) && defined(_MSC_VER) && _MSC_VER >= 1400
     pid = _getpid();
@@ -157,82 +154,38 @@ static int _gettemp(char *path, int *doopen, int slen)
     }
     start = trv + 1;
 
+#ifndef Q_OS_WIN
     /*
      * check the target directory; if you have six X's and it
      * doesn't exist this runs for a *very* long time.
      */
-    if (doopen) {
-        for (;; --trv) {
-            if (trv <= path)
-                break;
-            if (*trv == '/') {
-                *trv = '\0';
-#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE)
-                if (trv - path == 2 && path[1] == ':') {
-                    // Special case for Windows drives
-                    // (e.g., "C:" => "C:\").
-                    // ### Better to use a Windows
-                    // call for this.
-                    char drive[] = "c:\\";
-                    drive[0] = path[0];
-                    rval = QT_STAT(drive, &sbuf);
-                } else
-#endif
-                    rval = QT_STAT(path, &sbuf);
-                *trv = '/';
-                if (rval != 0)
-                    return 0;
-                if (!S_ISDIR(sbuf.st_mode)) {
-                    errno = ENOTDIR;
-                    return 0;
-                }
-                break;
+    for (;; --trv) {
+        if (trv <= path)
+            break;
+        if (*trv == '/') {
+            *trv = '\0';
+            rval = QT_STAT(path, &sbuf);
+            *trv = '/';
+            if (rval != 0)
+                return -1;
+            if (!S_ISDIR(sbuf.st_mode)) {
+                errno = ENOTDIR;
+                return -1;
             }
+            break;
         }
     }
+#endif
 
     for (;;) {
-        if (doopen) {
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && defined(_MSC_VER) && _MSC_VER >= 1400
-            if (_sopen_s(doopen, path, QT_OPEN_CREAT|O_EXCL|QT_OPEN_RDWR|QT_OPEN_BINARY
-#  ifdef QT_LARGEFILE_SUPPORT
-                                       |QT_OPEN_LARGEFILE
-#  endif
-                         , _SH_DENYNO, _S_IREAD | _S_IWRITE)== 0)
-#else // WIN && !CE
-#  if defined(Q_OS_WINCE)
-            QString targetPath;
-            if (QDir::isAbsolutePath(QString::fromLatin1(path)))
-                targetPath = QLatin1String(path);
-            else
-                targetPath = QDir::currentPath().append(QLatin1Char('/')) + QLatin1String(path);
-
-            if ((*doopen =
-                QT_OPEN(targetPath.toLocal8Bit(), O_CREAT|O_EXCL|O_RDWR
-#  else // CE
-            // this is Unix or older MSVC
-            if ((*doopen =
-                QT_OPEN(path, QT_OPEN_CREAT|O_EXCL|QT_OPEN_RDWR
-#  endif
-#  ifdef QT_LARGEFILE_SUPPORT
-                           |QT_OPEN_LARGEFILE
-#  endif
-#  if defined(Q_OS_WINCE)
-                           |_O_BINARY
-#  elif defined(Q_OS_WIN)
-                           |O_BINARY
-#  endif
-                     , 0600)) >= 0)
-#endif // WIN && !CE
-            {
-                return 1;
-            }
+#ifndef Q_OS_WIN
+        {
+            int fd = QT_OPEN(path, QT_OPEN_CREAT | O_EXCL | QT_OPEN_RDWR | QT_OPEN_LARGEFILE, 0600);
+            if (fd != -1)
+                return fd;
             if (errno != EEXIST)
-                return 0;
+                return -1;
         }
-#ifndef Q_OS_WIN
-        else if (QT_LSTAT(path, &sbuf))
-            return (errno == ENOENT) ? 1 : 0;
 #else
         if (!QFileInfo(QLatin1String(path)).exists())
             return 1;
@@ -241,10 +194,10 @@ static int _gettemp(char *path, int *doopen, int slen)
         /* tricky little algorwwithm for backward compatibility */
         for (trv = start;;) {
             if (!*trv)
-                return 0;
+                return -1;
             if (*trv == 'Z') {
                 if (trv == suffp)
-                    return 0;
+                    return -1;
                 *trv++ = 'a';
             } else {
                 if (isdigit(*trv))
@@ -253,7 +206,7 @@ static int _gettemp(char *path, int *doopen, int slen)
                     *trv = 'A';
                 else {
                     if (trv == suffp)
-                        return 0;
+                        return -1;
                     ++*trv;
                 }
                 break;
@@ -263,14 +216,6 @@ static int _gettemp(char *path, int *doopen, int slen)
     /*NOTREACHED*/
 }
 
-#ifndef Q_WS_WIN
-static int qt_mkstemps(char *path, int slen)
-{
-    int fd = 0;
-    return (_gettemp(path, &fd, slen) ? fd : -1);
-}
-#endif
-
 //************* QTemporaryFileEngine
 class QTemporaryFileEngine : public QFSFileEngine
 {
@@ -354,8 +299,8 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
     int suffixLength = qfilename.length() - (qfilename.lastIndexOf(QLatin1String("XXXXXX"), -1, Qt::CaseSensitive) + 6);
     char *filename = qstrdup(qfilename.toLocal8Bit());
 
-#ifndef Q_WS_WIN
-    int fd = qt_mkstemps(filename, suffixLength);
+#ifndef Q_OS_WIN
+    int fd = _gettemp(filename, suffixLength);
     if (fd != -1) {
         // First open the fd as an external file descriptor to
         // initialize the engine properly.
@@ -377,7 +322,7 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
     setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(errno));
     return false;
 #else
-    if (!_gettemp(filename, 0, suffixLength)) {
+    if (_gettemp(filename, suffixLength) == -1) {
         delete [] filename;
         return false;
     }
-- 
cgit v0.12


From 2c3d675b97c52ad925891de16d2ea9dcfa9fae4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Fri, 25 Mar 2011 18:13:04 +0100
Subject: Don't pre-check if directory exists as it's unnecessary

On Posix platforms, when attempting to atomically create file and obtain
descriptor, we only continue if we get an EEXIST error. If the path
points to a non-existing directory, we should get ENOENT and will fail
as well.

On Windows, the check was already ignored. We would detect the file does
not exist, attempt to obtain a handle upon return to
QTemporaryFileEngine::open and fail there without running "for a *very*
long time".

Checking if the directory exists beforehand is not only unnecessary it
also constitutes a race condition. Trusting the result of this check is
dangerous and doubly useless.

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 35 -----------------------------------
 1 file changed, 35 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index bb38906..a9bed8b 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -51,8 +51,6 @@
 
 #if !defined(Q_OS_WINCE)
 #  include <errno.h>
-#  include <sys/stat.h>
-#  include <sys/types.h>
 #endif
 
 #include <stdlib.h>
@@ -67,10 +65,6 @@
 # include <process.h>
 #endif
 
-#if defined(Q_OS_WINCE)
-#  include <types.h>
-#endif
-
 #if defined(Q_OS_VXWORKS)
 #  include <taskLib.h>
 #endif
@@ -108,8 +102,6 @@ QT_BEGIN_NAMESPACE
 static int _gettemp(char *path, int slen)
 {
     char *start, *trv, *suffp;
-    QT_STATBUF sbuf;
-    int rval;
 #if defined(Q_OS_WIN)
     int pid;
 #else
@@ -137,10 +129,6 @@ static int _gettemp(char *path, int slen)
         pid /= 10;
     }
 
-#ifndef S_ISDIR
-#  define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-#endif
-
     while (trv >= path && *trv == 'X') {
         char c;
 
@@ -154,29 +142,6 @@ static int _gettemp(char *path, int slen)
     }
     start = trv + 1;
 
-#ifndef Q_OS_WIN
-    /*
-     * check the target directory; if you have six X's and it
-     * doesn't exist this runs for a *very* long time.
-     */
-    for (;; --trv) {
-        if (trv <= path)
-            break;
-        if (*trv == '/') {
-            *trv = '\0';
-            rval = QT_STAT(path, &sbuf);
-            *trv = '/';
-            if (rval != 0)
-                return -1;
-            if (!S_ISDIR(sbuf.st_mode)) {
-                errno = ENOTDIR;
-                return -1;
-            }
-            break;
-        }
-    }
-#endif
-
     for (;;) {
 #ifndef Q_OS_WIN
         {
-- 
cgit v0.12


From 8f5dbf0ace53daf0b2b4d48f2c5151000f0d5720 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Mon, 28 Mar 2011 13:42:58 +0200
Subject: Adding comments; variable scoping

There should be no semantic differences, otherwise.

Reviewed-by: Harald Fernengel
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 52 ++++++++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 22 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index a9bed8b..939ea34 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -102,11 +102,6 @@ QT_BEGIN_NAMESPACE
 static int _gettemp(char *path, int slen)
 {
     char *start, *trv, *suffp;
-#if defined(Q_OS_WIN)
-    int pid;
-#else
-    pid_t pid;
-#endif
 
     for (trv = path; *trv; ++trv)
         ;
@@ -117,32 +112,43 @@ static int _gettemp(char *path, int slen)
         errno = EINVAL;
         return -1;
     }
+
+    // Initialize placeholder with random chars + PID.
+    {
+#if defined(Q_OS_WIN)
+        int pid;
+#else
+        pid_t pid;
+#endif
+
 #if defined(Q_OS_WIN) && defined(_MSC_VER) && _MSC_VER >= 1400
-    pid = _getpid();
+        pid = _getpid();
 #elif defined(Q_OS_VXWORKS)
-    pid = (pid_t) taskIdCurrent;
+        pid = (pid_t) taskIdCurrent;
 #else
-    pid = getpid();
+        pid = getpid();
 #endif
-    while (trv >= path && *trv == 'X' && pid != 0) {
-        *trv-- = (pid % 10) + '0';
-        pid /= 10;
-    }
+        while (trv >= path && *trv == 'X' && pid != 0) {
+            *trv-- = (pid % 10) + '0';
+            pid /= 10;
+        }
 
-    while (trv >= path && *trv == 'X') {
-        char c;
+        while (trv >= path && *trv == 'X') {
+            char c;
 
-        // CHANGE arc4random() -> random()
-        pid = (qrand() & 0xffff) % (26+26);
-        if (pid < 26)
-            c = pid + 'A';
-        else
-            c = (pid - 26) + 'a';
-        *trv-- = c;
+            // CHANGE arc4random() -> random()
+            int pid = (qrand() & 0xffff) % (26+26);
+            if (pid < 26)
+                c = pid + 'A';
+            else
+                c = (pid - 26) + 'a';
+            *trv-- = c;
+        }
+        start = trv + 1;
     }
-    start = trv + 1;
 
     for (;;) {
+        // Atomically create file and obtain handle
 #ifndef Q_OS_WIN
         {
             int fd = QT_OPEN(path, QT_OPEN_CREAT | O_EXCL | QT_OPEN_RDWR | QT_OPEN_LARGEFILE, 0600);
@@ -158,6 +164,8 @@ static int _gettemp(char *path, int slen)
 
         /* tricky little algorwwithm for backward compatibility */
         for (trv = start;;) {
+            // Character progression: [0-9] => 'a' ... 'z' => 'A' .. 'Z'
+            // String progression: "ZZaiC" => "aabiC"
             if (!*trv)
                 return -1;
             if (*trv == 'Z') {
-- 
cgit v0.12


From 1d7fa993e096effb08f0f67510f096a9c8765b1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Fri, 25 Mar 2011 16:41:52 +0100
Subject: Remove duplication with QCoreApplication::applicationId

The duplication was there to allow qmake and other tools to compile
without a full build of QtCore. Cleaning up this code justifies losing
the benefit of PID-tagged temporary files in those tools.

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 24 +++++-------------------
 1 file changed, 5 insertions(+), 19 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 939ea34..fe94964 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -61,12 +61,8 @@
 # include "private/qcore_unix_p.h"      // overrides QT_OPEN
 #endif
 
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-# include <process.h>
-#endif
-
-#if defined(Q_OS_VXWORKS)
-#  include <taskLib.h>
+#if defined(QT_BUILD_CORE_LIB)
+#include "qcoreapplication.h"
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -115,23 +111,13 @@ static int _gettemp(char *path, int slen)
 
     // Initialize placeholder with random chars + PID.
     {
-#if defined(Q_OS_WIN)
-        int pid;
-#else
-        pid_t pid;
-#endif
-
-#if defined(Q_OS_WIN) && defined(_MSC_VER) && _MSC_VER >= 1400
-        pid = _getpid();
-#elif defined(Q_OS_VXWORKS)
-        pid = (pid_t) taskIdCurrent;
-#else
-        pid = getpid();
-#endif
+#if defined(QT_BUILD_CORE_LIB)
+        qint64 pid = QCoreApplication::applicationPid();
         while (trv >= path && *trv == 'X' && pid != 0) {
             *trv-- = (pid % 10) + '0';
             pid /= 10;
         }
+#endif
 
         while (trv >= path && *trv == 'X') {
             char c;
-- 
cgit v0.12


From e54f6f671011f39f30b8b585979353a58e46e6aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Mon, 28 Mar 2011 18:44:09 +0200
Subject: Split argument validation of _gettemp as separate function

This removes knowledge about the structure of the filename template from
the randomization process and is a pre-requisite to adding Unicode
support to the code.

Task-number: QTBUG-4796
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 76 ++++++++++++++++++++++++++-------------
 1 file changed, 51 insertions(+), 25 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index fe94964..f6e3426 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -95,9 +95,12 @@ QT_BEGIN_NAMESPACE
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+static int createFileFromTemplate(char *const path,
+        char *const placeholderStart, char *const placeholderEnd);
+
 static int _gettemp(char *path, int slen)
 {
-    char *start, *trv, *suffp;
+    char *trv, *suffp;
 
     for (trv = path; *trv; ++trv)
         ;
@@ -109,28 +112,51 @@ static int _gettemp(char *path, int slen)
         return -1;
     }
 
+    while (trv >= path && *trv == 'X')
+        --trv;
+
+    char *const placeholderStart = trv + 1;
+    char *const placeholderEnd = suffp;
+
+    return createFileFromTemplate(path, placeholderStart, placeholderEnd);
+}
+
+/*!
+    \internal
+
+    Generates a unique file path and returns a native handle to the open file.
+    \a path is used as a template when generating unique paths,
+    \a placeholderStart and \a placeholderEnd delimit the sub-string that will
+    be randomized.
+
+    Returns an open handle to the newly created file if successful, an invalid
+    handle otherwise. In both cases, the string in \a path will be changed and
+    contain the generated path name.
+*/
+static int createFileFromTemplate(char *const path,
+        char *const placeholderStart, char *const placeholderEnd)
+{
+    Q_ASSERT(placeholderEnd > placeholderStart);
+
     // Initialize placeholder with random chars + PID.
     {
+        char *rIter = placeholderEnd;
+
 #if defined(QT_BUILD_CORE_LIB)
         qint64 pid = QCoreApplication::applicationPid();
-        while (trv >= path && *trv == 'X' && pid != 0) {
-            *trv-- = (pid % 10) + '0';
+        do {
+            *--rIter = (pid % 10) + '0';
             pid /= 10;
-        }
+        } while (rIter != placeholderStart && pid != 0);
 #endif
 
-        while (trv >= path && *trv == 'X') {
-            char c;
-
-            // CHANGE arc4random() -> random()
-            int pid = (qrand() & 0xffff) % (26+26);
-            if (pid < 26)
-                c = pid + 'A';
+        while (rIter != placeholderStart) {
+            char ch = char((qrand() & 0xffff) % (26 + 26));
+            if (ch < 26)
+                *--rIter = ch + 'A';
             else
-                c = (pid - 26) + 'a';
-            *trv-- = c;
+                *--rIter = ch - 26 + 'a';
         }
-        start = trv + 1;
     }
 
     for (;;) {
@@ -149,24 +175,24 @@ static int _gettemp(char *path, int slen)
 #endif
 
         /* tricky little algorwwithm for backward compatibility */
-        for (trv = start;;) {
+        for (char *iter = placeholderStart;;) {
             // Character progression: [0-9] => 'a' ... 'z' => 'A' .. 'Z'
             // String progression: "ZZaiC" => "aabiC"
-            if (!*trv)
+            if (!*iter)
                 return -1;
-            if (*trv == 'Z') {
-                if (trv == suffp)
+            if (*iter == 'Z') {
+                if (iter == placeholderEnd)
                     return -1;
-                *trv++ = 'a';
+                *iter++ = 'a';
             } else {
-                if (isdigit(*trv))
-                    *trv = 'a';
-                else if (*trv == 'z') /* inc from z to A */
-                    *trv = 'A';
+                if (isdigit(*iter))
+                    *iter = 'a';
+                else if (*iter == 'z') /* inc from z to A */
+                    *iter = 'A';
                 else {
-                    if (trv == suffp)
+                    if (iter == placeholderEnd)
                         return -1;
-                    ++*trv;
+                    ++*iter;
                 }
                 break;
             }
-- 
cgit v0.12


From 9f806138930391b2dcb1d604ae39345a0bc7171a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Tue, 29 Mar 2011 17:55:04 +0200
Subject: Don't overrun XXXXXX placeholder when generating next filename

Checking of boundary condition needs to happen whenever there is a
change. Checking anywhere else is useless.

This fixes an issue where we would overrun the placeholder if there was
a 'Z' next to the placeholder string.

Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index f6e3426..4ff0ee3 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -181,17 +181,15 @@ static int createFileFromTemplate(char *const path,
             if (!*iter)
                 return -1;
             if (*iter == 'Z') {
+                *iter++ = 'a';
                 if (iter == placeholderEnd)
                     return -1;
-                *iter++ = 'a';
             } else {
                 if (isdigit(*iter))
                     *iter = 'a';
                 else if (*iter == 'z') /* inc from z to A */
                     *iter = 'A';
                 else {
-                    if (iter == placeholderEnd)
-                        return -1;
                     ++*iter;
                 }
                 break;
-- 
cgit v0.12


From 1155d29e29b570f8b89053eccc08bd19256eeb10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 30 Mar 2011 16:59:11 +0200
Subject: Check for null no longer needed

With proper checks for boundary conditions, we no longer need to protect
against reaching the terminating null character.

Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 4ff0ee3..1d9466d 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -178,8 +178,6 @@ static int createFileFromTemplate(char *const path,
         for (char *iter = placeholderStart;;) {
             // Character progression: [0-9] => 'a' ... 'z' => 'A' .. 'Z'
             // String progression: "ZZaiC" => "aabiC"
-            if (!*iter)
-                return -1;
             if (*iter == 'Z') {
                 *iter++ = 'a';
                 if (iter == placeholderEnd)
-- 
cgit v0.12


From 3d041873576e05bf19923f643878ac4d9ca33057 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 30 Mar 2011 13:45:40 +0200
Subject: Prefer use of QByteArray to qstrdup and manual memory management

Reviewed-by: Olivier Goffart
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 1d9466d..92065cb 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -278,10 +278,11 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
         qfilename += QLatin1String(".XXXXXX");
 
     int suffixLength = qfilename.length() - (qfilename.lastIndexOf(QLatin1String("XXXXXX"), -1, Qt::CaseSensitive) + 6);
-    char *filename = qstrdup(qfilename.toLocal8Bit());
+    QByteArray filename = qfilename.toLocal8Bit();
+    char *path = filename.data();
 
 #ifndef Q_OS_WIN
-    int fd = _gettemp(filename, suffixLength);
+    int fd = _gettemp(path, suffixLength);
     if (fd != -1) {
         // First open the fd as an external file descriptor to
         // initialize the engine properly.
@@ -291,26 +292,22 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
             d->closeFileHandle = true;
 
             // Restore the file names (open() resets them).
-            d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(filename)); //note that filename is NOT a native path
+            d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(path, filename.length())); //note that filename is NOT a native path
             filePathIsTemplate = false;
-            delete [] filename;
             return true;
         }
 
         QT_CLOSE(fd);
     }
-    delete [] filename;
     setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(errno));
     return false;
 #else
-    if (_gettemp(filename, suffixLength) == -1) {
-        delete [] filename;
+    if (_gettemp(path, suffixLength) == -1) {
         return false;
     }
 
     QString template_ = d->fileEntry.filePath();
-    d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(filename));
-    delete [] filename;
+    d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(path, filename.length()));
 
     if (QFSFileEngine::open(openMode)) {
         filePathIsTemplate = false;
-- 
cgit v0.12


From c728783dc20cc2d4667affdefa19a4162a2ec9ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 30 Mar 2011 14:27:00 +0200
Subject: QTemporaryFile: Locate placeholder before re-encoding

Previously, the placeholder was identified in unicode-based QString, and
the offset was assumed to be correct after conversion to the local 8-bit
encoding. This assumption is obviously wrong for variable-sized
encoding, such as utf-8.

With this change, the placeholder is still identified in the original
QString, but conversion to 8-bit encoding is done in a step-wise fashion
and offsets recomputed. This allows us to drop the intermediary argument
verification in _gettemp.

Task-number: QTBUG-4796
Reviewed-by: Robin Burchell
---
 src/corelib/io/qtemporaryfile.cpp | 71 ++++++++++++++++++++++-----------------
 1 file changed, 40 insertions(+), 31 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 92065cb..34c01a6 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -95,31 +95,6 @@ QT_BEGIN_NAMESPACE
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-static int createFileFromTemplate(char *const path,
-        char *const placeholderStart, char *const placeholderEnd);
-
-static int _gettemp(char *path, int slen)
-{
-    char *trv, *suffp;
-
-    for (trv = path; *trv; ++trv)
-        ;
-    trv -= slen;
-    suffp = trv;
-    --trv;
-    if (trv < path) {
-        errno = EINVAL;
-        return -1;
-    }
-
-    while (trv >= path && *trv == 'X')
-        --trv;
-
-    char *const placeholderStart = trv + 1;
-    char *const placeholderEnd = suffp;
-
-    return createFileFromTemplate(path, placeholderStart, placeholderEnd);
-}
 
 /*!
     \internal
@@ -274,15 +249,49 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
         return QFSFileEngine::open(openMode);
 
     QString qfilename = d->fileEntry.filePath();
-    if(!qfilename.contains(QLatin1String("XXXXXX")))
-        qfilename += QLatin1String(".XXXXXX");
 
-    int suffixLength = qfilename.length() - (qfilename.lastIndexOf(QLatin1String("XXXXXX"), -1, Qt::CaseSensitive) + 6);
-    QByteArray filename = qfilename.toLocal8Bit();
+    // Find placeholder string.
+    size_t phPos = size_t(qfilename.length());
+    size_t phLength = 0;
+
+    while (phPos != 0) {
+        --phPos;
+
+        if (qfilename[phPos] == QLatin1Char('X')) {
+            ++phLength;
+            continue;
+        }
+
+        if (qfilename[phPos] == QLatin1Char('/')
+                || phLength >= 6) {
+            ++phPos;
+            break;
+        }
+
+        phLength = 0;
+    }
+
+    QStringRef prefix, suffix;
+    if (phLength < 6) {
+        qfilename += QLatin1Char('.');
+        prefix = QStringRef(&qfilename);
+        phLength = 6;
+    } else {
+        prefix = qfilename.leftRef(phPos);
+        suffix = qfilename.midRef(phPos + phLength);
+    }
+
+    QByteArray filename = prefix.toLocal8Bit();
+    phPos = filename.length();
+    if (suffix.isEmpty())
+        filename.resize(phPos + phLength);
+    else
+        filename.insert(phPos + phLength, suffix.toLocal8Bit());
+
     char *path = filename.data();
 
 #ifndef Q_OS_WIN
-    int fd = _gettemp(path, suffixLength);
+    int fd = createFileFromTemplate(path, path + phPos, path + phPos + phLength);
     if (fd != -1) {
         // First open the fd as an external file descriptor to
         // initialize the engine properly.
@@ -302,7 +311,7 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
     setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, qt_error_string(errno));
     return false;
 #else
-    if (_gettemp(path, suffixLength) == -1) {
+    if (createFileFromTemplate(path, path + phPos, path + phPos + phLength) == -1) {
         return false;
     }
 
-- 
cgit v0.12


From 939d2e725c2c52f33097fcc50664c46d40c05b04 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Mon, 4 Apr 2011 12:31:37 +0200
Subject: HTTP backend: return earlier when resource loaded from cache

no need to add headers to the request if it is not sent but loaded from
cache anyway.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccesshttpbackend.cpp | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index e75347f..fd20b2a 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -479,6 +479,13 @@ void QNetworkAccessHttpBackend::postRequest()
         break;                  // can't happen
     }
 
+    if (loadedFromCache) {
+        // commented this out since it will be called later anyway
+        // by copyFinished()
+        //QNetworkAccessBackend::finished();
+        return;    // no need to send the request! :)
+    }
+
     QList<QByteArray> headers = request().rawHeaderList();
     if (resumeOffset != 0) {
         if (headers.contains("Range")) {
@@ -506,13 +513,6 @@ void QNetworkAccessHttpBackend::postRequest()
     foreach (const QByteArray &header, headers)
         httpRequest.setHeaderField(header, request().rawHeader(header));
 
-    if (loadedFromCache) {
-        // commented this out since it will be called later anyway
-        // by copyFinished()
-        //QNetworkAccessBackend::finished();
-        return;    // no need to send the request! :)
-    }
-
     if (request().attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool() == true)
         httpRequest.setPipeliningAllowed(true);
 
-- 
cgit v0.12


From 12a0099dfb8242d0296ccef1a78d75327ff8fe03 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Mon, 4 Apr 2011 13:28:20 +0200
Subject: HTTP backend: make cache validation method return bool

... rather than storing it in a bool reference.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccesshttpbackend.cpp | 24 +++++++++++-------------
 src/network/access/qnetworkaccesshttpbackend_p.h |  2 +-
 2 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index fd20b2a..84a899e 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -219,7 +219,7 @@ QNetworkAccessHttpBackend::~QNetworkAccessHttpBackend()
     2) If we have a cache entry for this url populate headers so the server can return 304
     3) Calculate if response_is_fresh and if so send the cache and set loadedFromCache to true
  */
-void QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest, bool &loadedFromCache)
+bool QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest)
 {
     QNetworkRequest::CacheLoadControl CacheLoadControlAttribute =
         (QNetworkRequest::CacheLoadControl)request().attribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork).toInt();
@@ -230,24 +230,24 @@ void QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest,
             httpRequest.setHeaderField("Cache-Control", "no-cache");
             httpRequest.setHeaderField("Pragma", "no-cache");
         }
-        return;
+        return false;
     }
 
     // The disk cache API does not currently support partial content retrieval.
     // That is why we don't use the disk cache for any such requests.
     if (request().hasRawHeader("Range"))
-        return;
+        return false;
 
     QAbstractNetworkCache *nc = networkCache();
     if (!nc)
-        return;                 // no local cache
+        return false;                 // no local cache
 
     QNetworkCacheMetaData metaData = nc->metaData(url());
     if (!metaData.isValid())
-        return;                 // not in cache
+        return false;                 // not in cache
 
     if (!metaData.saveToDisk())
-        return;
+        return false;
 
     QNetworkHeadersPrivate cacheHeaders;
     QNetworkHeadersPrivate::RawHeadersList::ConstIterator it;
@@ -266,7 +266,7 @@ void QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest,
         if (it != cacheHeaders.rawHeaders.constEnd()) {
             QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
             if (cacheControl.contains("must-revalidate"))
-                return;
+                return false;
         }
     }
 
@@ -338,14 +338,12 @@ void QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest,
 #endif
 
     if (!response_is_fresh)
-        return;
+        return false;
 
-    loadedFromCache = true;
 #if defined(QNETWORKACCESSHTTPBACKEND_DEBUG)
     qDebug() << "response_is_fresh" << CacheLoadControlAttribute;
 #endif
-    if (!sendCacheContents(metaData))
-        loadedFromCache = false;
+    return sendCacheContents(metaData);
 }
 
 static QHttpNetworkRequest::Priority convert(const QNetworkRequest::Priority& prio)
@@ -442,12 +440,12 @@ void QNetworkAccessHttpBackend::postRequest()
     switch (operation()) {
     case QNetworkAccessManager::GetOperation:
         httpRequest.setOperation(QHttpNetworkRequest::Get);
-        validateCache(httpRequest, loadedFromCache);
+        loadedFromCache = validateCache(httpRequest);
         break;
 
     case QNetworkAccessManager::HeadOperation:
         httpRequest.setOperation(QHttpNetworkRequest::Head);
-        validateCache(httpRequest, loadedFromCache);
+        loadedFromCache = validateCache(httpRequest);
         break;
 
     case QNetworkAccessManager::PostOperation:
diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h
index 712dd2f..5e143eb 100644
--- a/src/network/access/qnetworkaccesshttpbackend_p.h
+++ b/src/network/access/qnetworkaccesshttpbackend_p.h
@@ -148,7 +148,7 @@ private:
 
     quint64 resumeOffset;
 
-    void validateCache(QHttpNetworkRequest &httpRequest, bool &loadedFromCache);
+    bool validateCache(QHttpNetworkRequest &httpRequest);
     void invalidateCache();
     void postRequest();
     void readFromHttp();
-- 
cgit v0.12


From 153bf90ea0fc5f58c27c82e13dc1c4d73b028f5e Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Mon, 4 Apr 2011 13:37:30 +0200
Subject: HTTP backend: rename method that loads resource from cache

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccesshttpbackend.cpp | 6 +++---
 src/network/access/qnetworkaccesshttpbackend_p.h | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 84a899e..0438fb5 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -219,7 +219,7 @@ QNetworkAccessHttpBackend::~QNetworkAccessHttpBackend()
     2) If we have a cache entry for this url populate headers so the server can return 304
     3) Calculate if response_is_fresh and if so send the cache and set loadedFromCache to true
  */
-bool QNetworkAccessHttpBackend::validateCache(QHttpNetworkRequest &httpRequest)
+bool QNetworkAccessHttpBackend::loadFromCacheIfAllowed(QHttpNetworkRequest &httpRequest)
 {
     QNetworkRequest::CacheLoadControl CacheLoadControlAttribute =
         (QNetworkRequest::CacheLoadControl)request().attribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork).toInt();
@@ -440,12 +440,12 @@ void QNetworkAccessHttpBackend::postRequest()
     switch (operation()) {
     case QNetworkAccessManager::GetOperation:
         httpRequest.setOperation(QHttpNetworkRequest::Get);
-        loadedFromCache = validateCache(httpRequest);
+        loadedFromCache = loadFromCacheIfAllowed(httpRequest);
         break;
 
     case QNetworkAccessManager::HeadOperation:
         httpRequest.setOperation(QHttpNetworkRequest::Head);
-        loadedFromCache = validateCache(httpRequest);
+        loadedFromCache = loadFromCacheIfAllowed(httpRequest);
         break;
 
     case QNetworkAccessManager::PostOperation:
diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h
index 5e143eb..4778bd0 100644
--- a/src/network/access/qnetworkaccesshttpbackend_p.h
+++ b/src/network/access/qnetworkaccesshttpbackend_p.h
@@ -148,7 +148,7 @@ private:
 
     quint64 resumeOffset;
 
-    bool validateCache(QHttpNetworkRequest &httpRequest);
+    bool loadFromCacheIfAllowed(QHttpNetworkRequest &httpRequest);
     void invalidateCache();
     void postRequest();
     void readFromHttp();
-- 
cgit v0.12


From a715d1fe5e9a9781218701afe9c10f2ba54448ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 4 Apr 2011 15:33:02 +0200
Subject: Made Qt applications get the correct GLES2 include path.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Use the same as the one used when building QtOpenGL + examples/demos.

Reviewed-by: Jørgen Lind
---
 configure | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/configure b/configure
index 83c836c..167ae1b 100755
--- a/configure
+++ b/configure
@@ -8330,6 +8330,11 @@ if [ -n "$QT_CFLAGS_FPU" ]; then
     echo "MMP_RULES += \"ARMFPU $QT_CFLAGS_FPU\"" >> "$QTCONFIG.tmp"
 fi
 
+if [ -n "$QMAKE_INCDIR_OPENGL_ES2" ]; then
+    echo "\n#Qt opengl include path" >> "$QTCONFIG.tmp"
+    echo "QMAKE_INCDIR_OPENGL_ES2 = \"$QMAKE_INCDIR_OPENGL_ES2\"" >> "$QTCONFIG.tmp"
+fi
+
 # replace qconfig.pri if it differs from the newly created temp file
 if cmp -s "$QTCONFIG.tmp" "$QTCONFIG"; then
     rm -f "$QTCONFIG.tmp"
-- 
cgit v0.12


From 8a72b97df7cec679a82d6aa93307350fe03cc145 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Mon, 4 Apr 2011 14:25:28 +0300
Subject: Remove obsolete files from qt.iby

- qaudio.dll is no longer built separately, it is static part of
QtMultimedia.dll

- s60main resources are no longer needed or generated

- Webkit files are installed via separate IBY

Task-number: QT-4839
Reviewed-by: Guoqing Zhang
---
 config.profiles/symbian/qt.iby | 13 -------------
 src/s60installs/qt.iby         | 13 -------------
 2 files changed, 26 deletions(-)

diff --git a/config.profiles/symbian/qt.iby b/config.profiles/symbian/qt.iby
index 7431cfa..18b3940 100644
--- a/config.profiles/symbian/qt.iby
+++ b/config.profiles/symbian/qt.iby
@@ -15,7 +15,6 @@ file=ABI_DIR\BUILD_DIR\QtXml.dll             SHARED_LIB_DIR\QtXml.dll
 file=ABI_DIR\BUILD_DIR\QtNetwork.dll         SHARED_LIB_DIR\QtNetwork.dll
 file=ABI_DIR\BUILD_DIR\QtScript.dll          SHARED_LIB_DIR\QtScript.dll
 file=ABI_DIR\BUILD_DIR\QtTest.dll            SHARED_LIB_DIR\QtTest.dll
-file=ABI_DIR\BUILD_DIR\QtWebKit.dll          SHARED_LIB_DIR\QtWebKit.dll
 file=ABI_DIR\BUILD_DIR\phonon.dll            SHARED_LIB_DIR\phonon.dll
 file=ABI_DIR\BUILD_DIR\QtMultimedia.dll      SHARED_LIB_DIR\QtMultimedia.dll
 file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll     SHARED_LIB_DIR\QtXmlPatterns.dll
@@ -46,9 +45,6 @@ file=ABI_DIR\BUILD_DIR\qsvgicon.dll          SHARED_LIB_DIR\qsvgicon.dll
 file=ABI_DIR\BUILD_DIR\phonon_mmf.dll        SHARED_LIB_DIR\phonon_mmf.dll
 data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin
 
-// QtMultimedia audio backend
-file=ABI_DIR\BUILD_DIR\qaudio.dll            SHARED_LIB_DIR\qaudio.dll
-
 // graphicssystems
 file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll
 file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dll
@@ -62,8 +58,6 @@ file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll   SHARED_LIB_DIR\qts60plugin_5_0.dll
 
 file=ABI_DIR\BUILD_DIR\qtactilefeedback.dll   SHARED_LIB_DIR\qtactilefeedback.dll
 
-S60_APP_RESOURCE(s60main)
-
 // imageformats stubs
 data=\epoc32\data\z\resource\qt\plugins\imageformats\qgif.qtplugin         resource\qt\plugins\imageformats\qgif.qtplugin
 data=\epoc32\data\z\resource\qt\plugins\imageformats\qico.qtplugin         resource\qt\plugins\imageformats\qico.qtplugin
@@ -82,24 +76,18 @@ data=\epoc32\data\z\resource\qt\plugins\codecs\qtwcodecs.qtplugin          resou
 data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin      resource\qt\plugins\iconengines\qsvgicon.qtplugin
 
 // qml import plugins
-file=ABI_DIR\BUILD_DIR\qmlwebkitplugin.dll      SHARED_LIB_DIR\qmlwebkitplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlfolderlistmodelplugin.dll      SHARED_LIB_DIR\qmlfolderlistmodelplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlgesturesplugin.dll      SHARED_LIB_DIR\qmlgesturesplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlparticlesplugin.dll      SHARED_LIB_DIR\qmlparticlesplugin.dll
 
-data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin    resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin    resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin    resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin    resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin
 
-data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmldir    resource\qt\imports\QtWebKit\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmldir    resource\qt\imports\Qt\labs\folderlistmodel\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmldir    resource\qt\imports\Qt\labs\gestures\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmldir    resource\qt\imports\Qt\labs\particles\qmldir
 
-// QtMultimedia audio backend
-data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio\qaudio.qtplugin
-
 // graphicssystems
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin
@@ -112,7 +100,6 @@ data=\epoc32\data\z\resource\qt\plugins\feedback\qtactilefeedback.qtplugin
 
 // Stub sis file
 data=ZSYSTEM\install\qt_stub.sis    System\Install\qt_stub.sis
-data=ZSYSTEM\install\qtwebkit_stub.sis    System\Install\qtwebkit_stub.sis
 
 #endif // __QT_IBY__
 
diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby
index 4afbf05..3a094a3 100644
--- a/src/s60installs/qt.iby
+++ b/src/s60installs/qt.iby
@@ -15,7 +15,6 @@ file=ABI_DIR\BUILD_DIR\QtXml.dll             SHARED_LIB_DIR\QtXml.dll
 file=ABI_DIR\BUILD_DIR\QtNetwork.dll         SHARED_LIB_DIR\QtNetwork.dll
 file=ABI_DIR\BUILD_DIR\QtScript.dll          SHARED_LIB_DIR\QtScript.dll
 file=ABI_DIR\BUILD_DIR\QtTest.dll            SHARED_LIB_DIR\QtTest.dll
-file=ABI_DIR\BUILD_DIR\QtWebKit.dll          SHARED_LIB_DIR\QtWebKit.dll
 file=ABI_DIR\BUILD_DIR\phonon.dll            SHARED_LIB_DIR\phonon.dll
 file=ABI_DIR\BUILD_DIR\QtMultimedia.dll      SHARED_LIB_DIR\QtMultimedia.dll
 file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll     SHARED_LIB_DIR\QtXmlPatterns.dll
@@ -46,9 +45,6 @@ file=ABI_DIR\BUILD_DIR\qsvgicon.dll          SHARED_LIB_DIR\qsvgicon.dll
 //file=ABI_DIR\BUILD_DIR\phonon_mmf.dll        SHARED_LIB_DIR\phonon_mmf.dll
 //data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin
 
-// QtMultimedia audio backend
-file=ABI_DIR\BUILD_DIR\qaudio.dll            SHARED_LIB_DIR\qaudio.dll
-
 // graphicssystems
 file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll
 file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dll
@@ -60,8 +56,6 @@ file=ABI_DIR\BUILD_DIR\qsymbianbearer.dll    SHARED_LIB_DIR\qsymbianbearer.dll
 // so don't bother including those plugins
 file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll   SHARED_LIB_DIR\qts60plugin_5_0.dll
 
-S60_APP_RESOURCE(s60main)
-
 // imageformats stubs
 data=\epoc32\data\z\resource\qt\plugins\imageformats\qgif.qtplugin         resource\qt\plugins\imageformats\qgif.qtplugin
 data=\epoc32\data\z\resource\qt\plugins\imageformats\qico.qtplugin         resource\qt\plugins\imageformats\qico.qtplugin
@@ -80,24 +74,18 @@ data=\epoc32\data\z\resource\qt\plugins\codecs\qtwcodecs.qtplugin          resou
 data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin      resource\qt\plugins\iconengines\qsvgicon.qtplugin
 
 // qml import plugins
-file=ABI_DIR\BUILD_DIR\qmlwebkitplugin.dll      SHARED_LIB_DIR\qmlwebkitplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlfolderlistmodelplugin.dll      SHARED_LIB_DIR\qmlfolderlistmodelplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlgesturesplugin.dll      SHARED_LIB_DIR\qmlgesturesplugin.dll
 file=ABI_DIR\BUILD_DIR\qmlparticlesplugin.dll      SHARED_LIB_DIR\qmlparticlesplugin.dll
 
-data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin    resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin    resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin    resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin    resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin
 
-data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmldir    resource\qt\imports\QtWebKit\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmldir    resource\qt\imports\Qt\labs\folderlistmodel\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmldir    resource\qt\imports\Qt\labs\gestures\qmldir
 data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmldir    resource\qt\imports\Qt\labs\particles\qmldir
 
-// QtMultimedia audio backend
-data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio\qaudio.qtplugin
-
 // graphicssystems
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin
@@ -107,7 +95,6 @@ data=\epoc32\data\z\resource\qt\plugins\bearer\qsymbianbearer.qtplugin resource\
 
 // Stub sis file
 data=ZSYSTEM\install\qt_stub.sis    System\Install\qt_stub.sis
-data=ZSYSTEM\install\qtwebkit_stub.sis    System\Install\qtwebkit_stub.sis
 
 #endif // __QT_IBY__
 
-- 
cgit v0.12


From 66a7e4361f9f07962c7d22409aa6274da2dce9de Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 4 Apr 2011 12:32:24 +0200
Subject: QStringList: constructor for std::initializer_list

Reviewed-by: Joao
---
 src/corelib/tools/qstringlist.h            |  3 +++
 tests/auto/qstringlist/tst_qstringlist.cpp | 13 +++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/src/corelib/tools/qstringlist.h b/src/corelib/tools/qstringlist.h
index a211430..a0290bc 100644
--- a/src/corelib/tools/qstringlist.h
+++ b/src/corelib/tools/qstringlist.h
@@ -70,6 +70,9 @@ public:
     inline explicit QStringList(const QString &i) { append(i); }
     inline QStringList(const QStringList &l) : QList<QString>(l) { }
     inline QStringList(const QList<QString> &l) : QList<QString>(l) { }
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+    inline QStringList(std::initializer_list<QString> args) : QList(args) { }
+#endif
 
     inline void sort();
     inline int removeDuplicates();
diff --git a/tests/auto/qstringlist/tst_qstringlist.cpp b/tests/auto/qstringlist/tst_qstringlist.cpp
index 283c17f..d8db00a 100644
--- a/tests/auto/qstringlist/tst_qstringlist.cpp
+++ b/tests/auto/qstringlist/tst_qstringlist.cpp
@@ -78,6 +78,8 @@ private slots:
     void join() const;
     void join_data() const;
     void joinEmptiness() const;
+
+    void initializeList() const;
 };
 
 extern const char email[];
@@ -321,5 +323,16 @@ void tst_QStringList::joinEmptiness() const
     QVERIFY(string.isNull());
 }
 
+void tst_QStringList::initializeList() const
+{
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+    QStringList v1{QLatin1String("hello"),"world",QString::fromLatin1("plop")};
+    QCOMPARE(v1, (QStringList() << "hello" << "world" << "plop"));
+    QCOMPARE(v1, (QStringList{"hello","world","plop"}));
+#else
+    QSKIP("Require C++0x support, pass the right flag to the compiler", SkipAll);
+#endif
+}
+
 QTEST_APPLESS_MAIN(tst_QStringList)
 #include "tst_qstringlist.moc"
-- 
cgit v0.12


From a0cf0a18603d5c466747cd7b0657abdff5015b85 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 4 Apr 2011 15:14:57 +0200
Subject: Documentation for the initilize_list constructor

Reviewed-by: Joao
---
 src/corelib/tools/qlist.cpp       | 8 ++++++++
 src/corelib/tools/qstringlist.cpp | 9 +++++++++
 src/corelib/tools/qvector.cpp     | 9 +++++++++
 3 files changed, 26 insertions(+)

diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index 7bbdc16..1501daf 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -590,6 +590,14 @@ void **QListData::erase(void **xi)
     \sa operator=()
 */
 
+/*! \fn QList::QList(std::initializer_list<T> args)
+    \since 4.8
+
+    Construct a list from a std::initilizer_list.
+
+    This constructor is only enabled if the compiler supports C++0x
+*/
+
 /*! \fn QList::~QList()
 
     Destroys the list. References to the values in the list and all
diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp
index a560cca..21269a8 100644
--- a/src/corelib/tools/qstringlist.cpp
+++ b/src/corelib/tools/qstringlist.cpp
@@ -680,4 +680,13 @@ int QtPrivate::QStringList_removeDuplicates(QStringList *that)
     return n - j;
 }
 
+/*! \fn QStringList::QStringList(std::initializer_list<QString> args)
+    \since 4.8
+
+    Construct a list from a std::initilizer_list.
+
+    This constructor is only enabled if the compiler supports C++0x
+*/
+
+
 QT_END_NAMESPACE
diff --git a/src/corelib/tools/qvector.cpp b/src/corelib/tools/qvector.cpp
index e2e366d..06ed6bb 100644
--- a/src/corelib/tools/qvector.cpp
+++ b/src/corelib/tools/qvector.cpp
@@ -274,6 +274,15 @@ int QVectorData::grow(int sizeofTypedData, int size, int sizeofT, bool excessive
     \sa operator=()
 */
 
+/*! \fn QVector::QVector(std::initializer_list<T> args)
+    \since 4.8
+
+    Construct a vector from a std::initilizer_list.
+
+    This constructor is only enabled if the compiler supports C++0x
+*/
+
+
 /*! \fn QVector::~QVector()
 
     Destroys the vector.
-- 
cgit v0.12


From 7527392f639903a42471d914528b25b13f0cde98 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 4 Apr 2011 16:39:57 +0200
Subject: Fix compilation

Reviewed-by: Joao
---
 src/corelib/io/qtemporaryfile.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index 34c01a6..b5e5808 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -251,8 +251,8 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
     QString qfilename = d->fileEntry.filePath();
 
     // Find placeholder string.
-    size_t phPos = size_t(qfilename.length());
-    size_t phLength = 0;
+    uint phPos = qfilename.length();
+    uint phLength = 0;
 
     while (phPos != 0) {
         --phPos;
-- 
cgit v0.12


From 3b7e0cad481ca3a71f27259352ed0fd335150ba2 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 4 Apr 2011 18:50:53 +0200
Subject: Fix QMetaObject::indexOfSlot

The wrong offset was added
---
 src/corelib/kernel/qmetaobject.cpp         |  2 +-
 tests/auto/qmetaobject/tst_qmetaobject.cpp | 29 +++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 4bf4290..f0426f5 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -652,7 +652,7 @@ int QMetaObject::indexOfSlot(const char *slot) const
     if (i < 0)
         i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot, true);
     if (i >= 0)
-        i += methodOffset();
+        i += m->methodOffset();
     return i;
 }
 
diff --git a/tests/auto/qmetaobject/tst_qmetaobject.cpp b/tests/auto/qmetaobject/tst_qmetaobject.cpp
index d496c56..13e3bcd 100644
--- a/tests/auto/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/qmetaobject/tst_qmetaobject.cpp
@@ -175,6 +175,9 @@ private slots:
 
     void metaMethod();
 
+    void indexOfMethod_data();
+    void indexOfMethod();
+
 signals:
     void value6Changed();
     void value7Changed(const QString &);
@@ -1077,5 +1080,31 @@ void tst_QMetaObject::metaMethod()
     QCOMPARE(obj.slotResult, QString("sl13"));
 }
 
+void tst_QMetaObject::indexOfMethod_data()
+{
+    QTest::addColumn<QObject *>("object");
+    QTest::addColumn<QByteArray>("name");
+    QTest::addColumn<bool>("isSignal");
+    QTest::newRow("indexOfMethod_data") << (QObject*)this << QByteArray("indexOfMethod_data()") << false;
+    QTest::newRow("deleteLater") << (QObject*)this << QByteArray("deleteLater()") << false;
+    QTest::newRow("value6changed") << (QObject*)this << QByteArray("value6Changed()") << true;
+    QTest::newRow("value7changed") << (QObject*)this << QByteArray("value7Changed(QString)") << true;
+    QTest::newRow("destroyed") << (QObject*)this << QByteArray("destroyed()") << true;
+    QTest::newRow("destroyed2") << (QObject*)this << QByteArray("destroyed(QObject*)") << true;
+}
+
+void tst_QMetaObject::indexOfMethod()
+{
+    QFETCH(QObject *, object);
+    QFETCH(QByteArray, name);
+    QFETCH(bool, isSignal);
+    int idx = object->metaObject()->indexOfMethod(name);
+    QVERIFY(idx >= 0);
+    QCOMPARE(object->metaObject()->method(idx).signature(), name.constData());
+    QCOMPARE(object->metaObject()->indexOfSlot(name), isSignal ? -1 : idx);
+    QCOMPARE(object->metaObject()->indexOfSignal(name), !isSignal ? -1 : idx);
+}
+
+
 QTEST_MAIN(tst_QMetaObject)
 #include "tst_qmetaobject.moc"
-- 
cgit v0.12


From 5def7de22269906cc304c70534cef724b6127505 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 5 Apr 2011 09:38:46 +0200
Subject: Implement QWaylandIntegration::hasOpenGL().

---
 src/plugins/platforms/wayland/qwaylandintegration.cpp | 9 +++++++++
 src/plugins/platforms/wayland/qwaylandintegration.h   | 2 ++
 2 files changed, 11 insertions(+)

diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp
index be78b82..04f3d9a 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.cpp
+++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp
@@ -115,3 +115,12 @@ QPlatformFontDatabase *QWaylandIntegration::fontDatabase() const
 {
     return mFontDb;
 }
+
+bool QWaylandIntegration::hasOpenGL() const
+{
+#ifdef QT_WAYLAND_GL_SUPPORT
+    return true;
+#else
+    return false;
+#endif
+}
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h
index 067b6e4..20f8c5c 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.h
+++ b/src/plugins/platforms/wayland/qwaylandintegration.h
@@ -63,6 +63,8 @@ public:
 
     QPlatformFontDatabase *fontDatabase() const;
 
+    bool hasOpenGL() const;
+
 private:
     QPlatformFontDatabase *mFontDb;
     QWaylandDisplay *mDisplay;
-- 
cgit v0.12


From 1513c28ac391741fc7d18dd79374a6c59f7e4dbb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 5 Apr 2011 10:12:45 +0200
Subject: Make sure to delete wayland surface when QWaylandWindow is destroyed.

---
 src/plugins/platforms/wayland/qwaylandwindow.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index 9e851b3..e994616 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -61,6 +61,8 @@ QWaylandWindow::QWaylandWindow(QWidget *window)
 
 QWaylandWindow::~QWaylandWindow()
 {
+    if (mSurface)
+        wl_surface_destroy(mSurface);
 }
 
 WId QWaylandWindow::winId() const
-- 
cgit v0.12


From 25054c7a20a6ebd15603ac1060e09ee244afa054 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 29 Mar 2011 12:22:40 +0200
Subject: uikit: Set the offline storage path for QML

---
 src/plugins/platforms/uikit/examples/qmltest/main.mm | 16 +++++++++++++++-
 src/plugins/platforms/uikit/quikitwindowsurface.h    |  2 +-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/uikit/examples/qmltest/main.mm b/src/plugins/platforms/uikit/examples/qmltest/main.mm
index 2b5f024..ea4e90c 100644
--- a/src/plugins/platforms/uikit/examples/qmltest/main.mm
+++ b/src/plugins/platforms/uikit/examples/qmltest/main.mm
@@ -45,9 +45,22 @@
 
 #include <QtGui/QApplication>
 #include <QtCore/QtPlugin>
+#include <QtDeclarative/QDeclarativeEngine>
 
 Q_IMPORT_PLUGIN(UIKit)
 
+static QString qStringFromNSString(NSString *nsstring)
+{
+	return QString::fromUtf8([nsstring UTF8String]);
+}
+
+static QString documentsDirectory()
+{
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+	NSString *documentsDirectory = [paths objectAtIndex:0];
+	return qStringFromNSString(documentsDirectory);
+}
+
 int main(int argc, char *argv[]) {
 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
@@ -55,8 +68,9 @@ int main(int argc, char *argv[]) {
     QApplication app(argc, argv);
     QmlApplicationViewer viewer;
     viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
+	viewer.engine()->setOfflineStoragePath(documentsDirectory());
     NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
-    viewer.setMainQmlFile(QString::fromUtf8([[resourcePath stringByAppendingPathComponent:@"qml/main.qml"] UTF8String]));
+    viewer.setMainQmlFile(qStringFromNSString([resourcePath stringByAppendingPathComponent:@"qml/main.qml"]));
     viewer.showMaximized();
     int retVal = app.exec();
     [pool release];
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.h b/src/plugins/platforms/uikit/quikitwindowsurface.h
index 50d02b4..81f60f5 100644
--- a/src/plugins/platforms/uikit/quikitwindowsurface.h
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.h
@@ -72,7 +72,7 @@ public:
     void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
     void resize (const QSize &size);
 
-    QImageView *nativeView() const { return mView; }
+    UIView *nativeView() const { return mView; }
 private:
     QImage *mImage;
     QImageView *mView;
-- 
cgit v0.12


From f3d82a8903b14bb35b0b5f0eb69168b2ca59c31b Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 31 Mar 2011 17:53:10 +0200
Subject: Compile fixes for GL ES and Mac
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

For QPA the unix tests are used to determine the availability of OpenGL
ES, so they need to compile even on Mac. Similarly the includes in the
OpenGL module have to be adapted on Mac.

Acked-by: Jørgen Lind
---
 config.tests/unix/opengles1/opengles1.cpp       |  6 ++++-
 config.tests/unix/opengles1/opengles1.pro       |  4 ++++
 config.tests/unix/opengles2/opengles2.cpp       |  6 ++++-
 config.tests/unix/opengles2/opengles2.pro       |  4 ++++
 mkspecs/qws/macx-iphonedevice-g++/qmake.conf    |  5 +++-
 mkspecs/qws/macx-iphonesimulator-g++/qmake.conf |  3 +++
 src/opengl/opengl.pro                           |  2 +-
 src/opengl/qgl.h                                | 32 +++++++++++++++----------
 src/plugins/platforms/uikit/README              |  4 ++--
 9 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/config.tests/unix/opengles1/opengles1.cpp b/config.tests/unix/opengles1/opengles1.cpp
index caef9a9..ec16fc0 100644
--- a/config.tests/unix/opengles1/opengles1.cpp
+++ b/config.tests/unix/opengles1/opengles1.cpp
@@ -39,7 +39,11 @@
 **
 ****************************************************************************/
 
-#include <GLES/gl.h>
+#ifdef BUILD_ON_MAC
+  #include <OpenGLES/ES1/gl.h>
+#else
+  #include <GLES/gl.h>
+#endif
 
 int main(int, char **)
 {
diff --git a/config.tests/unix/opengles1/opengles1.pro b/config.tests/unix/opengles1/opengles1.pro
index 1469aa9..9e60124 100644
--- a/config.tests/unix/opengles1/opengles1.pro
+++ b/config.tests/unix/opengles1/opengles1.pro
@@ -7,3 +7,7 @@ for(p, QMAKE_LIBDIR_OPENGL_ES1) {
 
 CONFIG -= qt
 LIBS += $$QMAKE_LIBS_OPENGL_ES1
+mac {
+    DEFINES += BUILD_ON_MAC
+    CONFIG -= app_bundle
+}
diff --git a/config.tests/unix/opengles2/opengles2.cpp b/config.tests/unix/opengles2/opengles2.cpp
index caf02e6..39c6fa7 100644
--- a/config.tests/unix/opengles2/opengles2.cpp
+++ b/config.tests/unix/opengles2/opengles2.cpp
@@ -39,7 +39,11 @@
 **
 ****************************************************************************/
 
-#include <GLES2/gl2.h>
+#ifdef BUILD_ON_MAC
+  #include <OpenGLES/ES2/gl.h>
+#else
+  #include <GLES2/gl2.h>
+#endif
 
 int main(int, char **)
 {
diff --git a/config.tests/unix/opengles2/opengles2.pro b/config.tests/unix/opengles2/opengles2.pro
index c383fd0..34d7737 100644
--- a/config.tests/unix/opengles2/opengles2.pro
+++ b/config.tests/unix/opengles2/opengles2.pro
@@ -7,3 +7,7 @@ for(p, QMAKE_LIBDIR_OPENGL_ES2) {
 
 CONFIG -= qt
 LIBS += $$QMAKE_LIBS_OPENGL_ES2
+mac {
+    DEFINES += BUILD_ON_MAC
+    CONFIG -= app_bundle
+}
diff --git a/mkspecs/qws/macx-iphonedevice-g++/qmake.conf b/mkspecs/qws/macx-iphonedevice-g++/qmake.conf
index 36b9496..227d24e 100644
--- a/mkspecs/qws/macx-iphonedevice-g++/qmake.conf
+++ b/mkspecs/qws/macx-iphonedevice-g++/qmake.conf
@@ -16,12 +16,15 @@ DEFINES += QT_NO_AUDIO_BACKEND QT_NO_NETWORKPROXY QT_NO_FILESYSTEMWATCHER
 
 # You may need to change this to point to the iOS SDK you want to use.
 QMAKE_IOS_DEV_PATH = /Developer/Platforms/iPhoneOS.platform/Developer
-QMAKE_IOS_SDK = $$QMAKE_IOS_DEV_PATH/SDKs/iPhoneOS4.2.sdk
+QMAKE_IOS_SDK = $$QMAKE_IOS_DEV_PATH/SDKs/iPhoneOS4.3.sdk
 DEFINES += __IPHONE_OS_VERSION_MIN_REQUIRED=40200
 
 #clear
 QMAKE_MACOSX_DEPLOYMENT_TARGET = 
 
+QMAKE_LIBS_OPENGL_ES1 += -framework OpenGLES
+QMAKE_LIBS_OPENGL_ES2 += -framework OpenGLES
+
 # TARGET_PLATFORM = ios
 QMAKE_CC         = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
 QMAKE_CXX        = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2
diff --git a/mkspecs/qws/macx-iphonesimulator-g++/qmake.conf b/mkspecs/qws/macx-iphonesimulator-g++/qmake.conf
index dccab70..93c4786 100644
--- a/mkspecs/qws/macx-iphonesimulator-g++/qmake.conf
+++ b/mkspecs/qws/macx-iphonesimulator-g++/qmake.conf
@@ -21,6 +21,9 @@ DEFINES += __IPHONE_OS_VERSION_MIN_REQUIRED=40200
 #clear
 QMAKE_MACOSX_DEPLOYMENT_TARGET =
 
+QMAKE_LIBS_OPENGL_ES1 += -framework OpenGLES
+QMAKE_LIBS_OPENGL_ES2 += -framework OpenGLES
+
 # TARGET_PLATFORM = ios
 QMAKE_CC         = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2
 QMAKE_CXX        = /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index b512146..0d65b25 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -120,7 +120,7 @@ x11 {
     LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
 }
 
-mac {
+mac:!qpa {
     OBJECTIVE_SOURCES += qgl_mac.mm \
                          qglpixelbuffer_mac.mm
     LIBS_PRIVATE += -framework AppKit -framework Carbon
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
index ff73d88..c57995d 100644
--- a/src/opengl/qgl.h
+++ b/src/opengl/qgl.h
@@ -61,21 +61,29 @@ QT_BEGIN_HEADER
 #if defined(Q_WS_MAC)
 # include <OpenGL/gl.h>
 #elif defined(QT_OPENGL_ES_1)
-# include <GLES/gl.h>
-#ifndef GL_DOUBLE
-# define GL_DOUBLE GL_FLOAT
-#endif
-#ifndef GLdouble
+# if defined(Q_OS_MAC)
+#  include <OpenGLES/ES1/gl.h>
+# else
+#  include <GLES/gl.h>
+# endif
+# ifndef GL_DOUBLE
+#  define GL_DOUBLE GL_FLOAT
+# endif
+# ifndef GLdouble
 typedef GLfloat GLdouble;
-#endif
+# endif
 #elif defined(QT_OPENGL_ES_2)
-# include <GLES2/gl2.h>
-#ifndef GL_DOUBLE
-# define GL_DOUBLE GL_FLOAT
-#endif
-#ifndef GLdouble
+# if defined(Q_OS_MAC)
+#  include <OpenGLES/ES2/gl.h>
+# else
+#  include <GLES2/gl2.h>
+# endif
+# ifndef GL_DOUBLE
+#  define GL_DOUBLE GL_FLOAT
+# endif
+# ifndef GLdouble
 typedef GLfloat GLdouble;
-#endif
+# endif
 #else
 # include <GL/gl.h>
 #endif
diff --git a/src/plugins/platforms/uikit/README b/src/plugins/platforms/uikit/README
index b2984fc..a101a3a 100644
--- a/src/plugins/platforms/uikit/README
+++ b/src/plugins/platforms/uikit/README
@@ -18,11 +18,11 @@ After configuring and building Qt you need to also build src/plugins/platforms/u
 
 Simulator:
 ----------
-configure -qpa -xplatform qws/macx-iphonesimulator-g++ -arch i386 -developer-build -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -no-opengl -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+configure -qpa -xplatform qws/macx-iphonesimulator-g++ -arch i386 -developer-build -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
 
 Device:
 -------
-configure -qpa -xplatform qws/macx-iphonedevice-g++ -arch armv7 -developer-build -release -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -no-opengl -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+configure -qpa -xplatform qws/macx-iphonedevice-g++ -arch armv7 -developer-build -release -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
 
 2) XCode setup:
 - there are examples in the examples subdirectory of the platform plugin
-- 
cgit v0.12


From f4d1db4ddb2339fdbf9d4c15a4eebcc1c55ad33a Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 5 Apr 2011 10:54:31 +0200
Subject: Fix QPA prerendered fonts in combination with GL paint engine.

QPA uses the Indexed8 image format but stores 8 bit gray values in it.
The OpenVG and Raster paint engines handle that, but the OpenGL
engine didn't.

Reviewed-by: Paul Olav Tvete
---
 src/opengl/qpaintengine_opengl.cpp | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp
index 2c01ac4..9da811a 100644
--- a/src/opengl/qpaintengine_opengl.cpp
+++ b/src/opengl/qpaintengine_opengl.cpp
@@ -4736,7 +4736,7 @@ void QGLGlyphCache::cacheGlyphs(QGLContext *context, QFontEngine *fontEngine,
 //         qDebug() << "new context" << context << font_cache;
         qt_context_cache.insert(context, font_cache);
         if (context->isValid()) {
-            if (context->device()->devType() == QInternal::Widget) {
+            if (context->device() && context->device()->devType() == QInternal::Widget) {
                 QWidget *widget = static_cast<QWidget *>(context->device());
                 connect(widget, SIGNAL(destroyed(QObject*)), SLOT(widgetDestroyed(QObject*)));
             }
@@ -4832,7 +4832,6 @@ void QGLGlyphCache::cacheGlyphs(QGLContext *context, QFontEngine *fontEngine,
             }
 
             QImage glyph_im(fontEngine->alphaMapForGlyph(glyphs[i]));
-            glyph_im = glyph_im.convertToFormat(QImage::Format_Indexed8);
             glyph_width = glyph_im.width();
             Q_ASSERT(glyph_width >= 0);
             // pad the glyph width to an even number
@@ -4855,15 +4854,21 @@ void QGLGlyphCache::cacheGlyphs(QGLContext *context, QFontEngine *fontEngine,
 #endif
 
             if (!glyph_im.isNull()) {
-
                 int idx = 0;
                 uchar *tex_data = (uchar *) malloc(glyph_width*glyph_im.height()*2);
                 memset(tex_data, 0, glyph_width*glyph_im.height()*2);
 
+                bool is8BitGray = false;
+#ifdef Q_WS_QPA
+                if (glyph_im.format() == QImage::Format_Indexed8) {
+                    is8BitGray = true;
+                }
+#endif
+                glyph_im = glyph_im.convertToFormat(QImage::Format_Indexed8);
                 for (int y=0; y<glyph_im.height(); ++y) {
                     uchar *s = (uchar *) glyph_im.scanLine(y);
                     for (int x=0; x<glyph_im.width(); ++x) {
-                        uchar alpha = qAlpha(glyph_im.color(*s));
+                        uchar alpha = is8BitGray ? *s : qAlpha(glyph_im.color(*s));
                         tex_data[idx] = alpha;
                         tex_data[idx+1] = alpha;
                         ++s;
-- 
cgit v0.12


From fc36e189b7654692cdcfcd6098f3c22b15629cb1 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 5 Apr 2011 10:58:53 +0200
Subject: Use OpenGL backend for proof of concept UIKit lighthouse plugin.

---
 .../qmltest/qmltest.xcodeproj/project.pbxproj      |  20 ++
 src/plugins/platforms/uikit/quikiteventloop.mm     |   4 -
 src/plugins/platforms/uikit/quikitwindow.h         |  32 ++-
 src/plugins/platforms/uikit/quikitwindow.mm        | 226 ++++++++++++++++++++-
 src/plugins/platforms/uikit/quikitwindowsurface.h  |  22 +-
 src/plugins/platforms/uikit/quikitwindowsurface.mm | 198 +++---------------
 src/plugins/platforms/uikit/uikit.pro              |   2 +
 7 files changed, 303 insertions(+), 201 deletions(-)

diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
index 84f0d3a..10bb20f 100755
--- a/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
@@ -12,6 +12,12 @@
 		288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
 		D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659431338B21000760B02 /* libQtXml_debug.a */; };
 		D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */; };
+		D35784241345D8C90046D202 /* libQtOpenGL_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784231345D8C90046D202 /* libQtOpenGL_debug.a */; };
+		D35784261345D9940046D202 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784251345D9940046D202 /* OpenGLES.framework */; };
+		D35784281345D9E00046D202 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784271345D9E00046D202 /* QuartzCore.framework */; };
+		D3578436134A09990046D202 /* libQtOpenGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3578435134A09990046D202 /* libQtOpenGL.a */; };
+		D3578439134A0AAE0046D202 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784251345D9940046D202 /* OpenGLES.framework */; };
+		D357843A134A0AB10046D202 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784271345D9E00046D202 /* QuartzCore.framework */; };
 		D3CAA7C813264AAD008BB877 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7C713264AAD008BB877 /* main.mm */; };
 		D3CAA7E613264EA6008BB877 /* moc_qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */; };
 		D3CAA7E713264EA6008BB877 /* qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */; };
@@ -54,6 +60,10 @@
 		8D1107310486CEB800E47090 /* qmltest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "qmltest-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
 		D31659431338B21000760B02 /* libQtXml_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXml_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXml_debug.a"; sourceTree = SOURCE_ROOT; };
 		D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXmlPatterns_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXmlPatterns_debug.a"; sourceTree = SOURCE_ROOT; };
+		D35784231345D8C90046D202 /* libQtOpenGL_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtOpenGL_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtOpenGL_debug.a"; sourceTree = "<group>"; };
+		D35784251345D9940046D202 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+		D35784271345D9E00046D202 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+		D3578435134A09990046D202 /* libQtOpenGL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtOpenGL.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtOpenGL.a"; sourceTree = "<group>"; };
 		D3CAA7C713264AAD008BB877 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
 		D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = moc_qmlapplicationviewer.cpp; path = qmlapplicationviewer/moc_qmlapplicationviewer.cpp; sourceTree = "<group>"; };
 		D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qmlapplicationviewer.cpp; path = qmlapplicationviewer/qmlapplicationviewer.cpp; sourceTree = "<group>"; };
@@ -85,9 +95,11 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D35784281345D9E00046D202 /* QuartzCore.framework in Frameworks */,
 				1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
 				1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
 				288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */,
+				D35784261345D9940046D202 /* OpenGLES.framework in Frameworks */,
 				D3CAA7FA13264F8A008BB877 /* libz.1.2.3.dylib in Frameworks */,
 				D3CAA81B13265056008BB877 /* libQtCore_debug.a in Frameworks */,
 				D3CAA81C13265056008BB877 /* libQtDeclarative_debug.a in Frameworks */,
@@ -98,6 +110,7 @@
 				D3CAA82813265220008BB877 /* libQtNetwork_debug.a in Frameworks */,
 				D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */,
 				D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */,
+				D35784241345D8C90046D202 /* libQtOpenGL_debug.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -105,6 +118,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D357843A134A0AB10046D202 /* QuartzCore.framework in Frameworks */,
+				D3578439134A0AAE0046D202 /* OpenGLES.framework in Frameworks */,
 				D3CAA7F013264F52008BB877 /* Foundation.framework in Frameworks */,
 				D3CAA7F113264F52008BB877 /* UIKit.framework in Frameworks */,
 				D3CAA7F213264F52008BB877 /* CoreGraphics.framework in Frameworks */,
@@ -118,6 +133,7 @@
 				D3D817B8132A2CFD00CDE422 /* libQtXml.a in Frameworks */,
 				D3D817B9132A2CFD00CDE422 /* libQtXmlPatterns.a in Frameworks */,
 				D3D817BB132A2D0E00CDE422 /* libquikit.a in Frameworks */,
+				D3578436134A09990046D202 /* libQtOpenGL.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -172,6 +188,8 @@
 				1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
 				1D30AB110D05D00D00671497 /* Foundation.framework */,
 				288765A40DF7441C002DB57D /* CoreGraphics.framework */,
+				D35784251345D9940046D202 /* OpenGLES.framework */,
+				D35784271345D9E00046D202 /* QuartzCore.framework */,
 				D3CAA7F913264F8A008BB877 /* libz.1.2.3.dylib */,
 			);
 			name = Frameworks;
@@ -195,6 +213,7 @@
 				D3D817AB132A2CFD00CDE422 /* libQtDeclarative.a */,
 				D3D817AC132A2CFD00CDE422 /* libQtGui.a */,
 				D3D817AD132A2CFD00CDE422 /* libQtNetwork.a */,
+				D3578435134A09990046D202 /* libQtOpenGL.a */,
 				D3D817AE132A2CFD00CDE422 /* libQtScript.a */,
 				D3D817AF132A2CFD00CDE422 /* libQtSql.a */,
 				D3D817B0132A2CFD00CDE422 /* libQtXml.a */,
@@ -211,6 +230,7 @@
 				D3CAA81713265056008BB877 /* libQtDeclarative_debug.a */,
 				D3CAA81813265056008BB877 /* libQtGui_debug.a */,
 				D3CAA82713265220008BB877 /* libQtNetwork_debug.a */,
+				D35784231345D8C90046D202 /* libQtOpenGL_debug.a */,
 				D3CAA81913265056008BB877 /* libQtScript_debug.a */,
 				D3CAA81A13265056008BB877 /* libQtSql_debug.a */,
 				D31659431338B21000760B02 /* libQtXml_debug.a */,
diff --git a/src/plugins/platforms/uikit/quikiteventloop.mm b/src/plugins/platforms/uikit/quikiteventloop.mm
index 70757b1..d3afd86 100644
--- a/src/plugins/platforms/uikit/quikiteventloop.mm
+++ b/src/plugins/platforms/uikit/quikiteventloop.mm
@@ -78,10 +78,6 @@
         }
         QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
         platformWindow->ensureNativeWindow();
-        QUIKitWindowSurface *surface = static_cast<QUIKitWindowSurface*>(widget->windowSurface());
-        UIView *view = surface->nativeView();
-        [platformWindow->nativeWindow() addSubview:view];
-        [platformWindow->nativeWindow() makeKeyAndVisible];
     }
     return YES;
 }
diff --git a/src/plugins/platforms/uikit/quikitwindow.h b/src/plugins/platforms/uikit/quikitwindow.h
index d5a6690..f6d2c27 100644
--- a/src/plugins/platforms/uikit/quikitwindow.h
+++ b/src/plugins/platforms/uikit/quikitwindow.h
@@ -43,7 +43,33 @@
 #define QUIKITWINDOW_H
 
 #include <QPlatformWindow>
-#include <UIKit/UIKit.h>
+
+#import <UIKit/UIKit.h>
+#import <OpenGLES/ES1/gl.h>
+#import <OpenGLES/ES1/glext.h>
+#import <OpenGLES/EAGL.h>
+
+@interface EAGLView : UIView
+{
+    QPlatformWindow *mWindow;
+    EAGLContext *mContext;
+
+    GLint mFramebufferWidth;
+    GLint mFramebufferHeight;
+
+    GLuint mFramebuffer, mColorRenderbuffer, mDepthRenderbuffer;
+}
+
+- (void)setContext:(EAGLContext *)newContext;
+- (void)presentFramebuffer;
+- (void)deleteFramebuffer;
+- (void)createFramebuffer;
+- (void)makeCurrent;
+- (void)setWindow:(QPlatformWindow *)window;
+- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons;
+@end
+
+class EAGLPlatformContext;
 
 QT_BEGIN_NAMESPACE
 
@@ -60,9 +86,13 @@ public:
 
     UIWindow *ensureNativeWindow();
 
+    QPlatformGLContext *glContext() const;
+
 private:
     QUIKitScreen *mScreen;
     UIWindow *mWindow;
+    EAGLView *mView;
+    mutable EAGLPlatformContext *mContext;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
index ebdee06..aafbfa1 100644
--- a/src/plugins/platforms/uikit/quikitwindow.mm
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -39,17 +39,221 @@
 **
 ****************************************************************************/
 
+#import <QuartzCore/CAEAGLLayer.h>
+
 #include "quikitwindow.h"
 
 #include "quikitscreen.h"
 
 #include <QtDebug>
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QWindowSystemInterface>
+
+#include <QtDebug>
+
+class EAGLPlatformContext : public QPlatformGLContext
+{
+public:
+    EAGLPlatformContext(EAGLView *view)
+        : mView(view)
+    {
+        mFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
+        mFormat.setDepthBufferSize(24);
+        mFormat.setAccumBufferSize(0);
+        mFormat.setRedBufferSize(8);
+        mFormat.setGreenBufferSize(8);
+        mFormat.setBlueBufferSize(8);
+        mFormat.setAlphaBufferSize(8);
+        mFormat.setStencilBufferSize(8);
+        mFormat.setSampleBuffers(false);
+        mFormat.setSamples(1);
+//        mFormat.setSwapInterval(?)
+        mFormat.setDoubleBuffer(true);
+        mFormat.setDepth(true);
+        mFormat.setRgba(true);
+        mFormat.setAlpha(true);
+        mFormat.setAccum(false);
+        mFormat.setStencil(true);
+        mFormat.setStereo(false);
+        mFormat.setDirectRendering(false);
+        mFormat.setUseDefaultSharedContext(false);
+
+        EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
+        [mView setContext:aContext];
+    }
+
+    ~EAGLPlatformContext() { }
+
+    void makeCurrent()
+    {
+        QPlatformGLContext::makeCurrent();
+        [mView makeCurrent];
+    }
+
+    void doneCurrent()
+    {
+        QPlatformGLContext::doneCurrent();
+    }
+
+    void swapBuffers()
+    {
+        [mView presentFramebuffer];
+    }
+
+    void* getProcAddress(const QString& ) { return 0; }
+
+    QPlatformWindowFormat platformWindowFormat() const
+    {
+        return mFormat;
+    }
+
+private:
+    EAGLView *mView;
+
+    QPlatformWindowFormat mFormat;
+};
+
+@implementation EAGLView
+
++ (Class)layerClass
+{
+    return [CAEAGLLayer class];
+}
+
+- (id)init
+{
+    if ((self = [super init])) {
+        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
+        eaglLayer.opaque = TRUE;
+        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
+                                        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
+                                        kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
+                                        nil];
+    }
+    return self;
+}
+
+- (void)setContext:(EAGLContext *)newContext
+{
+    if (mContext != newContext)
+    {
+        [self deleteFramebuffer];
+        [mContext release];
+        mContext = [newContext retain];
+        [EAGLContext setCurrentContext:nil];
+    }
+}
+
+- (void)presentFramebuffer
+{
+    if (mContext) {
+        [EAGLContext setCurrentContext:mContext];
+        glBindRenderbufferOES(GL_RENDERBUFFER_OES, mColorRenderbuffer);
+        [mContext presentRenderbuffer:GL_RENDERBUFFER_OES];
+    }
+}
+
+- (void)deleteFramebuffer
+{
+    if (mContext)
+    {
+        [EAGLContext setCurrentContext:mContext];
+        if (mFramebuffer) {
+            glDeleteFramebuffersOES(1, &mFramebuffer);
+            mFramebuffer = 0;
+        }
+        if (mColorRenderbuffer) {
+            glDeleteRenderbuffersOES(1, &mColorRenderbuffer);
+            mColorRenderbuffer = 0;
+        }
+        if (mDepthRenderbuffer) {
+            glDeleteRenderbuffersOES(1, &mDepthRenderbuffer);
+            mDepthRenderbuffer = 0;
+        }
+    }
+}
+
+- (void)createFramebuffer
+{
+    if (mContext && !mFramebuffer)
+    {
+        [EAGLContext setCurrentContext:mContext];
+        glGenFramebuffersOES(1, &mFramebuffer);
+        glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFramebuffer);
+
+        glGenRenderbuffersOES(1, &mColorRenderbuffer);
+        glBindRenderbufferOES(GL_RENDERBUFFER_OES, mColorRenderbuffer);
+        [mContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer];
+        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &mFramebufferWidth);
+        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &mFramebufferHeight);
+        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, mColorRenderbuffer);
+
+        glGenRenderbuffersOES(1, &mDepthRenderbuffer);
+        glBindRenderbufferOES(GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, mFramebufferWidth, mFramebufferHeight);
+        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+
+        if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
+            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
+    }
+}
+
+- (void)makeCurrent
+{
+    if (mContext)
+    {
+        [EAGLContext setCurrentContext:mContext];
+        if (!mFramebuffer)
+            [self createFramebuffer];
+        glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFramebuffer);
+        glViewport(0, 0, mFramebufferWidth, mFramebufferHeight);
+    }
+}
+
+- (void)setWindow:(QPlatformWindow *)window
+{
+    mWindow = window;
+}
+
+- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons
+{
+    UITouch *touch = [touches anyObject];
+    CGPoint locationInView = [touch locationInView:self];
+    QPoint p(locationInView.x, locationInView.y);
+    // TODO handle global touch point? for status bar?
+    QWindowSystemInterface::handleMouseEvent(mWindow->widget(), (ulong)(event.timestamp*1000),
+        p, p, buttons);
+}
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+{
+    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
+{
+    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
+}
+
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
+{
+    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
+}
+
+@end
 
 QT_BEGIN_NAMESPACE
 
 QUIKitWindow::QUIKitWindow(QWidget *tlw) :
     QPlatformWindow(tlw),
-    mWindow(nil)
+    mWindow(nil),
+    mContext(0)
 {
     mScreen = static_cast<QUIKitScreen *>(QPlatformScreen::platformScreenForWidget(tlw));
     CGRect screenBounds = [mScreen->uiScreen() bounds];
@@ -60,6 +264,8 @@ QUIKitWindow::QUIKitWindow(QWidget *tlw) :
 
 QUIKitWindow::~QUIKitWindow()
 {
+    delete mContext; mContext = 0;
+    [mView release];
     [mWindow release];
 }
 
@@ -67,6 +273,8 @@ void QUIKitWindow::setGeometry(const QRect &rect)
 {
     if (mWindow) {
         mWindow.frame = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
+        mView.frame = CGRectMake(0, 0, rect.width(), rect.height());
+        [mView deleteFramebuffer];
         [mWindow setNeedsDisplay];
     }
     QPlatformWindow::setGeometry(rect);
@@ -75,15 +283,31 @@ void QUIKitWindow::setGeometry(const QRect &rect)
 UIWindow *QUIKitWindow::ensureNativeWindow()
 {
     if (!mWindow) {
+        // window
         CGRect screenBounds = [mScreen->uiScreen() bounds];
         QRect geom = geometry();
         CGRect frame = CGRectMake(geom.x(), geom.y(), geom.width(), geom.height());
         mWindow = [[UIWindow alloc] initWithFrame:frame];
         mWindow.screen = mScreen->uiScreen();
         mWindow.frame = frame; // for some reason setting the screen resets frame.origin
+
+        // view
+        mView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, geom.width(), geom.height())];
+        [mView setMultipleTouchEnabled:YES];
+        [mView setWindow:this];
+        [mWindow addSubview:mView];
         [mWindow setNeedsDisplay];
+        [mWindow makeKeyAndVisible];
     }
     return mWindow;
 }
 
+QPlatformGLContext *QUIKitWindow::glContext() const
+{
+    if (!mContext) {
+        mContext = new EAGLPlatformContext(mView);
+    }
+    return mContext;
+}
+
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.h b/src/plugins/platforms/uikit/quikitwindowsurface.h
index 81f60f5..58ccb1b 100644
--- a/src/plugins/platforms/uikit/quikitwindowsurface.h
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.h
@@ -43,23 +43,6 @@
 #define QUIKITWINDOWSURFACE_H
 
 #include <QtGui/QPlatformIntegration>
-#include <QtGui/QImage>
-#include <QtGui/QWindowSystemInterface>
-
-#include <UIKit/UIKit.h>
-
-@interface QImageView : UIView
-{
-    CGImageRef m_cgImage;
-    QWidget *m_widget;
-}
-
-- (void)setImage:(QImage *)image;
-- (void)setWidget:(QWidget *)widget;
-
-//- (QList<struct QWindowSystemInterface::TouchPoint>)touchPointsForTouches:(NSSet *)touches;
-- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons;
-@end
 
 QT_BEGIN_NAMESPACE
 
@@ -70,12 +53,9 @@ public:
 
     QPaintDevice *paintDevice();
     void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
-    void resize (const QSize &size);
 
-    UIView *nativeView() const { return mView; }
 private:
-    QImage *mImage;
-    QImageView *mView;
+    QPaintDevice *mPaintDevice;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.mm b/src/plugins/platforms/uikit/quikitwindowsurface.mm
index 1274fca..dd188fb 100644
--- a/src/plugins/platforms/uikit/quikitwindowsurface.mm
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.mm
@@ -42,201 +42,51 @@
 #include "quikitwindowsurface.h"
 #include "quikitwindow.h"
 
-#include <QtDebug>
-
-@implementation QImageView
-
-- (void)dealloc
-{
-    CGImageRelease(m_cgImage);
-    [super dealloc];
-}
-
-- (void)setImage:(QImage *)image
-{
-    CGImageRelease(m_cgImage);
-
-    const uchar *imageData = image->bits();
-    int bitDepth = image->depth();
-    int colorBufferSize = 8;
-    int bytesPrLine = image->bytesPerLine();
-    int width = image->width();
-    int height = image->height();
-
-    CGColorSpaceRef cgColourSpaceRef = CGColorSpaceCreateDeviceRGB();
-
-    CGDataProviderRef cgDataProviderRef = CGDataProviderCreateWithData(
-                NULL,
-                imageData,
-                image->byteCount(),
-                NULL);
-
-    m_cgImage = CGImageCreate(width,
-                              height,
-                              colorBufferSize,
-                              bitDepth,
-                              bytesPrLine,
-                              cgColourSpaceRef,
-                              kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little,
-                              cgDataProviderRef,
-                              NULL,
-                              false,
-                              kCGRenderingIntentDefault);
+#include <QtOpenGL/private/qgl_p.h>
+#include <QtOpenGL/private/qglpaintdevice_p.h>
 
-    CGDataProviderRelease(cgDataProviderRef);
-    CGColorSpaceRelease(cgColourSpaceRef);
-}
-
-- (void)setWidget:(QWidget *)widget
-{
-    m_widget = widget;
-}
-
-- (void)drawRect:(CGRect)rect
-{
-
-    if (!m_cgImage)
-        return;
-
-    CGContextRef cgContext = UIGraphicsGetCurrentContext();
-    CGContextSaveGState( cgContext );
-
-    int dy = rect.origin.y + CGRectGetMaxY(rect);
-    CGContextTranslateCTM(cgContext, 0, dy);
-    CGContextScaleCTM(cgContext, 1, -1);
-    CGImageRef subImage = CGImageCreateWithImageInRect(m_cgImage, rect);
-    CGContextDrawImage(cgContext,rect,subImage);
-    CGImageRelease(subImage);
-
-    CGContextRestoreGState(cgContext);
-}
-
-//- (QList<struct QWindowSystemInterface::TouchPoint>)touchPointsForTouches:(NSSet *)touches
-//{
-//    NSEnumerator *enumerator = [touches objectEnumerator];
-//    id touch;
-//    int count = 0;
-//    QList<struct QWindowSystemInterface::TouchPoint> result;
-//    while ((touch = [enumerator nextObject])) {
-//        CGPoint locationInView = [touch locationInView:self];
-//        CGRect bounds = [self bounds];
-//        struct QWindowSystemInterface::TouchPoint p;
-//        p.id = count;
-//        p.isPrimary = true;
-//        p.normalPosition = QPointF(locationInView.x / bounds.size.width,
-//                                   locationInView.y / bounds.size.height);
-//        p.area = QRectF(locationInView.x, locationInView.y, 1, 1);
-//        p.pressure = 1.;
-//        switch ([touch phase]) {
-//        case UITouchPhaseBegan:
-//            p.state = Qt::TouchPointPressed;
-//            break;
-//        case UITouchPhaseMoved:
-//            p.state = Qt::TouchPointMoved;
-//            break;
-//        case UITouchPhaseStationary:
-//            p.state = Qt::TouchPointStationary;
-//            break;
-//        case UITouchPhaseEnded:
-//        case UITouchPhaseCancelled:
-//            p.state = Qt::TouchPointReleased;
-//            break;
-//        }
-//        result << p;
-//        qDebug() << p.id << ":" << p.normalPosition << p.area << p.state;
-//        ++count;
-//    }
-//    qDebug() << result.size();
-//    return result;
-//}
-
-- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons
-{
-    UITouch *touch = [touches anyObject];
-    CGPoint locationInView = [touch locationInView:self];
-    QPoint p(locationInView.x, locationInView.y);
-    // TODO handle global touch point? for status bar?
-    QWindowSystemInterface::handleMouseEvent(m_widget, (ulong)(event.timestamp*1000),
-        p, p, buttons);
-}
+#include <QtDebug>
 
-- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+class EAGLPaintDevice : public QGLPaintDevice
 {
-    //QWindowSystemInterface::handleTouchEvent(m_widget, (ulong)(event.timestamp*1000),
-    //                                         QEvent::TouchBegin, QTouchEvent::TouchScreen,
-    //                                         [self touchPointsForTouches:touches]);
-    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
-}
+public:
+    EAGLPaintDevice(QPlatformWindow *window)
+        :QGLPaintDevice(), mWindow(window)
+    {
+    }
 
-- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
-{
-    //QWindowSystemInterface::handleTouchEvent(m_widget, (ulong)(event.timestamp*1000),
-    //                                         QEvent::TouchUpdate, QTouchEvent::TouchScreen,
-    //                                         [self touchPointsForTouches:touches]);
-    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
-}
+    int devType() const { return QInternal::OpenGL; }
+    QSize size() const { return mWindow->geometry().size(); }
+    QGLContext* context() const { return QGLContext::fromPlatformGLContext(mWindow->glContext()); }
 
-- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
-{
-    //QWindowSystemInterface::handleTouchEvent(m_widget, (ulong)(event.timestamp*1000),
-    //                                         QEvent::TouchEnd, QTouchEvent::TouchScreen,
-    //                                         [self touchPointsForTouches:touches]);
-    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
-}
+    QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
 
-- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
-{
-    //QWindowSystemInterface::handleTouchEvent(m_widget, (ulong)(event.timestamp*1000),
-    //                                         QEvent::TouchEnd, QTouchEvent::TouchScreen,
-    //                                         [self touchPointsForTouches:touches]);
-    [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
-}
-
-@end
+    void  beginPaint(){
+        QGLPaintDevice::beginPaint();
+    }
+private:
+    QPlatformWindow *mWindow;
+};
 
 QT_BEGIN_NAMESPACE
 
 QUIKitWindowSurface::QUIKitWindowSurface(QWidget *window)
-    : QWindowSurface(window)
+    : QWindowSurface(window), mPaintDevice(new EAGLPaintDevice(window->platformWindow()))
 {
-    QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(window->platformWindow());
-    Q_ASSERT(platformWindow);
-    const QRect geo = window->geometry();
-    mView = [[QImageView alloc] initWithFrame:CGRectMake(geo.x(),geo.y(),geo.width(),geo.height())];
-    [mView setMultipleTouchEnabled:YES];
-    [mView setWidget:window];
-    mImage = new QImage(window->size(),QImage::Format_ARGB32_Premultiplied);
-    [mView setImage:mImage];
-    if (platformWindow->nativeWindow()) {
-        [platformWindow->nativeWindow() addSubview:mView];
-        [mView setNeedsDisplay];
-    }
+    setPartialUpdateSupport(false);
 }
 
 QPaintDevice *QUIKitWindowSurface::paintDevice()
 {
-    return mImage;
+    return mPaintDevice;
 }
 
 void QUIKitWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(widget);
+    Q_UNUSED(region);
     Q_UNUSED(offset);
-
-    QRect geo = region.boundingRect();
-    [mView setNeedsDisplayInRect:CGRectMake(geo.x(),geo.y(),geo.width(),geo.height())];
-}
-
-void QUIKitWindowSurface::resize (const QSize &size)
-{
-    QWindowSurface::resize(size);
-
-    delete mImage;
-    mImage = new QImage(size,QImage::Format_ARGB32_Premultiplied);
-    [mView setImage:mImage];
-    const QRect geo = geometry();
-    [mView setFrame:CGRectMake(geo.x(), geo.y(), size.width(), size.height())];
-    [mView setNeedsDisplay];
+    widget->platformWindow()->glContext()->swapBuffers();
 }
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/uikit.pro b/src/plugins/platforms/uikit/uikit.pro
index b73c334..1589ee9 100644
--- a/src/plugins/platforms/uikit/uikit.pro
+++ b/src/plugins/platforms/uikit/uikit.pro
@@ -2,6 +2,8 @@ TARGET = quikit
 include(../../qpluginbase.pri)
 QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
 
+QT += opengl
+
 OBJECTIVE_SOURCES = main.mm \
     quikitintegration.mm \
     quikitwindow.mm \
-- 
cgit v0.12


From e1f5699f262d52e72d6855440cfc1c2919b74163 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 30 Mar 2011 16:39:14 +0100
Subject: Don't reinitialise udp socket when IP versions don't match

An IPv6 socket can send to IPv4 addresses when in a dual mode stack.
On symbian, autobinded sockets have the ::0 local address rather than
0.0.0.0 - this check was causing the socket to be destroyed and recreated
with every call to writeDatagram.

Reviewed-by: Markus Goetz
---
 src/network/socket/qudpsocket.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qudpsocket.cpp b/src/network/socket/qudpsocket.cpp
index 4334f68..dc473c6 100644
--- a/src/network/socket/qudpsocket.cpp
+++ b/src/network/socket/qudpsocket.cpp
@@ -202,7 +202,7 @@ bool QUdpSocketPrivate::doEnsureInitialized(const QHostAddress &bindAddress, qui
 #endif
 
     // now check if the socket engine is initialized and to the right type
-    if (!socketEngine || !socketEngine->isValid() || socketEngine->protocol() != proto) {
+    if (!socketEngine || !socketEngine->isValid()) {
         resolveProxy(remoteAddress.toString(), bindPort);
         if (!initSocketLayer(address->protocol()))
             return false;
-- 
cgit v0.12


From 989ca02a932cf7c90e8d29c18dd72415e46afb81 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 30 Mar 2011 16:48:51 +0100
Subject: Fix assert fail when debug log is enabled

Enough debug logging allows time for the proxy server to close the http
connection after sending a 407 response. This errors the connection,
but then the queued _q_startNextRequest is immediately run, causing an
assertion failure.
Changed this to a soft failure which allows the error to propagate
rather than crashing.
Test case is tst_qnetworkreply::ioPostToHttpFromSocket

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpnetworkconnectionchannel.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index a6d6172..6fbc6f8 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -842,7 +842,10 @@ void QHttpNetworkConnectionChannel::handleStatus()
 
 bool QHttpNetworkConnectionChannel::resetUploadData()
 {
-    Q_ASSERT(reply);
+    if (!reply) {
+        //this happens if server closes connection while QHttpNetworkConnectionPrivate::_q_startNextRequest is pending
+        return false;
+    }
     QNonContiguousByteDevice* uploadByteDevice = request.uploadByteDevice();
     if (!uploadByteDevice)
         return true;
-- 
cgit v0.12


From cd907ff4656c8819f5aa19979ea6da25fc5947e6 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 30 Mar 2011 17:06:07 +0100
Subject: Fix multicast group membership

Although symbian's multicast support is incomplete, this is enough to
pass the QUdpSocket test case. (no IGMP/MLD support in the OS)

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 36 ++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index af755a9..52f6b68 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1198,22 +1198,32 @@ bool QSymbianSocketEnginePrivate::multicastGroupMembershipHelper(const QHostAddr
                           const QNetworkInterface &iface,
                           TUint operation)
 {
-    //TODO - untested
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug() << "QSymbianSocketEnginePrivate::multicastGroupMembershipHelper" << groupAddress << iface << operation;
+#endif
     //translate address
     TPckgBuf<TIp6Mreq> option;
-    Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
-    memcpy(option().iAddr.u.iAddr8, ip6.c, 16);
-    //translate interface
-    //TODO - can we just use iface.index() ?
-    TPckgBuf<TSoInetIfQuery> query;
-    query().iName = qt_QString2TPtrC(iface.name());
-    TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
-    if (err == KErrNone)
-        option().iInterface = query().iIndex;
-    else
-        option().iInterface = 0;
+    if (groupAddress.protocol() == QAbstractSocket::IPv6Protocol) {
+        Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
+        memcpy(option().iAddr.u.iAddr8, ip6.c, 16);
+    } else {
+        TInetAddr wrapped;
+        wrapped.SetAddress(groupAddress.toIPv4Address());
+        wrapped.ConvertToV4Mapped();
+        option().iAddr = wrapped.Ip6Address();
+    }
+    option().iInterface = iface.index();
     //join or leave group
-    return (KErrNone == nativeSocket.SetOpt(operation, KSolInetIp, option));
+    TInt err = nativeSocket.SetOpt(operation, KSolInetIp, option);
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+    qDebug() << "address" << qt_prettyDebug((const char *)(option().iAddr.u.iAddr8), 16, 16);
+    qDebug() << "interface" << option().iInterface;
+    qDebug() << "error" << err;
+#endif
+    if (err) {
+        setError(err);
+    }
+    return (KErrNone == err);
 }
 
 QNetworkInterface QSymbianSocketEngine::multicastInterface() const
-- 
cgit v0.12


From 1d8f8bc70e4f056e4e110a779d483c186fc2ad19 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 31 Mar 2011 12:19:45 +0100
Subject: Update address reporting code

When an IP6 address contains a valid IP4 address, report the address
in IP4 format (this is needed for SOCKS5 socket engine)
When binding Any or AnyIPv6, create a dual mode socket (KAfUnspec),
but report the local address as being the same as what the user
requested. (by default, symbian returns ::0 for the dual mode socket,
which causes problems for SOCKS and UDP code)

The intent is that most applications written for IP4 can work
transparently in an IP6 environment.
QTcpServer or QUdpSocket can accept either IP4 or IP6 from the same
socket.

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 39 +++++++++++++----------------
 1 file changed, 17 insertions(+), 22 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 52f6b68..165316d 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -147,7 +147,7 @@ static QByteArray qt_prettyDebug(const char *data, int len, int maxSize)
 
 void QSymbianSocketEnginePrivate::getPortAndAddress(const TInetAddr& a, quint16 *port, QHostAddress *addr)
 {
-    if (a.Family() == KAfInet6) {
+    if (a.Family() == KAfInet6 && !a.IsV4Compat() && !a.IsV4Mapped()) {
         Q_IPV6ADDR tmp;
         memcpy(&tmp, a.Ip6Address().u.iAddr8, sizeof(tmp));
         if (addr) {
@@ -226,12 +226,7 @@ bool QSymbianSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType so
 void QSymbianSocketEnginePrivate::setPortAndAddress(TInetAddr& nativeAddr, quint16 port, const QHostAddress &addr)
 {
     nativeAddr.SetPort(port);
-    if (addr == QHostAddress::Any) {
-        //Should allow both IPv4 and IPv6
-        //Listening on "0.0.0.0" accepts ONLY ipv4 connections
-        //Listening on "::" accepts ONLY ipv6 connections
-        nativeAddr.SetFamily(KAFUnspec);
-    } else if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
+    if (addr.protocol() == QAbstractSocket::IPv6Protocol) {
         TPckgBuf<TSoInetIfQuery> query;
         query().iName = qt_QString2TPtrC(addr.scopeId());
         TInt err = nativeSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
@@ -274,7 +269,6 @@ QSymbianSocketEngine::QSymbianSocketEngine(QObject *parent)
 QSymbianSocketEngine::~QSymbianSocketEngine()
 {
     close();
-    // FIXME what else do we need to free?
 }
 
 /*!
@@ -650,7 +644,15 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     Q_CHECK_STATE(QSymbianSocketEngine::bind(), QAbstractSocket::UnconnectedState, false);
 
     TInetAddr nativeAddr;
-    d->setPortAndAddress(nativeAddr, port, address);
+    if (address == QHostAddress::Any || address == QHostAddress::AnyIPv6) {
+        //Should allow both IPv4 and IPv6
+        //Listening on "0.0.0.0" accepts ONLY ipv4 connections
+        //Listening on "::" accepts ONLY ipv6 connections
+        nativeAddr.SetFamily(KAFUnspec);
+        nativeAddr.SetPort(port);
+    } else {
+        d->setPortAndAddress(nativeAddr, port, address);
+    }
 
     TInt err = d->nativeSocket.Bind(nativeAddr);
 #ifdef __WINS__
@@ -684,6 +686,11 @@ bool QSymbianSocketEngine::bind(const QHostAddress &address, quint16 port)
     d->socketState = QAbstractSocket::BoundState;
 
     d->fetchConnectionParameters();
+
+    // When we bind to unspecified address (to get a dual mode socket), report back the
+    // same type of address that was requested. This is required for SOCKS proxy to work.
+    if (nativeAddr.Family() == KAFUnspec)
+        d->localAddress = address;
     return true;
 }
 
@@ -693,8 +700,6 @@ bool QSymbianSocketEngine::listen()
     Q_CHECK_VALID_SOCKETLAYER(QSymbianSocketEngine::listen(), false);
     Q_CHECK_STATE(QSymbianSocketEngine::listen(), QAbstractSocket::BoundState, false);
     Q_CHECK_TYPE(QSymbianSocketEngine::listen(), QAbstractSocket::TcpSocket, false);
-   // TODO the value 50 is from the QNativeSocketEngine. Maybe it's a bit too much
-    // for a mobile platform
     TInt err = d->nativeSocket.Listen(50);
     if (err) {
         d->setError(err);
@@ -898,17 +903,7 @@ bool QSymbianSocketEnginePrivate::fetchConnectionParameters()
     getPortAndAddress(addr, &localPort, &localAddress);
 
     // Determine protocol family
-    switch (addr.Family()) {
-    case KAfInet:
-        socketProtocol = QAbstractSocket::IPv4Protocol;
-        break;
-    case KAfInet6:
-        socketProtocol = QAbstractSocket::IPv6Protocol;
-        break;
-    default:
-        socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
-        break;
-    }
+    socketProtocol = localAddress.protocol();
 
     // Determine the remote address
     nativeSocket.RemoteName(addr);
-- 
cgit v0.12


From a04905c2bb5caac9c9c0a3d0928f6fdfb4600cb9 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Fri, 1 Apr 2011 11:08:39 +0100
Subject: Implement cache support for the async resolver

Add additional check when starting a queued request, as the cache may
have been populated while the request was queued.
Put completed requests in the cache (note cache code internally discards
errored results and only caches successful results)

Reviewed-by: Aaron Tunney
Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         |  2 +-
 src/network/kernel/qhostinfo_symbian.cpp | 29 +++++++++++++++++++++++++++--
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index ab3e809..ceec04d 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -274,7 +274,7 @@ private:
         EIdle,
         EGetByName,
         EGetByAddress,
-        EGetMoreNames,
+        ECompleteFromCache,
         EError
     } iState;
 };
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 73fed16..a38a845 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -108,6 +108,9 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
     QHostAddress address;
     if (address.setAddress(hostName)) {
         // Reverse lookup
+#if defined(QHOSTINFO_DEBUG)
+        qDebug("(reverse lookup)");
+#endif
         TInetAddr IpAdd;
         IpAdd.Input(qt_QString2TPtrC(hostName));
 
@@ -233,6 +236,24 @@ void QSymbianHostResolver::requestHostLookup()
         iHostName.toLatin1().constData(), id());
 #endif
 
+    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    if (manager->cache.isEnabled()) {
+        //check if name has been put in the cache while this request was queued
+        bool valid;
+        QHostInfo cachedResult = manager->cache.get(iHostName, &valid);
+        if (valid) {
+#if defined(QHOSTINFO_DEBUG)
+            qDebug("...found in cache");
+#endif
+            iResults = cachedResult;
+            iState = ECompleteFromCache;
+            SetActive();
+            TRequestStatus* stat = &iStatus;
+            User::RequestComplete(stat, KErrNone);
+            return;
+        }
+    }
+
     int err;
     if (iNetworkSession) {
         err = QNetworkSessionPrivate::nativeOpenHostResolver(*iNetworkSession, iHostResolver, KAfInet, KProtocolInetUdp);
@@ -295,12 +316,12 @@ void QSymbianHostResolver::DoCancel()
 #if defined(QHOSTINFO_DEBUG)
     qDebug() << "QSymbianHostResolver::DoCancel" << QThread::currentThreadId() << id() << (int)iState << this;
 #endif
-    if (iState == EGetByAddress || iState == EGetByName || iState == EGetMoreNames) {
+    if (iState == EGetByAddress || iState == EGetByName) {
         //these states have made an async request to host resolver
         iHostResolver.Cancel();
     } else {
         //for the self completing states there is nothing to cancel
-        Q_ASSERT(iState == EError);
+        Q_ASSERT(iState == EError || iState == ECompleteFromCache);
     }
 }
 
@@ -318,6 +339,7 @@ void QSymbianHostResolver::run()
     case EGetByAddress:
         processAddressResult();
         break;
+    case ECompleteFromCache:
     case EError:
         returnResults();
         break;
@@ -339,6 +361,9 @@ void QSymbianHostResolver::returnResults()
     iState = EIdle;
 
     QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    if (manager->cache.isEnabled()) {
+        manager->cache.put(iHostName, iResults);
+    }
     manager->lookupFinished(this);
 
     resultEmitter.emitResultsReady(iResults);
-- 
cgit v0.12


From 108dbea7145c941ba39f3958596cd1f348a2a049 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 4 Apr 2011 17:32:20 +0100
Subject: Add test case for thread safety of the QHostInfo async API

The existing threadSafety test only tested calling the blocking API
from multiple threads. As the asynchronous API may be implemented in
a different way, it should be tested separately.
Create 10 threads, each of which queues 10 async name lookups.

Reviewed-by: Markus Goetz
---
 tests/auto/qhostinfo/tst_qhostinfo.cpp | 53 +++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp
index 8be8dcb..7b2fc55 100644
--- a/tests/auto/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp
@@ -126,6 +126,7 @@ private slots:
 
     void raceCondition();
     void threadSafety();
+    void threadSafetyAsynchronousAPI();
 
     void multipleSameLookups();
     void multipleDifferentLookups_data();
@@ -419,7 +420,7 @@ protected:
 void tst_QHostInfo::threadSafety()
 {
     const int nattempts = 5;
-#if defined(Q_OS_WINCE)
+#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
     const int runs = 10;
 #else
     const int runs = 100;
@@ -433,6 +434,56 @@ void tst_QHostInfo::threadSafety()
     }
 }
 
+class LookupReceiver : public QObject
+{
+    Q_OBJECT
+public slots:
+    void start();
+    void resultsReady(const QHostInfo&);
+public:
+    QHostInfo result;
+    int numrequests;
+};
+
+void LookupReceiver::start()
+{
+    for (int i=0;i<numrequests;i++)
+        QHostInfo::lookupHost(QString("qt.nokia.com"), this, SLOT(resultsReady(const QHostInfo&)));
+}
+
+void LookupReceiver::resultsReady(const QHostInfo &info)
+{
+    result = info;
+    numrequests--;
+    if (numrequests == 0 || info.error() != QHostInfo::NoError)
+        QThread::currentThread()->quit();
+}
+
+void tst_QHostInfo::threadSafetyAsynchronousAPI()
+{
+    const int nattempts = 10;
+    const int lookupsperthread = 10;
+    QList<QThread*> threads;
+    QList<LookupReceiver*> receivers;
+    for (int i = 0; i < nattempts; ++i) {
+        QThread* thread = new QThread;
+        LookupReceiver* receiver = new LookupReceiver;
+        receiver->numrequests = lookupsperthread;
+        receivers.append(receiver);
+        receiver->moveToThread(thread);
+        connect(thread, SIGNAL(started()), receiver, SLOT(start()));
+        thread->start();
+        threads.append(thread);
+    }
+    for (int k = threads.count() - 1; k >= 0; --k)
+        QVERIFY(threads.at(k)->wait(60000));
+    foreach (LookupReceiver* receiver, receivers) {
+        QCOMPARE(receiver->result.error(), QHostInfo::NoError);
+        QCOMPARE(receiver->result.addresses().at(0).toString(), QString("87.238.50.178"));
+        QCOMPARE(receiver->numrequests, 0);
+    }
+}
+
 // this test is for the multi-threaded QHostInfo rewrite. It is about getting results at all,
 // not about getting correct IPs
 void tst_QHostInfo::multipleSameLookups()
-- 
cgit v0.12


From 3b395c6e45ed4f73503586e6b9a80bb11844d315 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 4 Apr 2011 17:48:27 +0100
Subject: Fix typo in class name

Manger -> Manager

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo.cpp         | 16 +++++++-------
 src/network/kernel/qhostinfo_p.h         | 18 +++++++--------
 src/network/kernel/qhostinfo_symbian.cpp | 38 ++++++++++++++++----------------
 3 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index 3413c9b..a16d4ca 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE
 #ifndef Q_OS_SYMBIAN
 Q_GLOBAL_STATIC(QHostInfoLookupManager, theHostInfoLookupManager)
 #else
-Q_GLOBAL_STATIC(QSymbianHostInfoLookupManger, theHostInfoLookupManager)
+Q_GLOBAL_STATIC(QSymbianHostInfoLookupManager, theHostInfoLookupManager)
 #endif
 
 /*!
@@ -202,7 +202,7 @@ int QHostInfo::lookupHost(const QString &name, QObject *receiver,
         manager->scheduleLookup(runnable);
     }
 #else
-    QSymbianHostInfoLookupManger *manager = theHostInfoLookupManager();
+    QSymbianHostInfoLookupManager *manager = theHostInfoLookupManager();
 
     if (manager) {
         // the application is still alive
@@ -267,7 +267,7 @@ QHostInfo QHostInfo::fromName(const QString &name)
 #endif
 
     QHostInfo hostInfo = QHostInfoAgent::fromName(name);
-    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManager* manager = theHostInfoLookupManager();
     manager->cache.put(name, hostInfo);
     return hostInfo;
 }
@@ -280,7 +280,7 @@ QHostInfo QHostInfoPrivate::fromName(const QString &name, QSharedPointer<QNetwor
 #endif
 
     QHostInfo hostInfo = QHostInfoAgent::fromName(name, session);
-    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManager* manager = theHostInfoLookupManager();
     manager->cache.put(name, hostInfo);
     return hostInfo;
 }
@@ -707,7 +707,7 @@ QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char
     *id = -1;
 
     // check cache
-    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManager* manager = theHostInfoLookupManager();
     if (manager && manager->cache.isEnabled()) {
         QHostInfo info = manager->cache.get(name, valid);
         if (*valid) {
@@ -724,7 +724,7 @@ QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char
 
 void qt_qhostinfo_clear_cache()
 {
-    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManager* manager = theHostInfoLookupManager();
     if (manager) {
         manager->clear();
     }
@@ -732,7 +732,7 @@ void qt_qhostinfo_clear_cache()
 
 void Q_AUTOTEST_EXPORT qt_qhostinfo_enable_cache(bool e)
 {
-    QAbstractHostInfoLookupManger* manager = theHostInfoLookupManager();
+    QAbstractHostInfoLookupManager* manager = theHostInfoLookupManager();
     if (manager) {
         manager->cache.setEnabled(e);
     }
@@ -800,7 +800,7 @@ void QHostInfoCache::clear()
     cache.clear();
 }
 
-QAbstractHostInfoLookupManger* QAbstractHostInfoLookupManger::globalInstance()
+QAbstractHostInfoLookupManager* QAbstractHostInfoLookupManager::globalInstance()
 {
     return theHostInfoLookupManager();
 }
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index ceec04d..bae6efa 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -172,24 +172,24 @@ public:
 };
 
 
-class QAbstractHostInfoLookupManger : public QObject
+class QAbstractHostInfoLookupManager : public QObject
 {
     Q_OBJECT
 
 public:
-    ~QAbstractHostInfoLookupManger() {}
+    ~QAbstractHostInfoLookupManager() {}
     virtual void clear() = 0;
 
     QHostInfoCache cache;
 
 protected:
-     QAbstractHostInfoLookupManger() {}
-     static QAbstractHostInfoLookupManger* globalInstance();
+     QAbstractHostInfoLookupManager() {}
+     static QAbstractHostInfoLookupManager* globalInstance();
 
 };
 
 #ifndef Q_OS_SYMBIAN
-class QHostInfoLookupManager : public QAbstractHostInfoLookupManger
+class QHostInfoLookupManager : public QAbstractHostInfoLookupManager
 {
     Q_OBJECT
 public:
@@ -279,14 +279,14 @@ private:
     } iState;
 };
 
-class QSymbianHostInfoLookupManger : public QAbstractHostInfoLookupManger
+class QSymbianHostInfoLookupManager : public QAbstractHostInfoLookupManager
 {
     Q_OBJECT
 public:
-    QSymbianHostInfoLookupManger();
-    ~QSymbianHostInfoLookupManger();
+    QSymbianHostInfoLookupManager();
+    ~QSymbianHostInfoLookupManager();
 
-    static QSymbianHostInfoLookupManger* globalInstance();
+    static QSymbianHostInfoLookupManager* globalInstance();
 
     int id();
     void clear();
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index a38a845..ded2416 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -221,7 +221,7 @@ QSymbianHostResolver::QSymbianHostResolver(const QString &hostName, int identifi
 QSymbianHostResolver::~QSymbianHostResolver()
 {
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::~QSymbianHostResolver" << id();
+    qDebug() << "QSymbianHostInfoLookupManager::~QSymbianHostResolver" << id();
 #endif
     Cancel();
     iHostResolver.Close();
@@ -236,7 +236,7 @@ void QSymbianHostResolver::requestHostLookup()
         iHostName.toLatin1().constData(), id());
 #endif
 
-    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    QSymbianHostInfoLookupManager *manager = QSymbianHostInfoLookupManager::globalInstance();
     if (manager->cache.isEnabled()) {
         //check if name has been put in the cache while this request was queued
         bool valid;
@@ -360,7 +360,7 @@ void QSymbianHostResolver::returnResults()
 #endif
     iState = EIdle;
 
-    QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+    QSymbianHostInfoLookupManager *manager = QSymbianHostInfoLookupManager::globalInstance();
     if (manager->cache.isEnabled()) {
         manager->cache.put(iHostName, iResults);
     }
@@ -376,7 +376,7 @@ TInt QSymbianHostResolver::RunError(TInt aError)
     QT_TRY {
         iState = EIdle;
 
-        QSymbianHostInfoLookupManger *manager = QSymbianHostInfoLookupManger::globalInstance();
+        QSymbianHostInfoLookupManager *manager = QSymbianHostInfoLookupManager::globalInstance();
         manager->lookupFinished(this);
 
         setError_helper(iResults, aError);
@@ -448,19 +448,19 @@ int QSymbianHostResolver::id()
     return iResults.lookupId();
 }
 
-QSymbianHostInfoLookupManger::QSymbianHostInfoLookupManger()
+QSymbianHostInfoLookupManager::QSymbianHostInfoLookupManager()
 {
 }
 
-QSymbianHostInfoLookupManger::~QSymbianHostInfoLookupManger()
+QSymbianHostInfoLookupManager::~QSymbianHostInfoLookupManager()
 {
 }
 
-void QSymbianHostInfoLookupManger::clear()
+void QSymbianHostInfoLookupManager::clear()
 {
     QMutexLocker locker(&mutex);
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::clear" << QThread::currentThreadId();
+    qDebug() << "QSymbianHostInfoLookupManager::clear" << QThread::currentThreadId();
 #endif
     //TODO: these aren't deleted because of thread unsafety, but that is a behaviour difference
     //qDeleteAll(iCurrentLookups);
@@ -468,12 +468,12 @@ void QSymbianHostInfoLookupManger::clear()
     cache.clear();
 }
 
-void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
+void QSymbianHostInfoLookupManager::lookupFinished(QSymbianHostResolver *r)
 {
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::lookupFinished" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
+    qDebug() << "QSymbianHostInfoLookupManager::lookupFinished" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // remove finished lookup from array and destroy
     TInt count = iCurrentLookups.count();
@@ -487,10 +487,10 @@ void QSymbianHostInfoLookupManger::lookupFinished(QSymbianHostResolver *r)
     runNextLookup();
 }
 
-void QSymbianHostInfoLookupManger::runNextLookup()
+void QSymbianHostInfoLookupManager::runNextLookup()
 {
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::runNextLookup" << QThread::currentThreadId() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
+    qDebug() << "QSymbianHostInfoLookupManager::runNextLookup" << QThread::currentThreadId() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // check to see if there are any scheduled lookups
     if (iScheduledLookups.count() > 0) {
@@ -503,12 +503,12 @@ void QSymbianHostInfoLookupManger::runNextLookup()
 }
 
 // called from QHostInfo
-void QSymbianHostInfoLookupManger::scheduleLookup(QSymbianHostResolver* r)
+void QSymbianHostInfoLookupManager::scheduleLookup(QSymbianHostResolver* r)
 {
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::scheduleLookup" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
+    qDebug() << "QSymbianHostInfoLookupManager::scheduleLookup" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // Check to see if we have space on the current lookups pool.
     if (iCurrentLookups.count() >= KMaxConcurrentLookups) {
@@ -527,12 +527,12 @@ void QSymbianHostInfoLookupManger::scheduleLookup(QSymbianHostResolver* r)
     }
 }
 
-void QSymbianHostInfoLookupManger::abortLookup(int id)
+void QSymbianHostInfoLookupManager::abortLookup(int id)
 {
     QMutexLocker locker(&mutex);
 
 #if defined(QHOSTINFO_DEBUG)
-    qDebug() << "QSymbianHostInfoLookupManger::abortLookup" << QThread::currentThreadId() << id << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
+    qDebug() << "QSymbianHostInfoLookupManager::abortLookup" << QThread::currentThreadId() << id << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     int i = 0;
     // Find the aborted lookup by ID.
@@ -557,10 +557,10 @@ void QSymbianHostInfoLookupManger::abortLookup(int id)
     }
 }
 
-QSymbianHostInfoLookupManger* QSymbianHostInfoLookupManger::globalInstance()
+QSymbianHostInfoLookupManager* QSymbianHostInfoLookupManager::globalInstance()
 {
-    return static_cast<QSymbianHostInfoLookupManger*>
-            (QAbstractHostInfoLookupManger::globalInstance());
+    return static_cast<QSymbianHostInfoLookupManager*>
+            (QAbstractHostInfoLookupManager::globalInstance());
 }
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From a0ca845cd32178d789f4eeff602b283a290842b8 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Mon, 4 Apr 2011 18:26:00 +0100
Subject: Thread safety for QHostInfo symbian implementation

Each thread needs at least one current request if it has any queued
requests, this is to stop the queue stalling.
When starting a queued request, start it in the same thread it belongs to
When aborting a request from the wrong thread, just detach it (it will
complete normally but the slot isn't connected, and then delete itself)

Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_p.h         |  2 ++
 src/network/kernel/qhostinfo_symbian.cpp | 54 ++++++++++++++++++++++++++------
 2 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index bae6efa..8da0692 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -234,6 +234,7 @@ public:
     ~QSymbianHostResolver();
 
     void requestHostLookup();
+    void abortHostLookup();
     int id();
 
     void returnResults();
@@ -301,6 +302,7 @@ public:
 private:
     void runNextLookup();
 
+    // this is true for single threaded use, with multiple threads the max is ((number of threads) + KMaxConcurrentLookups - 1)
     static const int KMaxConcurrentLookups = 5;
 
     QList<QSymbianHostResolver*> iCurrentLookups;
diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index ded2416..dcfc490 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -311,6 +311,23 @@ void QSymbianHostResolver::requestHostLookup()
     }
 }
 
+void QSymbianHostResolver::abortHostLookup()
+{
+    if (resultEmitter.thread() == QThread::currentThread()) {
+#ifdef QHOSTINFO_DEBUG
+        qDebug("QSymbianHostResolver::abortHostLookup - deleting %d", id());
+#endif
+        //normal case, abort from same thread it was started
+        delete this; //will cancel outstanding request
+    } else {
+#ifdef QHOSTINFO_DEBUG
+        qDebug("QSymbianHostResolver::abortHostLookup - detaching %d", id());
+#endif
+        //abort from different thread, carry on but don't report the results
+        resultEmitter.disconnect();
+    }
+}
+
 void QSymbianHostResolver::DoCancel()
 {
 #if defined(QHOSTINFO_DEBUG)
@@ -462,9 +479,10 @@ void QSymbianHostInfoLookupManager::clear()
 #if defined(QHOSTINFO_DEBUG)
     qDebug() << "QSymbianHostInfoLookupManager::clear" << QThread::currentThreadId();
 #endif
-    //TODO: these aren't deleted because of thread unsafety, but that is a behaviour difference
-    //qDeleteAll(iCurrentLookups);
-    //qDeleteAll(iScheduledLookups);
+    foreach (QSymbianHostResolver *hr, iCurrentLookups)
+        hr->abortHostLookup();
+    iCurrentLookups.clear();
+    qDeleteAll(iScheduledLookups);
     cache.clear();
 }
 
@@ -493,12 +511,17 @@ void QSymbianHostInfoLookupManager::runNextLookup()
     qDebug() << "QSymbianHostInfoLookupManager::runNextLookup" << QThread::currentThreadId() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // check to see if there are any scheduled lookups
-    if (iScheduledLookups.count() > 0) {
-        // if so, move one to the current lookups and run it
-        // FIFO
-        QSymbianHostResolver* hostResolver = iScheduledLookups.takeFirst();
-        iCurrentLookups.append(hostResolver);
-        hostResolver->requestHostLookup();
+    for (int i=0; i<iScheduledLookups.count(); i++) {
+        QSymbianHostResolver* hostResolver = iScheduledLookups.at(i);
+        if (hostResolver->resultEmitter.thread() == QThread::currentThread()) {
+            // if so, move one to the current lookups and run it
+            iCurrentLookups.append(hostResolver);
+            iScheduledLookups.removeAt(i);
+            hostResolver->requestHostLookup();
+            // if spare capacity, try to start another one
+            if (iCurrentLookups.count() >= KMaxConcurrentLookups)
+                break;
+        }
     }
 }
 
@@ -511,7 +534,18 @@ void QSymbianHostInfoLookupManager::scheduleLookup(QSymbianHostResolver* r)
     qDebug() << "QSymbianHostInfoLookupManager::scheduleLookup" << QThread::currentThreadId() << r->id() << "current" << iCurrentLookups.count() << "queued" << iScheduledLookups.count();
 #endif
     // Check to see if we have space on the current lookups pool.
+    bool defer = false;
     if (iCurrentLookups.count() >= KMaxConcurrentLookups) {
+        // busy, defer unless there are no request in this thread
+        // at least one active request per thread with queued requests is needed
+        for (int i=0; i < iCurrentLookups.count();i++) {
+            if (iCurrentLookups.at(i)->resultEmitter.thread() == QThread::currentThread()) {
+                defer = true;
+                break;
+            }
+        }
+    }
+    if (defer) {
         // If no, schedule for later.
         iScheduledLookups.append(r);
 #if defined(QHOSTINFO_DEBUG)
@@ -541,7 +575,7 @@ void QSymbianHostInfoLookupManager::abortLookup(int id)
         if (id == iCurrentLookups[i]->id()) {
             QSymbianHostResolver* r = iCurrentLookups.at(i);
             iCurrentLookups.removeAt(i);
-            delete r; //cancels via destructor
+            r->abortHostLookup();
             runNextLookup();
             return;
         }
-- 
cgit v0.12


From 4aef1e1dd1ec5ccfdf56d91975185ff96a51701b Mon Sep 17 00:00:00 2001
From: Aaron Tunney <ext-aaron.2.tunney@nokia.com>
Date: Tue, 5 Apr 2011 11:45:24 +0100
Subject: Updating comment in QHostInfo::localDomainName

Updating comment to indicate that the feature isn't supported on Symbian.

Reviewed-by: Shane Kearns
---
 src/network/kernel/qhostinfo_symbian.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index dcfc490..40ede54 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -206,7 +206,9 @@ QString QHostInfo::localHostName()
 
 QString QHostInfo::localDomainName()
 {
-    // TODO - fill with code.
+    // This concept does not exist on Symbian OS because the device can be on
+    // multiple networks with multiple "local domain" names.
+    // For now, return a null string.
     return QString();
 }
 
-- 
cgit v0.12


From 712e37783210eb8d161b26f090cc240394a1b730 Mon Sep 17 00:00:00 2001
From: Guoqing Zhang <guoqing.zhang@nokia.com>
Date: Tue, 5 Apr 2011 14:35:19 +0300
Subject: Optimize loc.prf for localization

Task-number:
Reviewed-by: Miikka Heikkinen
---
 config.profiles/symbian/loc.prf                    | 52 ++++++++++++++--------
 .../symbian/translations_symbian/translations.pro  | 12 +----
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/config.profiles/symbian/loc.prf b/config.profiles/symbian/loc.prf
index 9973903..dd0644b 100644
--- a/config.profiles/symbian/loc.prf
+++ b/config.profiles/symbian/loc.prf
@@ -1,25 +1,41 @@
+CONFIG += localize_deployment
 
 qtPrepareTool(LRELEASE, lrelease)
 
-loc.CONFIG = no_link
-loc.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
-loc.output = $${EPOCROOT}epoc32/data/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
-loc.input = TRANSLATIONS
-loc.variable_out = PRE_TARGETDEPS
+isEmpty(SYMBIANTRANSLATIONSFILES): SYMBIANTRANSLATIONSFILES = $$symbianRemoveSpecialCharacters($$basename(TARGET))    
+isEmpty(SYMBIANTRANSLATIONS):exists($${EPOCROOT}epoc32/tools/qt/mkspecs/features/symbian/symbian_i18n.prf) {
+    load($${EPOCROOT}epoc32/tools/qt/mkspecs/features/symbian/symbian_i18n.prf)
+}
+isEmpty(SYMBIANTRANSLATIONDIR): SYMBIANTRANSLATIONDIR = $${EPOCROOT}epoc32/data/z/resource/qt/translations
+isEmpty(SYMBIANWINSCWUDEBTRANSLATIONDIR): SYMBIANWINSCWUDEBTRANSLATIONDIR = $${EPOCROOT}epoc32/release/winscw/udeb/z/resource/qt/translations
+isEmpty(SYMBIANWINSCWURELTRANSLATIONDIR): SYMBIANWINSCWURELTRANSLATIONDIR = $${EPOCROOT}epoc32/release/winscw/urel/z/resource/qt/translations
+
+for(FILE, SYMBIANTRANSLATIONSFILES) {
+    for(LANGID, SYMBIANTRANSLATIONS) {    
+        TRANSLATIONS += $${EPOCROOT}epoc32/include/platform/qt/translations/$${FILE}_$${LANGID}.ts
+    }
+}
 
-loc_winscwudeb.CONFIG = no_link
-loc_winscwudeb.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
-loc_winscwudeb.output = $${EPOCROOT}epoc32/release/winscw/udeb/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
-loc_winscwudeb.input = TRANSLATIONS
-loc_winscwudeb.variable_out = PRE_TARGETDEPS
+contains(CONFIG, loc_source_string) {
+    LRELEASE_PARAMS = -qm
+} else {
+    LRELEASE_PARAMS = -idbased -qm
+}
+
+loc.CONFIG = no_link target_predeps  
+loc.commands = $$LRELEASE ${QMAKE_FILE_IN} $$LRELEASE_PARAMS ${QMAKE_FILE_OUT}
+loc.input = TRANSLATIONS
+loc.output = $$SYMBIANTRANSLATIONDIR/${QMAKE_FILE_BASE}.qm
+loc.variable_out = GENERATED_QM_FILES
 
-loc_winscwurel.CONFIG = no_link
-loc_winscwurel.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
-loc_winscwurel.output = $${EPOCROOT}epoc32/release/winscw/urel/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
-loc_winscwurel.input = TRANSLATIONS
-loc_winscwurel.variable_out = PRE_TARGETDEPS
+copy_qm_winscw_udeb.CONFIG = no_link target_predeps
+copy_qm_winscw_udeb.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
+copy_qm_winscw_udeb.input = GENERATED_QM_FILES
+copy_qm_winscw_udeb.output = $$SYMBIANWINSCWUDEBTRANSLATIONDIR/${QMAKE_FILE_BASE}.qm
 
-QMAKE_EXTRA_COMPILERS += loc
-QMAKE_EXTRA_COMPILERS += loc_winscwudeb
-QMAKE_EXTRA_COMPILERS += loc_winscwurel
+copy_qm_winscw_urel.CONFIG = $$copy_qm_winscw_udeb.CONFIG
+copy_qm_winscw_urel.commands = $$copy_qm_winscw_udeb.commands
+copy_qm_winscw_urel.input = $$copy_qm_winscw_udeb.input
+copy_qm_winscw_urel.output = $$SYMBIANWINSCWURELTRANSLATIONDIR/${QMAKE_FILE_BASE}.qm
 
+QMAKE_EXTRA_COMPILERS += loc copy_qm_winscw_udeb copy_qm_winscw_urel
diff --git a/config.profiles/symbian/translations_symbian/translations.pro b/config.profiles/symbian/translations_symbian/translations.pro
index f304c1b..832af21 100644
--- a/config.profiles/symbian/translations_symbian/translations.pro
+++ b/config.profiles/symbian/translations_symbian/translations.pro
@@ -1,16 +1,8 @@
 TEMPLATE = subdirs
 
-
 symbian: {
 SYMBIANTRANSLATIONSFILES = qt
 SYMBIANTRANSLATIONS = ur fa ar he fr pl ru zh_cn zh_tw cs da de es gl hu ja pt sk sl sv uk
-
-CONFIG = loc
-
-for( FILE, SYMBIANTRANSLATIONSFILES ) {
-    for( LANGID, SYMBIANTRANSLATIONS ) {
-        TRANSLATIONS += $${EPOCROOT}epoc32/include/platform/qt/translations/$${FILE}_$${LANGID}.ts
-    }
-}
-
+CONFIG = loc_source_string 
+load(loc.prf)
 }
\ No newline at end of file
-- 
cgit v0.12

-- 
cgit v0.12


From dc474b5d19f66dc3ede087ae6fa8ec6f9245477e Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 5 Apr 2011 15:17:52 +0100
Subject: Add autotests for QHostInfo::abortHostLookup

Test calling the abort from the same thread or from a different thread.
The different thread is to check thread safety of the API.

Reviewed-by: Markus Goetz
---
 tests/auto/qhostinfo/tst_qhostinfo.cpp | 49 ++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp
index 7b2fc55..0e9319f 100644
--- a/tests/auto/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp
@@ -134,6 +134,8 @@ private slots:
 
     void cache();
 
+    void abortHostLookup();
+    void abortHostLookupInDifferentThread();
 protected slots:
     void resultsReady(const QHostInfo &);
 
@@ -583,5 +585,52 @@ void tst_QHostInfo::resultsReady(const QHostInfo &hi)
     QMetaObject::invokeMethod(&QTestEventLoop::instance(), "exitLoop", Qt::QueuedConnection);
 }
 
+void tst_QHostInfo::abortHostLookup()
+{
+    //reset counter
+    lookupsDoneCounter = 0;
+    bool valid = false;
+    int id = -1;
+    QHostInfo result = qt_qhostinfo_lookup("qt.nokia.com", this, SLOT(resultsReady(QHostInfo)), &valid, &id);
+    QVERIFY(!valid);
+    //it is assumed that the DNS request/response in the backend is slower than it takes to call abort
+    QHostInfo::abortHostLookup(id);
+    QTestEventLoop::instance().enterLoop(5);
+    QCOMPARE(lookupsDoneCounter, 0);
+}
+
+class LookupAborter : public QObject
+{
+    Q_OBJECT
+public slots:
+    void abort()
+    {
+        QHostInfo::abortHostLookup(id);
+        QThread::currentThread()->quit();
+    }
+public:
+    int id;
+};
+
+void tst_QHostInfo::abortHostLookupInDifferentThread()
+{
+    //reset counter
+    lookupsDoneCounter = 0;
+    bool valid = false;
+    int id = -1;
+    QHostInfo result = qt_qhostinfo_lookup("qt.nokia.com", this, SLOT(resultsReady(QHostInfo)), &valid, &id);
+    QVERIFY(!valid);
+    QThread thread;
+    LookupAborter aborter;
+    aborter.id = id;
+    aborter.moveToThread(&thread);
+    connect(&thread, SIGNAL(started()), &aborter, SLOT(abort()));
+    //it is assumed that the DNS request/response in the backend is slower than it takes to schedule the thread and call abort
+    thread.start();
+    QVERIFY(thread.wait(5000));
+    QTestEventLoop::instance().enterLoop(5);
+    QCOMPARE(lookupsDoneCounter, 0);
+}
+
 QTEST_MAIN(tst_QHostInfo)
 #include "tst_qhostinfo.moc"
-- 
cgit v0.12


From 3915dd40b967fbf96a53820a8130342280a5b299 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 5 Apr 2011 16:30:19 +0100
Subject: QHostInfo symbian backend finalisation

For reverse lookups, don't report errors, instead just return the IP
address as a string for the host name (for behavioural compability
with the windows and unix backends)
Don't sort IP4 addresses before IP6 addresses for the same host. The
symbian host resolver internally sorts the list so the usable addresses
are returned first. (usable means has a valid route)

Task-number: QTBUG-18135
Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo_symbian.cpp | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp
index 40ede54..2a8de1d 100644
--- a/src/network/kernel/qhostinfo_symbian.cpp
+++ b/src/network/kernel/qhostinfo_symbian.cpp
@@ -117,11 +117,13 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw
         // Synchronous request. nameResult returns Host Name.
         err = hostResolver.GetByAddress(IpAdd, nameResult);
         if (err) {
-            setError_helper(results, err);
+            //for behavioural compatibility with Qt 4.7 and unix/windows
+            //backends: don't report error, return ip address as host name
+            results.setHostName(address.toString());
         } else {
             results.setHostName(qt_TDesC2QString(nameResult().iName));
-            results.setAddresses(QList<QHostAddress>() << address);
         }
+        results.setAddresses(QList<QHostAddress>() << address);
         return results;
     }
 
@@ -188,8 +190,7 @@ QString QHostInfo::localHostName()
     RSocketServ socketServ(qt_symbianGetSocketServer());
     RHostResolver hostResolver;
 
-    // Will return both IPv4 and IPv6
-    // TODO: Pass RHostResolver.Open() the global RConnection
+    // RConnection not required to get the host name
     int err = hostResolver.Open(socketServ, KAfInet, KProtocolInetUdp);
     if (err)
         return QString();
@@ -420,13 +421,7 @@ void QSymbianHostResolver::processNameResult()
 
         // Ensure that record is valid (not an alias and with length greater than 0)
         if (!(iNameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) {
-           if (iNameResult().iAddr.Family() == KAfInet) {
-                // IPv4 - prepend
-                iHostAddresses.prepend(QHostAddress(qt_TDesC2QString(ipAddr)));
-            } else {
-                // IPv6 - append
-                iHostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
-            }
+            iHostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr)));
         }
 
         iState = EGetByName;
@@ -453,11 +448,13 @@ void QSymbianHostResolver::processAddressResult()
     TInt err = iStatus.Int();
 
     if (err < 0) {
-        setError_helper(iResults, err);
+        //For behavioural compatibility with Qt 4.7, don't report errors on reverse lookup,
+        //return the address as a string (same as unix/windows backends)
+        iResults.setHostName(iAddress.toString());
     } else {
         iResults.setHostName(qt_TDesC2QString(iNameResult().iName));
-        iResults.setAddresses(QList<QHostAddress>() << iAddress);
     }
+    iResults.setAddresses(QList<QHostAddress>() << iAddress);
     returnResults();
 }
 
@@ -523,6 +520,7 @@ void QSymbianHostInfoLookupManager::runNextLookup()
             // if spare capacity, try to start another one
             if (iCurrentLookups.count() >= KMaxConcurrentLookups)
                 break;
+            i--; //compensate for removeAt
         }
     }
 }
-- 
cgit v0.12


From 76ef8d709b7bb0458153df85f60b39937664811b Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 5 Apr 2011 16:37:08 +0100
Subject: QHostInfo autotest fixes related to symbian

1. start default network at start of test (this makes the test faster
   and more reliable, as the network can be stopped automatically if
   we don't use a network session)
2. remove unnecessary ifdef from the ipv4 data
3. add new IPv6 test hosts to the ipv6 data
4. extend ipv6 timeout to match the ipv4 timeout
5. check error in LookupThread::run() to avoid test crashing on failure
6. extend timeout for multipleDifferentLookups (uncached DNS is SLOW)
7. enable IPv6 lookups on symbian statically (don't use the broken POSIX
   functions)

Reviewed-by: Markus Goetz
---
 tests/auto/qhostinfo/tst_qhostinfo.cpp | 49 +++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp
index 0e9319f..af0631e 100644
--- a/tests/auto/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp
@@ -62,6 +62,12 @@
 #include <private/qthread_p.h>
 #include <QTcpServer>
 
+#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtNetwork/qnetworkconfigmanager.h>
+#include <QtNetwork/qnetworkconfiguration.h>
+#include <QtNetwork/qnetworksession.h>
+#endif
+
 #include <time.h>
 #include <qlibrary.h>
 #if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
@@ -145,6 +151,11 @@ private:
     bool lookupDone;
     int lookupsDoneCounter;
     QHostInfo lookupResults;
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QScopedPointer<QNetworkSession> networkSession;
+#endif
 };
 
 // Testing get/set functions
@@ -185,6 +196,21 @@ tst_QHostInfo::~tst_QHostInfo()
 
 void tst_QHostInfo::initTestCase()
 {
+#ifndef QT_NO_BEARERMANAGEMENT
+    //start the default network
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession.reset(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
+
+#ifdef Q_OS_SYMBIAN
+    ipv6Available = true;
+    ipv6LookupsAvailable = true;
+#else
     ipv6Available = false;
     ipv6LookupsAvailable = false;
 #if !defined(QT_NO_GETADDRINFO)
@@ -207,6 +233,7 @@ void tst_QHostInfo::initTestCase()
         }
     }
 #endif
+#endif
 
     QTcpServer server;
     if (server.listen(QHostAddress("::1"))) {
@@ -240,18 +267,14 @@ void tst_QHostInfo::lookupIPv4_data()
     QTest::addColumn<QString>("addresses");
     QTest::addColumn<int>("err");
 
-#ifdef Q_OS_SYMBIAN
     // Test server lookup
     QTest::newRow("lookup_01") << QtNetworkSettings::serverName() << QtNetworkSettings::serverIP().toString() << int(QHostInfo::NoError);
-    QTest::newRow("literal_ip4") << QtNetworkSettings::serverIP().toString() << QtNetworkSettings::serverIP().toString() << int(QHostInfo::NoError);
-    QTest::newRow("multiple_ip4") << "multi.dev.troll.no" << "1.2.3.4 1.2.3.5 10.3.3.31" << int(QHostInfo::NoError);
-#else
     QTest::newRow("empty") << "" << "" << int(QHostInfo::HostNotFound);
 
     QTest::newRow("single_ip4") << "lupinella.troll.no" << lupinellaIp << int(QHostInfo::NoError);
     QTest::newRow("multiple_ip4") << "multi.dev.troll.no" << "1.2.3.4 1.2.3.5 10.3.3.31" << int(QHostInfo::NoError);
     QTest::newRow("literal_ip4") << lupinellaIp << lupinellaIp << int(QHostInfo::NoError);
-#endif
+
     QTest::newRow("notfound") << "this-name-does-not-exist-hopefully." << "" << int(QHostInfo::HostNotFound);
 
     QTest::newRow("idn-ace") << "xn--alqualond-34a.troll.no" << "10.3.3.55" << int(QHostInfo::NoError);
@@ -293,8 +316,11 @@ void tst_QHostInfo::lookupIPv6_data()
     QTest::addColumn<QString>("addresses");
     QTest::addColumn<int>("err");
 
-    QTest::newRow("ip6") << "www.ipv6-net.org" << "62.93.217.177 2001:618:1401:0:0:0:0:4" << int(QHostInfo::NoError);
-    QTest::newRow("ip6") << "ipv6.google.com" << "2A00:1450:8007:0:0:0:0:63" << int(QHostInfo::NoError);
+    QTest::newRow("ipv6-net") << "www.ipv6-net.org" << "62.93.217.177 2001:618:1401:0:0:0:0:4" << int(QHostInfo::NoError);
+    QTest::newRow("ipv6-test") << "ipv6-test.dev.troll.no" << "2001:638:a00:2:0:0:0:2" << int(QHostInfo::NoError);
+    QTest::newRow("dns6-test") << "dns6-test-dev.troll.no" << "2001:470:1f01:115:0:0:0:10" << int(QHostInfo::NoError);
+    QTest::newRow("multi-dns6") << "multi-dns6-test-dev.troll.no" << "2001:470:1f01:115:0:0:0:11 2001:470:1f01:115:0:0:0:12" << int(QHostInfo::NoError);
+    QTest::newRow("dns46-test") << "dns46-test-dev.troll.no" << "10.3.4.90 2001:470:1f01:115:0:0:0:13" << int(QHostInfo::NoError);
 
     // avoid using real IPv6 addresses here because this will do a DNS query
     // real addresses are between 2000:: and 3fff:ffff:ffff:ffff:ffff:ffff:ffff
@@ -314,7 +340,7 @@ void tst_QHostInfo::lookupIPv6()
     lookupDone = false;
     QHostInfo::lookupHost(hostname, this, SLOT(resultsReady(const QHostInfo&)));
 
-    QTestEventLoop::instance().enterLoop(3);
+    QTestEventLoop::instance().enterLoop(10);
     QVERIFY(!QTestEventLoop::instance().timeout());
     QVERIFY(lookupDone);
 
@@ -415,6 +441,8 @@ protected:
     inline void run()
     {
          QHostInfo info = QHostInfo::fromName("qt.nokia.com");
+         QCOMPARE(info.error(), QHostInfo::NoError);
+         QVERIFY(info.addresses().count() > 0);
          QCOMPARE(info.addresses().at(0).toString(), QString("87.238.50.178"));
     }
 };
@@ -532,8 +560,9 @@ void tst_QHostInfo::multipleDifferentLookups()
 
     QElapsedTimer timer;
     timer.start();
-    while (timer.elapsed() < 10000 && lookupsDoneCounter < repeats*COUNT) {
+    while (timer.elapsed() < 60000 && lookupsDoneCounter < repeats*COUNT) {
         QTestEventLoop::instance().enterLoop(2);
+        //qDebug() << "t:" << timer.elapsed();
     }
     QCOMPARE(lookupsDoneCounter, repeats*COUNT);
 }
@@ -574,7 +603,7 @@ void tst_QHostInfo::cache()
     QVERIFY(result.addresses().isEmpty());
 
     // the slot should have been called 2 times.
-    QVERIFY(lookupsDoneCounter == 2);
+    QCOMPARE(lookupsDoneCounter, 2);
 }
 
 void tst_QHostInfo::resultsReady(const QHostInfo &hi)
-- 
cgit v0.12


From c08089639f540cb61cebc92bc6ad2a587550af47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 10:32:05 +0200
Subject: Implemented _NET_WM_PING protocol in XCB backend.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 1f4a13c..4a9409c 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -169,7 +169,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     int propertyCount = 0;
     properties[propertyCount++] = atom(QXcbAtom::WM_DELETE_WINDOW);
     properties[propertyCount++] = atom(QXcbAtom::WM_TAKE_FOCUS);
-//    properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
+    properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
 
     if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint)
         properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP);
@@ -466,6 +466,14 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even
     if (event->format == 32 && event->type == atom(QXcbAtom::WM_PROTOCOLS)) {
         if (event->data.data32[0] == atom(QXcbAtom::WM_DELETE_WINDOW)) {
             QWindowSystemInterface::handleCloseEvent(widget());
+        } else if (event->data.data32[0] == atom(QXcbAtom::_NET_WM_PING)) {
+            xcb_client_message_event_t reply = *event;
+
+            reply.response_type = XCB_CLIENT_MESSAGE;
+            reply.window = m_screen->root();
+
+            xcb_send_event(xcb_connection(), 0, m_screen->root(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&reply);
+            xcb_flush(xcb_connection());
         }
     }
 }
-- 
cgit v0.12


From 4de04d2b15e63287e7436a4ad60a383d959aee34 Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Wed, 6 Apr 2011 10:37:52 +0200
Subject: use at() instead of [] for const access

---
 src/gui/painting/qcolormap_qpa.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/painting/qcolormap_qpa.cpp b/src/gui/painting/qcolormap_qpa.cpp
index 1f4fea8..f66607b 100644
--- a/src/gui/painting/qcolormap_qpa.cpp
+++ b/src/gui/painting/qcolormap_qpa.cpp
@@ -70,7 +70,7 @@ void QColormap::initialize()
     QPlatformIntegration *pi = QApplicationPrivate::platformIntegration();
     QList<QPlatformScreen*> screens = pi->screens();
 
-    screenMap->depth = screens[0]->depth();
+    screenMap->depth = screens.at(0)->depth();
     if (screenMap->depth < 8) {
         screenMap->mode = QColormap::Indexed;
         screenMap->numcolors = 256;
-- 
cgit v0.12


From e19229a9f1f69d9f486c8adbba17a4b6ab3cb26b Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Wed, 6 Apr 2011 10:39:40 +0200
Subject: qFatal() if no connection to wayland is available
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

abort here is the only thing that makes sense, otherwise, we'll get
crashes all over Qt.

Reviewed-by: Jørgen Lind
---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index b79f355..1c1702f 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -53,6 +53,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <errno.h>
 
 struct wl_surface *QWaylandDisplay::createSurface(void *handle)
 {
@@ -186,8 +187,8 @@ QWaylandDisplay::QWaylandDisplay(void)
 {
     mDisplay = wl_display_connect(NULL);
     if (mDisplay == NULL) {
-        fprintf(stderr, "failed to create display: %m\n");
-        return;
+        qErrnoWarning(errno, "Failed to create display");
+        qFatal("No wayland connection available.");
     }
 
     wl_display_add_global_listener(mDisplay,
-- 
cgit v0.12


From 97581fbc6ba777936e101b6819f364c18ad4429c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 10:39:36 +0200
Subject: Flush XCB connection before blocking.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 2a220af..674bbfd 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -462,6 +462,8 @@ void QXcbConnection::processXcbEvents()
         else
             printXcbEvent("Unhandled XCB event", event);
     }
+
+    xcb_flush(xcb_connection());
 }
 
 static const char * xcb_atomnames = {
-- 
cgit v0.12


From db566040b68dd175200c1e99a0ae410ed89df25d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 10:40:39 +0200
Subject: Re-added missing call log in XCB backend.

---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 674bbfd..84d98e8 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -375,6 +375,7 @@ void QXcbConnection::log(const char *file, int line, int sequence)
     info.sequence = sequence;
     info.file = file;
     info.line = line;
+    m_callLog << info;
 }
 #endif
 
-- 
cgit v0.12


From 58b426fb62774b328be77f0c1b7bd31e0321daf0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 31 Mar 2011 15:58:46 +0200
Subject: Lighthouse: Make wayland event handling happen in a separate thread

---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp  | 101 ++++-----------------
 src/plugins/platforms/wayland/qwaylanddisplay.h    |  30 ++----
 src/plugins/platforms/wayland/qwaylandscreen.cpp   |   1 +
 .../platforms/wayland/qwaylandshmsurface.cpp       |   4 +-
 .../platforms/wayland/qwaylandshmwindow.cpp        |  37 +-------
 src/plugins/platforms/wayland/qwaylandshmwindow.h  |   9 --
 src/plugins/platforms/wayland/qwaylandwindow.cpp   |  56 +++++++++++-
 src/plugins/platforms/wayland/qwaylandwindow.h     |  14 ++-
 src/plugins/platforms/wayland/wayland.pro          |   6 +-
 9 files changed, 104 insertions(+), 154 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index 1c1702f..4f456c9 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -45,11 +45,14 @@
 #include "qwaylandscreen.h"
 #include "qwaylandcursor.h"
 #include "qwaylandinputdevice.h"
+#include "qwaylandeventthread.h"
 
 #ifdef QT_WAYLAND_GL_SUPPORT
 #include "gl_integration/qwaylandglintegration.h"
 #endif
 
+#include <QtGui/QApplication>
+
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -110,117 +113,53 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = {
     QWaylandDisplay::shellHandleConfigure,
 };
 
-void QWaylandDisplay::outputHandleGeometry(void *data,
-                                           struct wl_output *output,
-                                           int32_t x, int32_t y,
-                                           int32_t width, int32_t height)
-{
-    QWaylandDisplay *waylandDisplay = (QWaylandDisplay *) data;
-
-    QRect outputRect = QRect(x, y, width, height);
-    waylandDisplay->createNewScreen(output, outputRect);
-}
-
-const struct wl_output_listener QWaylandDisplay::outputListener = {
-    QWaylandDisplay::outputHandleGeometry
-};
-
-void QWaylandDisplay::displayHandleGlobal(struct wl_display *display,
-                                          uint32_t id,
-                                          const char *interface,
-                                          uint32_t version, void *data)
+void QWaylandDisplay::displayHandleGlobal(uint32_t id, QByteArray interface, uint32_t version)
 {
     Q_UNUSED(version);
-    QWaylandDisplay *qwd = (QWaylandDisplay *) data;
-
-    if (strcmp(interface, "compositor") == 0) {
-        qwd->mCompositor = wl_compositor_create(display, id);
-    } else if (strcmp(interface, "shm") == 0) {
-        qwd->mShm = wl_shm_create(display, id);
-    } else if (strcmp(interface, "shell") == 0) {
-        qwd->mShell = wl_shell_create(display, id);
-        wl_shell_add_listener(qwd->mShell, &shellListener, qwd);
-    } else if (strcmp(interface, "output") == 0) {
-        struct wl_output *output = wl_output_create(display, id);
-        wl_output_add_listener(output, &outputListener, qwd);
-    } else if (strcmp(interface, "input_device") == 0) {
+
+    if (interface == "compositor") {
+        mCompositor = wl_compositor_create(mDisplay, id);
+    } else if (interface == "shm") {
+        mShm = wl_shm_create(mDisplay, id);
+    } else if (interface == "shell"){
+        mShell = wl_shell_create(mDisplay, id);
+        wl_shell_add_listener(mShell, &shellListener, this);
+    } else if (interface == "input_device") {
         QWaylandInputDevice *inputDevice =
-            new QWaylandInputDevice(display, id);
-        qwd->mInputDevices.append(inputDevice);
+            new QWaylandInputDevice(mDisplay, id);
+        mInputDevices.append(inputDevice);
     }
 }
 
-void QWaylandDisplay::iterate()
-{
-    wl_display_iterate(mDisplay, WL_DISPLAY_READABLE | WL_DISPLAY_WRITABLE);
-}
-
-void QWaylandDisplay::readEvents(void)
-{
-    wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
-}
-
-int
-QWaylandDisplay::sourceUpdate(uint32_t mask, void *data)
-{
-    QWaylandDisplay *qwd = (QWaylandDisplay *) data;
-
-    /* FIXME: We get a callback here when we ask wl_display for the
-     * fd, but at that point we don't have the socket notifier as we
-     * need the fd to create that.  We'll probably need to split that
-     * API into get_fd and set_update_func functions. */
-    if (qwd->mWriteNotifier == NULL)
-        return 0;
-
-    qwd->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE);
-
-    return 0;
-}
-
-void QWaylandDisplay::flushRequests(void)
-{
-    wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE);
-}
-
 QWaylandDisplay::QWaylandDisplay(void)
-    : mWriteNotifier(0)
 {
     mDisplay = wl_display_connect(NULL);
     if (mDisplay == NULL) {
         qErrnoWarning(errno, "Failed to create display");
         qFatal("No wayland connection available.");
     }
-
-    wl_display_add_global_listener(mDisplay,
-                                   QWaylandDisplay::displayHandleGlobal, this);
-
 #ifdef QT_WAYLAND_GL_SUPPORT
     mEglIntegration = QWaylandGLIntegration::createGLIntegration(this);
 #endif
 
-    readEvents();
+    mEventThread = new QWaylandEventThread(this);
+
+
+    mEventThread->waitForScreens();
 
 #ifdef QT_WAYLAND_GL_SUPPORT
     mEglIntegration->initialize();
 #endif
 
-    int fd = wl_display_get_fd(mDisplay, sourceUpdate, this);
-    mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
-    connect(mReadNotifier,
-            SIGNAL(activated(int)), this, SLOT(readEvents()));
 
-    mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this);
-    connect(mWriteNotifier,
-            SIGNAL(activated(int)), this, SLOT(flushRequests()));
-    mWriteNotifier->setEnabled(false);
 }
 
 QWaylandDisplay::~QWaylandDisplay(void)
 {
-    close(mFd);
 #ifdef QT_WAYLAND_GL_SUPPORT
     delete mEglIntegration;
 #endif
+    delete mEventThread;
     wl_display_destroy(mDisplay);
 }
 
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index 481f829..4cfb7b5 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -45,6 +45,8 @@
 #include <QtCore/QObject>
 #include <QtCore/QRect>
 
+#include <QtCore/QWaitCondition>
+
 #include <wayland-client.h>
 
 class QWaylandInputDevice;
@@ -53,6 +55,7 @@ class QWaylandBuffer;
 class QPlatformScreen;
 class QWaylandScreen;
 class QWaylandGLIntegration;
+class QWaylandEventThread;
 
 class QWaylandDisplay : public QObject {
     Q_OBJECT
@@ -61,7 +64,6 @@ public:
     QWaylandDisplay(void);
     ~QWaylandDisplay(void);
 
-    void createNewScreen(struct wl_output *output, QRect geometry);
     QList<QPlatformScreen *> screens() const { return mScreens; }
     struct wl_surface *createSurface(void *handle);
     struct wl_buffer *createShmBuffer(int fd, int width, int height,
@@ -76,49 +78,33 @@ public:
 #endif
     void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
 
+
     void syncCallback(wl_display_sync_func_t func, void *data);
     void frameCallback(wl_display_frame_func_t func, void *data);
 
-    void iterate();
-
     struct wl_display *wl_display() const { return mDisplay; }
 public slots:
-    void readEvents(void);
-    void flushRequests(void);
+    void createNewScreen(struct wl_output *output, QRect geometry);
+    void displayHandleGlobal(uint32_t id, QByteArray interface, uint32_t version);
 
 private:
     struct wl_display *mDisplay;
+    QWaylandEventThread *mEventThread;
     struct wl_compositor *mCompositor;
     struct wl_shm *mShm;
     struct wl_shell *mShell;
-    char *mDeviceName;
-    int mFd;
     QList<QPlatformScreen *> mScreens;
     QList<QWaylandInputDevice *> mInputDevices;
-    QSocketNotifier *mReadNotifier;
-    QSocketNotifier *mWriteNotifier;
+
 #ifdef QT_WAYLAND_GL_SUPPORT
     QWaylandGLIntegration *mEglIntegration;
 #endif
 
-    static void displayHandleGlobal(struct wl_display *display,
-                                    uint32_t id,
-                                    const char *interface,
-                                    uint32_t version, void *data);
-
-    static void outputHandleGeometry(void *data,
-                                     struct wl_output *output,
-                                     int32_t x, int32_t y,
-                                     int32_t width, int32_t height);
-
     static void shellHandleConfigure(void *data, struct wl_shell *shell,
                                      uint32_t time, uint32_t edges,
                                      struct wl_surface *surface,
                                      int32_t width, int32_t height);
 
-    static int sourceUpdate(uint32_t mask, void *data);
-
-    static const struct wl_output_listener outputListener;
     static const struct wl_shell_listener shellListener;
 };
 
diff --git a/src/plugins/platforms/wayland/qwaylandscreen.cpp b/src/plugins/platforms/wayland/qwaylandscreen.cpp
index 35e2532..4f50cb6 100644
--- a/src/plugins/platforms/wayland/qwaylandscreen.cpp
+++ b/src/plugins/platforms/wayland/qwaylandscreen.cpp
@@ -53,6 +53,7 @@ QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output
     , mFormat(QImage::Format_ARGB32_Premultiplied)
     , mWaylandCursor(new QWaylandCursor(this))
 {
+    moveToThread(waylandDisplay->thread());
 }
 
 QWaylandScreen::~QWaylandScreen()
diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
index cc6b2a1..34f4436 100644
--- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
@@ -111,9 +111,7 @@ void QWaylandShmWindowSurface::beginPaint(const QRegion &)
 {
     QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
     Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
-    while (waylandWindow->waitingForFrameSync()) {
-        mDisplay->iterate();
-    }
+    waylandWindow->waitForFrameSync();
 }
 
 void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
index 2808ed6..c083e58 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
@@ -45,10 +45,10 @@
 
 #include <QtCore/QVector>
 
+#include <QtCore/QDebug>
+
 QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
     : QWaylandWindow(widget)
-    , mBuffer(0)
-    , mWaitingForFrameSync(false)
 {
     newSurfaceCreated();
 }
@@ -69,36 +69,3 @@ QPlatformGLContext * QWaylandShmWindow::glContext() const
     return 0;
 }
 
-void QWaylandShmWindow::attach(QWaylandBuffer *buffer)
-{
-    mBuffer = buffer;
-    if (mSurface) {
-        wl_surface_attach(mSurface, buffer->buffer(),0,0);
-    }
-}
-
-
-void QWaylandShmWindow::damage(const QRegion &region)
-{
-    QVector<QRect> rects = region.rects();
-    for (int i = 0; i < rects.size(); i++) {
-        const QRect rect = rects.at(i);
-        wl_surface_damage(mSurface,
-                          rect.x(), rect.y(), rect.width(), rect.height());
-    }
-    mWaitingForFrameSync = true;
-    mDisplay->frameCallback(QWaylandShmWindow::frameCallback, this);
-}
-
-void QWaylandShmWindow::newSurfaceCreated()
-{
-    if (mBuffer) {
-        wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
-    }
-}
-
-void QWaylandShmWindow::frameCallback(void *data, uint32_t time)
-{
-    QWaylandShmWindow *self = static_cast<QWaylandShmWindow*>(data);
-    self->mWaitingForFrameSync = false;
-}
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.h b/src/plugins/platforms/wayland/qwaylandshmwindow.h
index 3876c52..5dc6351 100644
--- a/src/plugins/platforms/wayland/qwaylandshmwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.h
@@ -53,15 +53,6 @@ public:
 
     WindowType windowType() const;
     QPlatformGLContext *glContext() const;
-    void attach(QWaylandBuffer *buffer);
-    void damage(const QRegion &region);
-    bool waitingForFrameSync() const { return mWaitingForFrameSync; }
-protected:
-    void newSurfaceCreated();
-private:
-    static void frameCallback(void *data, uint32_t time);
-    QWaylandBuffer *mBuffer;
-    bool mWaitingForFrameSync;
 };
 
 #endif // QWAYLANDSHMWINDOW_H
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index e994616..aa72ad5 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -43,6 +43,7 @@
 
 #include "qwaylanddisplay.h"
 #include "qwaylandscreen.h"
+#include "qwaylandbuffer.h"
 
 #include <QtGui/QWidget>
 #include <QtGui/QWindowSystemInterface>
@@ -52,6 +53,8 @@
 QWaylandWindow::QWaylandWindow(QWidget *window)
     : QPlatformWindow(window)
     , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+    , mBuffer(0)
+    , mWaitingForFrameSync(false)
 {
     static WId id = 1;
     mWindowId = id++;
@@ -73,7 +76,7 @@ WId QWaylandWindow::winId() const
 void QWaylandWindow::setParent(const QPlatformWindow *parent)
 {
     Q_UNUSED(parent);
-    qWarning("Trying to add a raster window as a sub-window");
+    qWarning("Sub window is not supported");
 }
 
 void QWaylandWindow::setVisible(bool visible)
@@ -103,3 +106,54 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges,
 
     QWindowSystemInterface::handleGeometryChange(widget(), geometry);
 }
+
+void QWaylandWindow::attach(QWaylandBuffer *buffer)
+{
+    mBuffer = buffer;
+    if (mSurface) {
+        wl_surface_attach(mSurface, buffer->buffer(),0,0);
+    }
+}
+
+
+void QWaylandWindow::damage(const QRegion &region)
+{
+    //We have to do sync stuff before calling damage, or we might
+    //get a frame callback before we get the timestamp
+    mDisplay->frameCallback(QWaylandWindow::frameCallback, this);
+    mWaitingForFrameSync = true;
+
+    QVector<QRect> rects = region.rects();
+    for (int i = 0; i < rects.size(); i++) {
+        const QRect rect = rects.at(i);
+        wl_surface_damage(mSurface,
+                          rect.x(), rect.y(), rect.width(), rect.height());
+    }
+}
+
+void QWaylandWindow::newSurfaceCreated()
+{
+    if (mBuffer) {
+        wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
+    }
+}
+
+void QWaylandWindow::frameCallback(void *data, uint32_t time)
+{
+    Q_UNUSED(time);
+    QWaylandWindow *self = static_cast<QWaylandWindow*>(data);
+    if (self->mWaitingForFrameSync) {
+        self->mWaitingForFrameSync = false;
+        self->mFrameSyncWait.wakeAll();
+    }
+}
+
+void QWaylandWindow::waitForFrameSync()
+{
+    if (!mWaitingForFrameSync) {
+        return;
+    }
+    QMutex lock;
+    lock.lock();
+    mFrameSyncWait.wait(&lock);
+}
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
index afc214e..ad4bba4 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -43,6 +43,8 @@
 #define QWAYLANDWINDOW_H
 
 #include <QtGui/QPlatformWindow>
+#include <QtCore/QWaitCondition>
+#include <QtCore/QMutex>
 
 #include "qwaylanddisplay.h"
 
@@ -69,11 +71,21 @@ public:
     void configure(uint32_t time, uint32_t edges,
                    int32_t x, int32_t y, int32_t width, int32_t height);
 
+    void attach(QWaylandBuffer *buffer);
+    void damage(const QRegion &region);
+
+    void waitForFrameSync();
 protected:
     struct wl_surface *mSurface;
-    virtual void newSurfaceCreated() = 0;
+    virtual void newSurfaceCreated();
     QWaylandDisplay *mDisplay;
+    QWaylandBuffer *mBuffer;
     WId mWindowId;
+    bool mWaitingForFrameSync;
+    QWaitCondition mFrameSyncWait;
+
+private:
+    static void frameCallback(void *data, uint32_t time);
 
 
 };
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index e5c866b..849299a 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -14,7 +14,8 @@ SOURCES =   main.cpp \
             qwaylanddisplay.cpp \
             qwaylandwindow.cpp \
             qwaylandscreen.cpp \
-            qwaylandshmwindow.cpp
+            qwaylandshmwindow.cpp \
+            qwaylandeventthread.cpp
 
 HEADERS =   qwaylandintegration.h \
             qwaylandcursor.h \
@@ -23,7 +24,8 @@ HEADERS =   qwaylandintegration.h \
             qwaylandscreen.h \
             qwaylandshmsurface.h \
             qwaylandbuffer.h \
-            qwaylandshmwindow.h
+            qwaylandshmwindow.h \
+            qwaylandeventthread.h
 
 INCLUDEPATH += $$QMAKE_INCDIR_WAYLAND
 LIBS += $$QMAKE_LIBS_WAYLAND
-- 
cgit v0.12


From fa5ae72b036f64b6f30c6b25a8c3feffcb56b51b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 31 Mar 2011 15:13:28 +0200
Subject: After we make the QPlatformIntegration process events

---
 src/gui/kernel/qapplication_qpa.cpp                |   2 +
 .../platforms/wayland/qwaylandeventthread.cpp      | 158 +++++++++++++++++++++
 .../platforms/wayland/qwaylandeventthread.h        |  87 ++++++++++++
 3 files changed, 247 insertions(+)
 create mode 100644 src/plugins/platforms/wayland/qwaylandeventthread.cpp
 create mode 100644 src/plugins/platforms/wayland/qwaylandeventthread.h

diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp
index 1d4400a..b1f26fd 100644
--- a/src/gui/kernel/qapplication_qpa.cpp
+++ b/src/gui/kernel/qapplication_qpa.cpp
@@ -564,6 +564,8 @@ void qt_init(QApplicationPrivate *priv, int type)
     init_platform(QLatin1String(platformName), platformPluginPath);
     init_plugins(pluginList);
 
+    QApplication::processEvents();
+
     QColormap::initialize();
     QFont::initialize();
 #ifndef QT_NO_CURSOR
diff --git a/src/plugins/platforms/wayland/qwaylandeventthread.cpp b/src/plugins/platforms/wayland/qwaylandeventthread.cpp
new file mode 100644
index 0000000..1474d9c
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandeventthread.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandeventthread.h"
+
+#include <QtCore/QMetaType>
+
+QWaylandEventThread::QWaylandEventThread(QWaylandDisplay *display)
+    : QObject()
+    , mDisplay(display)
+    , mReadNotifier(0)
+    , mWriteNotifier(0)
+    , mFd(0)
+    , mScreensInitialized(false)
+{
+    qRegisterMetaType<uint32_t>("uint32_t");
+    QThread *thread = new QThread(this);
+    moveToThread(thread);
+    connect(thread,SIGNAL(started()),SLOT(runningInThread()));
+    thread->start();
+
+}
+
+QWaylandEventThread::~QWaylandEventThread()
+{
+    close(mFd);
+}
+
+void QWaylandEventThread::runningInThread()
+{
+
+    wl_display_add_global_listener(mDisplay->wl_display(),
+                                   QWaylandEventThread::displayHandleGlobal, this);
+    int fd = wl_display_get_fd(mDisplay->wl_display(), sourceUpdate, this);
+    mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
+    connect(mReadNotifier,
+            SIGNAL(activated(int)), this, SLOT(readEvents()));
+
+    mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this);
+    connect(mWriteNotifier,
+            SIGNAL(activated(int)), this, SLOT(flushRequests()));
+    mWriteNotifier->setEnabled(false);
+
+    readEvents();
+}
+
+
+int QWaylandEventThread::sourceUpdate(uint32_t mask, void *data)
+{
+    QWaylandEventThread *eventThread = (QWaylandEventThread *) data;
+
+    /* FIXME: We get a callback here when we ask wl_display for the
+     * fd, but at that point we don't have the socket notifier as we
+     * need the fd to create that.  We'll probably need to split that
+     * API into get_fd and set_update_func functions. */
+    if (eventThread->mWriteNotifier == NULL)
+        return 0;
+
+    QMetaObject::invokeMethod(eventThread->mWriteNotifier,"setEnabled",Qt::QueuedConnection,
+                              Q_ARG(bool,mask & WL_DISPLAY_WRITABLE));
+//    eventThread->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE);
+
+    return 0;
+}
+
+void QWaylandEventThread::readEvents()
+{
+    wl_display_iterate(mDisplay->wl_display(), WL_DISPLAY_READABLE);
+}
+
+
+void QWaylandEventThread::flushRequests()
+{
+    wl_display_iterate(mDisplay->wl_display(), WL_DISPLAY_WRITABLE);
+}
+
+void QWaylandEventThread::outputHandleGeometry(void *data,
+                                           struct wl_output *output,
+                                           int32_t x, int32_t y,
+                                           int32_t width, int32_t height)
+{
+    //call back function called from another thread;
+    //but its safe to call createScreen from another thread since
+    //QWaylandScreen does a moveToThread
+    QWaylandEventThread *waylandEventThread = static_cast<QWaylandEventThread *>(data);
+    QRect outputRect = QRect(x, y, width, height);
+    waylandEventThread->mDisplay->createNewScreen(output,outputRect);
+    waylandEventThread->mScreensInitialized = true;
+    waylandEventThread->mWaitForScreens.wakeAll();
+}
+
+const struct wl_output_listener QWaylandEventThread::outputListener = {
+    QWaylandEventThread::outputHandleGeometry
+};
+
+void QWaylandEventThread::displayHandleGlobal(wl_display *display,
+                                              uint32_t id,
+                                              const char *interface,
+                                              uint32_t version,
+                                              void *data)
+{
+    if (strcmp(interface, "output") == 0) {
+        struct wl_output *output = wl_output_create(display, id);
+        wl_output_add_listener(output, &outputListener, data);
+    }
+    Q_UNUSED(display);
+    QWaylandEventThread *that = static_cast<QWaylandEventThread *>(data);
+    QByteArray interfaceByteArray(interface);
+    QMetaObject::invokeMethod(that->mDisplay,"displayHandleGlobal",Qt::QueuedConnection,
+                              Q_ARG(uint32_t,id),Q_ARG(QByteArray,interfaceByteArray),Q_ARG(uint32_t,version));
+}
+
+void QWaylandEventThread::waitForScreens()
+{
+    QMutex lock;
+    lock.lock();
+    if (!mScreensInitialized) {
+        mWaitForScreens.wait(&lock);
+    }
+}
diff --git a/src/plugins/platforms/wayland/qwaylandeventthread.h b/src/plugins/platforms/wayland/qwaylandeventthread.h
new file mode 100644
index 0000000..7a5189e
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandeventthread.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDEVENTTHREAD_H
+#define QWAYLANDEVENTTHREAD_H
+
+#include "qwaylanddisplay.h"
+
+#include <QtCore/QObject>
+#include <QtCore/QThread>
+#include <QtCore/QSocketNotifier>
+#include <QtCore/QMutex>
+
+class QWaylandEventThread : public QObject
+{
+    Q_OBJECT
+public:
+    explicit QWaylandEventThread(QWaylandDisplay *display);
+    ~QWaylandEventThread();
+
+    static int sourceUpdate(uint32_t mask, void *data);
+
+    void waitForScreens();
+
+signals:
+public slots:
+    void runningInThread();
+    void readEvents();
+    void flushRequests();
+private:
+    QWaylandDisplay *mDisplay;
+    QSocketNotifier *mReadNotifier;
+    QSocketNotifier *mWriteNotifier;
+    int mFd;
+    QWaitCondition mWaitForScreens;
+    bool mScreensInitialized;
+
+    static const struct wl_output_listener outputListener;
+    static void displayHandleGlobal(struct wl_display *display,
+                                    uint32_t id,
+                                    const char *interface,
+                                    uint32_t version, void *data);
+    static void outputHandleGeometry(void *data,
+                                     struct wl_output *output,
+                                     int32_t x, int32_t y,
+                                     int32_t width, int32_t height);
+};
+
+#endif // QWAYLANDEVENTTHREAD_H
-- 
cgit v0.12


From 111b2e2ba991f1406928c81780308ef832156fa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 6 Apr 2011 10:15:05 +0200
Subject: Lighthouse: More meaning full output when choosing glx configs

---
 src/plugins/platforms/glxconvenience/qglxconvenience.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
index f548ad9..fd3c4c4 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -108,7 +108,7 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindow
     }
 
     if (!chosenConfig)
-        qWarning("Warning no context created");
+        qWarning("Warning: no suitable glx confiuration found");
 
     return chosenConfig;
 }
-- 
cgit v0.12


From e82b69ed193d331072b9f398b214a0322ed7b1b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 6 Apr 2011 10:16:51 +0200
Subject: Lighthouse: Implement xcomposite extension for wayland

---
 .../wayland/gl_integration/gl_integration.pri      |   4 +
 .../qwaylandxcompositeglxcontext.cpp               | 101 +++++++++++++++++
 .../xcomposite_glx/qwaylandxcompositeglxcontext.h  |  43 +++++++
 .../qwaylandxcompositeglxintegration.cpp           |  85 ++++++++++++++
 .../qwaylandxcompositeglxintegration.h             |  52 +++++++++
 .../xcomposite_glx/qwaylandxcompositeglxwindow.cpp |  36 ++++++
 .../xcomposite_glx/qwaylandxcompositeglxwindow.h   |  24 ++++
 .../xcomposite_glx/xcomposite_glx.pri              |  13 +++
 .../xcomposite_share/qwaylandxcompositebuffer.cpp  |  18 +++
 .../xcomposite_share/qwaylandxcompositebuffer.h    |  21 ++++
 .../wayland-xcomposite-client-protocol.h           | 126 +++++++++++++++++++++
 .../xcomposite_share/wayland-xcomposite-protocol.c |  41 +++++++
 .../xcomposite_share/xcomposite_share.pri          |   9 ++
 13 files changed, 573 insertions(+)
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri

diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index 10567cd..52272c3 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -17,3 +17,7 @@ xpixmap_egl {
 xpixmap_glx {
     include ($$PWD/xpixmap_glx/xpixmap_glx.pri)
 }
+
+xcomposite_glx {
+    include ($$PWD/xcomposite_glx/xcomposite_glx.pri)
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
new file mode 100644
index 0000000..679772c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
@@ -0,0 +1,101 @@
+#include "qwaylandxcompositeglxcontext.h"
+
+#include "qwaylandxcompositeglxwindow.h"
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+#include <QtCore/QDebug>
+
+#include <X11/extensions/Xcomposite.h>
+
+QWaylandXCompositeGLXContext::QWaylandXCompositeGLXContext(QWaylandXCompositeGLXIntegration *glxIntegration, QWaylandXCompositeGLXWindow *window)
+    : QPlatformGLContext()
+    , mGlxIntegration(glxIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mXWindow(0)
+    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+{
+    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
+    mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
+
+    geometryChanged();
+}
+
+void QWaylandXCompositeGLXContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+    glXMakeCurrent(mGlxIntegration->xDisplay(),mXWindow,mContext);
+}
+
+void QWaylandXCompositeGLXContext::doneCurrent()
+{
+    glXMakeCurrent(mGlxIntegration->xDisplay(),0,0);
+    QPlatformGLContext::doneCurrent();
+}
+
+void QWaylandXCompositeGLXContext::swapBuffers()
+{
+    QSize size = mWindow->geometry().size();
+
+    glXSwapBuffers(mGlxIntegration->xDisplay(),mXWindow);
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+    mWindow->waitForFrameSync();
+}
+
+void * QWaylandXCompositeGLXContext::getProcAddress(const QString &procName)
+{
+    return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QWaylandXCompositeGLXContext::platformWindowFormat() const
+{
+    return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+}
+
+void QWaylandXCompositeGLXContext::sync_function(void *data)
+{
+    QWaylandXCompositeGLXContext *that = static_cast<QWaylandXCompositeGLXContext *>(data);
+    that->mWaitCondition.wakeAll();
+}
+
+void QWaylandXCompositeGLXContext::geometryChanged()
+{
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
+    delete mBuffer;
+    //XFreePixmap deletes the glxPixmap as well
+    if (mXWindow) {
+        XDestroyWindow(mGlxIntegration->xDisplay(),mXWindow);
+    }
+
+    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(mGlxIntegration->xDisplay(),mConfig);
+    Colormap cmap = XCreateColormap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),visualInfo->visual,AllocNone);
+
+    XSetWindowAttributes a;
+    a.colormap = cmap;
+    mXWindow = XCreateWindow(mGlxIntegration->xDisplay(), mGlxIntegration->rootWindow(),0, 0, size.width(), size.height(),
+                             0, visualInfo->depth, InputOutput, visualInfo->visual,
+                             CWColormap, &a);
+
+    XCompositeRedirectWindow(mGlxIntegration->xDisplay(), mXWindow, CompositeRedirectManual);
+    XMapWindow(mGlxIntegration->xDisplay(), mXWindow);
+
+    XSync(mGlxIntegration->xDisplay(),False);
+    mBuffer = new QWaylandXCompositeBuffer(mGlxIntegration->waylandXComposite(),
+                                           (uint32_t)mXWindow,
+                                           size,
+                                           mGlxIntegration->waylandDisplay()->argbVisual());
+    mWindow->attach(mBuffer);
+    wl_display_sync_callback(mGlxIntegration->waylandDisplay()->wl_display(),
+                             QWaylandXCompositeGLXContext::sync_function,
+                             this);
+    QMutex lock;
+    lock.lock();
+    wl_display_sync(mGlxIntegration->waylandDisplay()->wl_display(),0);
+    mWaitCondition.wait(&lock);
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
new file mode 100644
index 0000000..e5ccd9e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
@@ -0,0 +1,43 @@
+#ifndef QWAYLANDXCOMPOSITEGLXCONTEXT_H
+#define QWAYLANDXCOMPOSITEGLXCONTEXT_H
+
+#include <QtGui/QPlatformGLContext>
+
+#include <QtCore/QWaitCondition>
+
+#include "qwaylandbuffer.h"
+#include "qwaylandxcompositeglxintegration.h"
+
+#include "qglxconvenience.h"
+
+class QWaylandXCompositeGLXWindow;
+class QWaylandShmBuffer;
+
+class QWaylandXCompositeGLXContext : public QPlatformGLContext
+{
+public:
+    QWaylandXCompositeGLXContext(QWaylandXCompositeGLXIntegration *glxIntegration, QWaylandXCompositeGLXWindow *window);
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandXCompositeGLXIntegration *mGlxIntegration;
+    QWaylandXCompositeGLXWindow *mWindow;
+    QWaylandBuffer *mBuffer;
+
+    Window mXWindow;
+    GLXFBConfig mConfig;
+    GLXContext mContext;
+
+    static void sync_function(void *data);
+    QWaitCondition mWaitCondition;
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
new file mode 100644
index 0000000..dce3d27
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
@@ -0,0 +1,85 @@
+#include "qwaylandxcompositeglxintegration.h"
+
+#include "qwaylandxcompositeglxwindow.h"
+
+#include <QtCore/QDebug>
+
+#include "wayland-xcomposite-client-protocol.h"
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandXCompositeGLXIntegration(waylandDisplay);
+}
+
+QWaylandXCompositeGLXIntegration::QWaylandXCompositeGLXIntegration(QWaylandDisplay * waylandDispaly)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(waylandDispaly)
+{
+    wl_display_add_global_listener(waylandDispaly->wl_display(), QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal,
+                                   this);
+}
+
+QWaylandXCompositeGLXIntegration::~QWaylandXCompositeGLXIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+void QWaylandXCompositeGLXIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandXCompositeGLXIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandXCompositeGLXWindow(widget,this);
+}
+
+Display * QWaylandXCompositeGLXIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+int QWaylandXCompositeGLXIntegration::screen() const
+{
+    return mScreen;
+}
+
+Window QWaylandXCompositeGLXIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandXCompositeGLXIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
+wl_xcomposite * QWaylandXCompositeGLXIntegration::waylandXComposite() const
+{
+    return mWaylandComposite;
+}
+
+const struct wl_xcomposite_listener QWaylandXCompositeGLXIntegration::xcomposite_listener = {
+    QWaylandXCompositeGLXIntegration::rootInformation
+};
+
+void QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
+{
+    Q_UNUSED(version);
+    if (strcmp(interface, "xcomposite") == 0) {
+        QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
+        integration->mWaylandComposite = wl_xcomposite_create(display,id);
+        wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+    }
+
+}
+
+void QWaylandXCompositeGLXIntegration::rootInformation(void *data, wl_xcomposite *xcomposite, const char *display_name, uint32_t root_window)
+{
+    Q_UNUSED(xcomposite);
+    QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
+
+    qDebug() << "ROOT INFORMATION" << integration->mDisplay << integration->mRootWindow << integration->mScreen;
+    integration->mDisplay = XOpenDisplay(display_name);
+    integration->mRootWindow = (Window) root_window;
+    integration->mScreen = XDefaultScreen(integration->mDisplay);
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
new file mode 100644
index 0000000..650fdcf
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
@@ -0,0 +1,52 @@
+#ifndef QWAYLANDXCOMPOSITEGLXINTEGRATION_H
+#define QWAYLANDXCOMPOSITEGLXINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+#include "wayland-client.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+struct wl_xcomposite;
+
+class QWaylandXCompositeGLXIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandXCompositeGLXIntegration(QWaylandDisplay * waylandDispaly);
+    ~QWaylandXCompositeGLXIntegration();
+
+    void initialize();
+
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+    struct wl_xcomposite *waylandXComposite() const;
+
+    Display *xDisplay() const;
+    int screen() const;
+    Window rootWindow() const;
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+    struct wl_xcomposite *mWaylandComposite;
+
+    Display *mDisplay;
+    int mScreen;
+    Window mRootWindow;
+
+    static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id,
+                             const char *interface, uint32_t version, void *data);
+
+    static const struct wl_xcomposite_listener xcomposite_listener;
+    static void rootInformation(void *data,
+                 struct wl_xcomposite *xcomposite,
+                 const char *display_name,
+                 uint32_t root_window);
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
new file mode 100644
index 0000000..57ee27e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
@@ -0,0 +1,36 @@
+#include "qwaylandxcompositeglxwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandXCompositeGLXWindow::QWaylandXCompositeGLXWindow(QWidget *window, QWaylandXCompositeGLXIntegration *glxIntegration)
+    : QWaylandWindow(window)
+    , mGlxIntegration(glxIntegration)
+    , mContext(0)
+{
+
+}
+
+QWaylandWindow::WindowType QWaylandXCompositeGLXWindow::windowType() const
+{
+    //yeah. this type needs a new name
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandXCompositeGLXWindow::glContext() const
+{
+    if (!mContext) {
+        qDebug() << "creating glcontext;";
+        QWaylandXCompositeGLXWindow *that = const_cast<QWaylandXCompositeGLXWindow *>(this);
+        that->mContext = new QWaylandXCompositeGLXContext(mGlxIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandXCompositeGLXWindow::setGeometry(const QRect &rect)
+{
+    QWaylandWindow::setGeometry(rect);
+
+    if (mContext) {
+        mContext->geometryChanged();
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
new file mode 100644
index 0000000..75058a5
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
@@ -0,0 +1,24 @@
+#ifndef QWAYLANDXCOMPOSITEGLXWINDOW_H
+#define QWAYLANDXCOMPOSITEGLXWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandxcompositeglxintegration.h"
+#include "qwaylandxcompositeglxcontext.h"
+
+class QWaylandXCompositeGLXWindow : public QWaylandWindow
+{
+public:
+    QWaylandXCompositeGLXWindow(QWidget *window, QWaylandXCompositeGLXIntegration *glxIntegration);
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+
+private:
+    QWaylandXCompositeGLXIntegration *mGlxIntegration;
+    QWaylandXCompositeGLXContext *mContext;
+
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri
new file mode 100644
index 0000000..43295e9
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri
@@ -0,0 +1,13 @@
+include (../xcomposite_share/xcomposite_share.pri)
+include (../../../glxconvenience/glxconvenience.pri)
+
+LIBS += -lXcomposite
+SOURCES += \
+    $$PWD/qwaylandxcompositeglxcontext.cpp \
+    $$PWD/qwaylandxcompositeglxintegration.cpp \
+    $$PWD/qwaylandxcompositeglxwindow.cpp
+
+HEADERS += \
+    $$PWD/qwaylandxcompositeglxcontext.h \
+    $$PWD/qwaylandxcompositeglxintegration.h \
+    $$PWD/qwaylandxcompositeglxwindow.h
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
new file mode 100644
index 0000000..218907e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
@@ -0,0 +1,18 @@
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-client.h"
+
+QWaylandXCompositeBuffer::QWaylandXCompositeBuffer(wl_xcomposite *xcomposite, uint32_t window, const QSize &size, wl_visual *visual)
+    :mSize(size)
+{
+    mBuffer = wl_xcomposite_create_buffer(xcomposite,
+                                              window,
+                                              size.width(),
+                                              size.height(),
+                                              visual);
+}
+
+QSize QWaylandXCompositeBuffer::size() const
+{
+    return mSize;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
new file mode 100644
index 0000000..c9332d9
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
@@ -0,0 +1,21 @@
+#ifndef QWAYLANDXCOMPOSITEBUFFER_H
+#define QWAYLANDXCOMPOSITEBUFFER_H
+
+#include "qwaylandbuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+
+class QWaylandXCompositeBuffer : public QWaylandBuffer
+{
+public:
+    QWaylandXCompositeBuffer(struct wl_xcomposite *xcomposite,
+                             uint32_t window,
+                             const QSize &size,
+                             struct wl_visual *visual);
+
+    QSize size() const;
+private:
+    QSize mSize;
+};
+
+#endif // QWAYLANDXCOMPOSITEBUFFER_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
new file mode 100644
index 0000000..1955a74
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2010 Kristian Høgsberg
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+
+#ifndef XCOMPOSITE_CLIENT_PROTOCOL_H
+#define XCOMPOSITE_CLIENT_PROTOCOL_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include "wayland-util.h"
+
+struct wl_client;
+
+struct wl_xcomposite;
+
+struct wl_proxy;
+
+extern void
+wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
+extern struct wl_proxy *
+wl_proxy_create(struct wl_proxy *factory,
+		const struct wl_interface *interface);
+extern struct wl_proxy *
+wl_proxy_create_for_id(struct wl_display *display,
+		       const struct wl_interface *interface, uint32_t id);
+extern void
+wl_proxy_destroy(struct wl_proxy *proxy);
+
+extern int
+wl_proxy_add_listener(struct wl_proxy *proxy,
+		      void (**implementation)(void), void *data);
+
+extern void
+wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
+
+extern void *
+wl_proxy_get_user_data(struct wl_proxy *proxy);
+
+extern const struct wl_interface wl_xcomposite_interface;
+
+struct wl_xcomposite_listener {
+	void (*root)(void *data,
+		     struct wl_xcomposite *xcomposite,
+		     const char *display_name,
+		     uint32_t root_window);
+};
+
+static inline int
+wl_xcomposite_add_listener(struct wl_xcomposite *xcomposite,
+			   const struct wl_xcomposite_listener *listener, void *data)
+{
+	return wl_proxy_add_listener((struct wl_proxy *) xcomposite,
+				     (void (**)(void)) listener, data);
+}
+
+#define WL_XCOMPOSITE_CREATE_BUFFER	0
+
+static inline struct wl_xcomposite *
+wl_xcomposite_create(struct wl_display *display, uint32_t id)
+{
+	return (struct wl_xcomposite *)
+		wl_proxy_create_for_id(display, &wl_xcomposite_interface, id);
+}
+
+static inline void
+wl_xcomposite_set_user_data(struct wl_xcomposite *xcomposite, void *user_data)
+{
+	wl_proxy_set_user_data((struct wl_proxy *) xcomposite, user_data);
+}
+
+static inline void *
+wl_xcomposite_get_user_data(struct wl_xcomposite *xcomposite)
+{
+	return wl_proxy_get_user_data((struct wl_proxy *) xcomposite);
+}
+
+static inline void
+wl_xcomposite_destroy(struct wl_xcomposite *xcomposite)
+{
+	wl_proxy_destroy((struct wl_proxy *) xcomposite);
+}
+
+static inline struct wl_buffer *
+wl_xcomposite_create_buffer(struct wl_xcomposite *xcomposite, uint32_t x_window, int width, int height, struct wl_visual *visual)
+{
+	struct wl_proxy *id;
+
+	id = wl_proxy_create((struct wl_proxy *) xcomposite,
+			     &wl_buffer_interface);
+	if (!id)
+		return NULL;
+
+	wl_proxy_marshal((struct wl_proxy *) xcomposite,
+			 WL_XCOMPOSITE_CREATE_BUFFER, id, x_window, width, height, visual);
+
+	return (struct wl_buffer *) id;
+}
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
new file mode 100644
index 0000000..da2e4a2
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2010 Kristian Høgsberg
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "wayland-util.h"
+
+static const struct wl_message xcomposite_requests[] = {
+	{ "create_buffer", "nuiio" },
+};
+
+static const struct wl_message xcomposite_events[] = {
+	{ "root", "su" },
+};
+
+WL_EXPORT const struct wl_interface wl_xcomposite_interface = {
+	"xcomposite", 1,
+	ARRAY_LENGTH(xcomposite_requests), xcomposite_requests,
+	ARRAY_LENGTH(xcomposite_events), xcomposite_events,
+};
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri
new file mode 100644
index 0000000..03b3521
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri
@@ -0,0 +1,9 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+    $$PWD/wayland-xcomposite-client-protocol.h \
+    gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
+
+SOURCES += \
+   $$PWD/wayland-xcomposite-protocol.c \
+    gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
-- 
cgit v0.12


From 9086024565cac2fd9ebc7eeb8abd6449ecf960d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 6 Apr 2011 11:11:00 +0200
Subject: Remove output that wass added by misstake

in 39ede7e7914b486d5971491dd742da3712a1d7e5
---
 src/plugins/platforms/fontdatabases/genericunix/genericunix.pri | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
index 7b0db41..1153ab3 100644
--- a/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
+++ b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
@@ -5,7 +5,6 @@ contains(QT_CONFIG, fontconfig) {
     include(../basicunix/basicunix.pri)
 }
 
-message("GENERIC UNIX")
 INCLUDEPATH += $$PWD
 HEADERS += \
            $$PWD/qgenericunixfontdatabase.h
-- 
cgit v0.12


From 8fe7b21fbd55e3121925e6f5a51be8d14081957f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 31 Mar 2011 16:05:42 +0200
Subject: Lighthouse: Native interface for xlib

---
 src/plugins/platforms/xlib/qxlibintegration.cpp    |   8 +-
 src/plugins/platforms/xlib/qxlibintegration.h      |   4 +
 .../platforms/xlib/qxlibnativeinterface.cpp        | 133 +++++++++++++++++++++
 src/plugins/platforms/xlib/qxlibnativeinterface.h  |  75 ++++++++++++
 src/plugins/platforms/xlib/xlib.pro                |   6 +-
 5 files changed, 223 insertions(+), 3 deletions(-)
 create mode 100644 src/plugins/platforms/xlib/qxlibnativeinterface.cpp
 create mode 100644 src/plugins/platforms/xlib/qxlibnativeinterface.h

diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
index 63197b0..8deb2f3 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.cpp
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -49,6 +49,7 @@
 #include "qxlibscreen.h"
 #include "qxlibclipboard.h"
 #include "qxlibdisplay.h"
+#include "qxlibnativeinterface.h"
 
 #if !defined(QT_NO_OPENGL)
 #if !defined(QT_OPENGL_ES_2)
@@ -66,6 +67,7 @@ QXlibIntegration::QXlibIntegration(bool useOpenGL)
     : mUseOpenGL(useOpenGL)
     , mFontDb(new QGenericUnixFontDatabase())
     , mClipboard(0)
+    , mNativeInterface(new QXlibNativeInterface)
 {
     mPrimaryScreen = new QXlibScreen();
     mScreens.append(mPrimaryScreen);
@@ -130,6 +132,11 @@ QPlatformClipboard * QXlibIntegration::clipboard() const
     return mClipboard;
 }
 
+QPlatformNativeInterface * QXlibIntegration::nativeInterface() const
+{
+    return mNativeInterface;
+}
+
 bool QXlibIntegration::hasOpenGL() const
 {
 #if !defined(QT_NO_OPENGL)
@@ -154,5 +161,4 @@ bool QXlibIntegration::hasOpenGL() const
     return false;
 }
 
-
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibintegration.h b/src/plugins/platforms/xlib/qxlibintegration.h
index 3bbf897..f8efae0 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.h
+++ b/src/plugins/platforms/xlib/qxlibintegration.h
@@ -47,6 +47,7 @@
 
 #include <QtGui/QPlatformIntegration>
 #include <QtGui/QPlatformScreen>
+#include <QtGui/QPlatformNativeInterface>
 
 #include "qxlibstatic.h"
 
@@ -70,6 +71,8 @@ public:
     QPlatformFontDatabase *fontDatabase() const;
     QPlatformClipboard *clipboard() const;
 
+    QPlatformNativeInterface *nativeInterface() const;
+
     bool hasOpenGL() const;
 
 private:
@@ -78,6 +81,7 @@ private:
     QList<QPlatformScreen *> mScreens;
     QPlatformFontDatabase *mFontDb;
     QPlatformClipboard *mClipboard;
+    QPlatformNativeInterface *mNativeInterface;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
new file mode 100644
index 0000000..4e950ff
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibnativeinterface.h"
+
+#include "qxlibdisplay.h"
+#include <QtGui/private/qapplication_p.h>
+
+class QXlibResourceMap : public QMap<QByteArray, QXlibNativeInterface::ResourceType>
+{
+public:
+    QXlibResourceMap()
+        :QMap<QByteArray, QXlibNativeInterface::ResourceType>()
+    {
+        insert("display",QXlibNativeInterface::Display);
+        insert("egldisplay",QXlibNativeInterface::EglDisplay);
+        insert("connection",QXlibNativeInterface::Connection);
+        insert("screen",QXlibNativeInterface::Screen);
+        insert("graphicsdevice",QXlibNativeInterface::GraphicsDevice);
+        insert("eglcontext",QXlibNativeInterface::EglContext);
+    }
+};
+
+Q_GLOBAL_STATIC(QXlibResourceMap, qXlibResourceMap)
+
+
+void * QXlibNativeInterface::nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget)
+{
+    QByteArray lowerCaseResource = resourceString.toLower();
+    ResourceType resource = qXlibResourceMap()->value(lowerCaseResource);
+    void *result = 0;
+    switch(resource) {
+    case Display:
+        result = displayForWidget(widget);
+        break;
+    case EglDisplay:
+        result = eglDisplayForWidget(widget);
+        break;
+    case Connection:
+        result = connectionForWidget(widget);
+        break;
+    case Screen:
+        result = reinterpret_cast<void *>(qPlatformScreenForWidget(widget)->xScreenNumber());
+        break;
+    case GraphicsDevice:
+        result = graphicsDeviceForWidget(widget);
+        break;
+    case EglContext:
+        result = eglContextForWidget(widget);
+        break;
+    default:
+        result = 0;
+    }
+    return result;
+}
+
+void * QXlibNativeInterface::displayForWidget(QWidget *widget)
+{
+    return qPlatformScreenForWidget(widget)->display()->nativeDisplay();
+}
+
+void * QXlibNativeInterface::eglDisplayForWidget(QWidget *widget)
+{
+    Q_UNUSED(widget);
+    return 0;
+}
+
+void * QXlibNativeInterface::screenForWidget(QWidget *widget)
+{
+    Q_UNUSED(widget);
+    return 0;
+}
+
+void * QXlibNativeInterface::graphicsDeviceForWidget(QWidget *widget)
+{
+    Q_UNUSED(widget);
+    return 0;
+}
+
+void * QXlibNativeInterface::eglContextForWidget(QWidget *widget)
+{
+    Q_UNUSED(widget);
+    return 0;
+}
+
+QXlibScreen * QXlibNativeInterface::qPlatformScreenForWidget(QWidget *widget)
+{
+    QXlibScreen *screen;
+    if (widget) {
+        screen = static_cast<QXlibScreen *>(QPlatformScreen::platformScreenForWidget(widget));
+    }else {
+        screen = static_cast<QXlibScreen *>(QApplicationPrivate::platformIntegration()->screens()[0]);
+    }
+    return screen;
+}
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.h b/src/plugins/platforms/xlib/qxlibnativeinterface.h
new file mode 100644
index 0000000..5ba0768
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXLIBNATIVEINTERFACE_H
+#define QXLIBNATIVEINTERFACE_H
+
+#include "qxlibscreen.h"
+
+#include <QtGui/QPlatformNativeInterface>
+
+class QXlibNativeInterface : public QPlatformNativeInterface
+{
+public:
+    enum ResourceType {
+        Display,
+        EglDisplay,
+        Connection,
+        Screen,
+        GraphicsDevice,
+        EglContext
+    };
+
+    void *nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget);
+
+    void *displayForWidget(QWidget *widget);
+    void *eglDisplayForWidget(QWidget *widget);
+    void *connectionForWidget(QWidget *widget);
+    void *screenForWidget(QWidget *widget);
+    void *graphicsDeviceForWidget(QWidget *widget);
+    void *eglContextForWidget(QWidget *widget);
+
+private:
+    static QXlibScreen *qPlatformScreenForWidget(QWidget *widget);
+};
+
+
+#endif // QXLIBNATIVEINTERFACE_H
diff --git a/src/plugins/platforms/xlib/xlib.pro b/src/plugins/platforms/xlib/xlib.pro
index 4cda1a7..ea77a29 100644
--- a/src/plugins/platforms/xlib/xlib.pro
+++ b/src/plugins/platforms/xlib/xlib.pro
@@ -14,7 +14,8 @@ SOURCES = \
         qxlibclipboard.cpp \
         qxlibmime.cpp \
         qxlibstatic.cpp \
-        qxlibdisplay.cpp
+        qxlibdisplay.cpp \
+        qxlibnativeinterface.cpp
 
 HEADERS = \
         qxlibintegration.h \
@@ -26,7 +27,8 @@ HEADERS = \
         qxlibclipboard.h \
         qxlibmime.h \
         qxlibstatic.h \
-        qxlibdisplay.h
+        qxlibdisplay.h \
+        qxlibnativeinterface.h
 
 LIBS += -lX11 -lXext
 
-- 
cgit v0.12


From 397e139774eaaee88dc44cd47d296646ec03aed7 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Wed, 6 Apr 2011 12:16:36 +0200
Subject: tst_qtcpserver: Add a mapped v4 addr test

Reviewed-by: Shane Kearns
---
 tests/auto/qtcpserver/tst_qtcpserver.cpp | 35 ++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp
index cff2fe5..9cddc00 100644
--- a/tests/auto/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp
@@ -97,6 +97,7 @@ private slots:
     void constructing();
     void clientServerLoop();
     void ipv6Server();
+    void ipv6ServerMapped();
     void crashTests();
     void maxPendingConnections();
     void listenError();
@@ -265,6 +266,40 @@ void tst_QTcpServer::ipv6Server()
 }
 
 //----------------------------------------------------------------------------------
+void tst_QTcpServer::ipv6ServerMapped()
+{
+    QFETCH_GLOBAL(bool, setProxy);
+    if (setProxy)
+        return;
+
+    QTcpServer server;
+    QVERIFY(server.listen(QHostAddress::LocalHost));
+
+    // let's try the normal case
+    QTcpSocket client1;
+    client1.connectToHost("127.0.0.1", server.serverPort());
+    QVERIFY(server.waitForNewConnection(5000));
+    delete server.nextPendingConnection();
+
+    // let's try the mapped one in the nice format
+    QTcpSocket client2;
+    client2.connectToHost("::ffff:127.0.0.1", server.serverPort());
+    QVERIFY(server.waitForNewConnection(5000));
+    delete server.nextPendingConnection();
+
+    // let's try the mapped in hex format
+    QTcpSocket client3;
+    client3.connectToHost("::ffff:7F00:0001", server.serverPort());
+    QVERIFY(server.waitForNewConnection(5000));
+    delete server.nextPendingConnection();
+
+    // However connecting to the v6 localhost should not work
+    QTcpSocket client4;
+    client4.connectToHost("::1", server.serverPort());
+    QVERIFY(!server.waitForNewConnection(5000));
+}
+
+//----------------------------------------------------------------------------------
 void tst_QTcpServer::crashTests()
 {
     QTcpServer server;
-- 
cgit v0.12


From 31c588cfe42c387aef8c541fe1e6d50e9ff51560 Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Wed, 6 Apr 2011 12:32:36 +0200
Subject: tst_qnetworkreply: skip ioGetFromBuiltinHttp test.

Reviewed-by: Markus Goetz
---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 11f4fc3..10fce94 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -4265,6 +4265,7 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp_data()
 
 void tst_QNetworkReply::ioGetFromBuiltinHttp()
 {
+    QSKIP("Limiting is broken right now, check QTBUG-15065", SkipAll);
     QFETCH(bool, https);
     QFETCH(int, bufferSize);
 
-- 
cgit v0.12


From 22a79e81758d0b6a07168ac937ad3a42db8ff21a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 12:41:30 +0200
Subject: Prevent crashes and X errors in QXcbWindowSurface::flush()

Make sure the region to flush is inside the bounds (it might be outside
if the window surface hasn't been initialized yet or if a resize just
happened and we get an Expose event too soon).
---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index a4607dc..318ac15 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -186,8 +186,10 @@ void QXcbWindowSurface::endPaint(const QRegion &)
 
 void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
-    Q_UNUSED(region);
-    Q_UNUSED(offset);
+    QRect bounds = region.boundingRect();
+
+    if (size().isEmpty() || !geometry().contains(bounds))
+        return;
 
     Q_XCB_NOOP(connection());
 
-- 
cgit v0.12


From dfa586395b0dabbf6b81e77625a4f8d43ee9a80d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 14:17:54 +0200
Subject: Prevent synchronization errors and memory leaks in QXcbWindowSurface.

---
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 318ac15..c068d1c 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -53,6 +53,8 @@
 
 #include <stdio.h>
 
+#include <qdebug.h>
+
 class QXcbShmImage : public QXcbObject
 {
 public:
@@ -93,13 +95,21 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
                                           0,
                                           ~0,
                                           0);
+
     m_shm_info.shmid = shmget (IPC_PRIVATE,
           m_xcb_image->stride * m_xcb_image->height, IPC_CREAT|0777);
 
     m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0);
     m_shm_info.shmseg = xcb_generate_id(xcb_connection());
 
-    Q_XCB_CALL(xcb_shm_attach(xcb_connection(), m_shm_info.shmseg, m_shm_info.shmid, false));
+    xcb_generic_error_t *error = xcb_request_check(xcb_connection(), xcb_shm_attach_checked(xcb_connection(), m_shm_info.shmseg, m_shm_info.shmid, false));
+    if (error) {
+        qWarning() << "QXcbWindowSurface: Unable to attach to shared memory segment";
+        free(error);
+    }
+
+    if (shmctl(m_shm_info.shmid, IPC_RMID, 0) == -1)
+        qWarning() << "QXcbWindowSurface: Error while marking the shared memory segment to be destroyed";
 
     m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, screen->format());
 }
-- 
cgit v0.12


From 0a4f6af142c57929bd743f3e95e25ada8642e9e4 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 6 Apr 2011 13:01:48 +0200
Subject: QStringBuilder: add operator += for QString and QByteArray

Optimize cases when we have.
string += someString + someOtherString
Avoid the allocation of one temporary string.

Behaviour change:
byteArray += someString + QByteArray("foo\0bar", 7)
before, the array would end at foo because of the conversion to string

Reviewed-by: hjk
---
 src/corelib/tools/qstring.h                  |  3 +++
 src/corelib/tools/qstringbuilder.h           | 29 ++++++++++++++++++++++++
 tests/auto/qstringbuilder1/stringbuilder.cpp | 33 ++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+)

diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index b54258f..002e516 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -485,6 +485,9 @@ public:
     const_iterator constEnd() const;
 
     // STL compatibility
+    typedef const QChar & const_reference;
+    typedef QChar & reference;
+    typedef QChar value_type;
     inline void push_back(QChar c) { append(c); }
     inline void push_back(const QString &s) { append(s); }
     inline void push_front(QChar c) { prepend(c); }
diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
index 260b574..2d3475f 100644
--- a/src/corelib/tools/qstringbuilder.h
+++ b/src/corelib/tools/qstringbuilder.h
@@ -419,6 +419,35 @@ operator+(const A &a, const B &b)
 }
 #endif
 
+template <typename A, typename B>
+QByteArray &operator+=(QByteArray &a, const QStringBuilder<A, B> &b)
+{
+#ifndef QT_NO_CAST_TO_ASCII
+    if (sizeof(typename QConcatenable< QStringBuilder<A, B> >::ConvertTo::value_type) == sizeof(QChar)) {
+        //it is not save to optimize as in utf8 it is not possible to compute the size
+        return a += QString(b);
+    }
+#endif
+    int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
+    a.reserve(len);
+    char *it = a.data() + a.size();
+    QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
+    a.resize(len); //we need to resize after the appendTo for the case str+=foo+str
+    return a;
+}
+
+template <typename A, typename B>
+QString &operator+=(QString &a, const QStringBuilder<A, B> &b)
+{
+    int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
+    a.reserve(len);
+    QChar *it = a.data() + a.size();
+    QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
+    a.resize(it - a.constData()); //may be smaller than len if there was conversion from utf8
+    return a;
+}
+
+
 QT_END_NAMESPACE
 
 QT_END_HEADER
diff --git a/tests/auto/qstringbuilder1/stringbuilder.cpp b/tests/auto/qstringbuilder1/stringbuilder.cpp
index 3c8ddc2..035a1f4 100644
--- a/tests/auto/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/qstringbuilder1/stringbuilder.cpp
@@ -163,4 +163,37 @@ void runScenario()
         QCOMPARE(r, r2);
     }
 
+    //operator QString  +=
+    {
+        QString str = QString::fromUtf8(UTF8_LITERAL);
+        str +=  QLatin1String(LITERAL) P str;
+        QCOMPARE(str, QString::fromUtf8(UTF8_LITERAL LITERAL UTF8_LITERAL));
+#ifndef QT_NO_CAST_FROM_ASCII
+        str = (QString::fromUtf8(UTF8_LITERAL) += QLatin1String(LITERAL) P UTF8_LITERAL);
+        QCOMPARE(str, QString::fromUtf8(UTF8_LITERAL LITERAL UTF8_LITERAL));
+#endif
+    }
+
+    //operator QByteArray  +=
+    {
+        QByteArray ba = UTF8_LITERAL;
+        ba +=  QByteArray(LITERAL) P UTF8_LITERAL;
+        QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL UTF8_LITERAL));
+        ba += LITERAL P QByteArray::fromRawData(UTF8_LITERAL_EXTRA, UTF8_LITERAL_LEN);
+        QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL UTF8_LITERAL LITERAL UTF8_LITERAL));
+        QByteArray withZero = QByteArray(LITERAL "\0" LITERAL, LITERAL_LEN*2+1);
+        QByteArray ba2 = withZero;
+        ba2 += ba2 P withZero;
+        QCOMPARE(ba2, QByteArray(withZero + withZero + withZero));
+#ifndef QT_NO_CAST_TO_ASCII
+        ba = UTF8_LITERAL;
+        ba2 = (ba += QLatin1String(LITERAL) + QString::fromUtf8(UTF8_LITERAL));
+        QCOMPARE(ba2, ba);
+        QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL UTF8_LITERAL));
+        ba = UTF8_LITERAL;
+        ba += QLatin1String(LITERAL) P withZero;
+        QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL + withZero));
+#endif
+    }
+
 }
-- 
cgit v0.12


From bcafefff9794ced8f4de8fefe7fdf541c671472d Mon Sep 17 00:00:00 2001
From: Eckhart Koppen <eckhart.koppen@nokia.com>
Date: Wed, 6 Apr 2011 15:42:02 +0300
Subject: Updated QtOpenVG DEF file

Added new functions and absented missing functions

Reviewed-by: TrustMe
---
 src/s60installs/eabi/QtOpenVGu.def | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/s60installs/eabi/QtOpenVGu.def b/src/s60installs/eabi/QtOpenVGu.def
index a1be1fc..de352d5 100644
--- a/src/s60installs/eabi/QtOpenVGu.def
+++ b/src/s60installs/eabi/QtOpenVGu.def
@@ -8,7 +8,7 @@ EXPORTS
 	_Z25qt_vg_create_paint_enginev @ 7 NONAME
 	_Z26qt_vg_destroy_paint_engineP14QVGPaintEngine @ 8 NONAME
 	_Z28qt_vg_config_to_image_formatP11QEglContext @ 9 NONAME
-	_ZN13QVGPixmapData12forceToImageEv @ 10 NONAME
+	_ZN13QVGPixmapData12forceToImageEv @ 10 NONAME ABSENT
 	_ZN13QVGPixmapData12toNativeTypeEN11QPixmapData10NativeTypeE @ 11 NONAME
 	_ZN13QVGPixmapData14fromNativeTypeEPvN11QPixmapData10NativeTypeE @ 12 NONAME
 	_ZN13QVGPixmapData15setAlphaChannelERK7QPixmap @ 13 NONAME
@@ -206,12 +206,14 @@ EXPORTS
 	_ZN13QVGPixmapData8fromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 205 NONAME
 	_ZN13QVGPixmapData8fromFileERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 206 NONAME
 	_ZNK14QVGPaintEngine16canVgWritePixelsERK6QImage @ 207 NONAME
-	_ZN13QVGPixmapData12updateSerialEv @ 208 NONAME ABSENT
-	_ZN13QVGPixmapData4copyEPK11QPixmapDataRK5QRect @ 209 NONAME ABSENT
-	_ZNK13QVGPixmapData11idealFormatEP6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 210 NONAME ABSENT
+	_ZN13QVGPixmapData12updateSerialEv @ 208 NONAME
+	_ZN13QVGPixmapData4copyEPK11QPixmapDataRK5QRect @ 209 NONAME
+	_ZNK13QVGPixmapData11idealFormatEP6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 210 NONAME
 	_ZN13QVGPixmapData24releaseNativeImageHandleEv @ 211 NONAME
 	_ZN13QVGPixmapData25initFromNativeImageHandleEPvRK7QString @ 212 NONAME
 	_ZN13QVGPixmapData35createFromNativeImageHandleProviderEv @ 213 NONAME
 	_ZNK13QVGPixmapData14ensureReadbackEb @ 214 NONAME
 	_ZNK16QVGWindowSurface24hasStaticContentsSupportEv @ 215 NONAME ABSENT
+	_ZN13QVGPixmapData12forceToImageEb @ 216 NONAME
+	_ZNK16QVGWindowSurface8featuresEv @ 217 NONAME
 
-- 
cgit v0.12


From 258c1a8537816f7b4c79e7cf4090a333768a10fa Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Wed, 6 Apr 2011 16:10:34 +0200
Subject: QLocalSocket: fix abort on Windows.

The socket will not close as long as there are bytes left to write.
So by deleting the pipeWriter bytesToTrite will be 0 and the socket
will close directly.

Task-number: QTBUG-14939
Reviewed-by: Joerg Bornemann
---
 src/network/socket/qlocalsocket_win.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 7bbe275..9d21fde 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -348,6 +348,11 @@ qint64 QLocalSocket::writeData(const char *data, qint64 maxSize)
 
 void QLocalSocket::abort()
 {
+    Q_D(QLocalSocket);
+    if (d->pipeWriter) {
+        delete d->pipeWriter;
+        d->pipeWriter = 0;
+    }
     close();
 }
 
-- 
cgit v0.12


From fc3e7b45774ac6f3ae8fe6295c57681e86a421bf Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Thu, 7 Apr 2011 11:23:21 +0200
Subject: Updated def file after symbol removal.

Reviewed-by: Trust me
---
 src/s60installs/eabi/QtCoreu.def | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index ef3bbb1..52239b0 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -183,7 +183,7 @@ EXPORTS
 	_ZN10QEventLoopD1Ev @ 182 NONAME
 	_ZN10QEventLoopD2Ev @ 183 NONAME
 	_ZN10QMutexPool17globalInstanceGetEPKv @ 184 NONAME
-	_ZN10QMutexPool3getEPKv @ 185 NONAME
+	_ZN10QMutexPool3getEPKv @ 185 NONAME ABSENT
 	_ZN10QMutexPool8instanceEv @ 186 NONAME
 	_ZN10QMutexPoolC1EN6QMutex13RecursionModeEi @ 187 NONAME
 	_ZN10QMutexPoolC2EN6QMutex13RecursionModeEi @ 188 NONAME
-- 
cgit v0.12


From 7433709193db3e2e9adf4960ec9eceedcacc1721 Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Thu, 7 Apr 2011 11:51:04 +0200
Subject: Added a consistency check for number of missing symbols in elf2e32.

Reviewed-by: Trust me
---
 bin/elf2e32_qtwrapper.pl | 39 +++++++++++++++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 4 deletions(-)

diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index 8b8eab9..24b910b 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -108,10 +108,33 @@ sub printRecordedDefFiles {
     }
 }
 
+sub missingSymbolMismatch
+{
+    my $missingSymbolSum = $_[0];
+
+    printRecordedDefFiles;
+
+    print("Bug in the native elf2e32 tool: Number of missing symbols does not\n");
+    print("match number of removed symbols in the output DEF file.\n\n");
+
+    print("Original elf2e32 output:\n");
+    print("  $missingSymbolSum Frozen Export\(s\) missing from the ELF file\n\n");
+
+    print("However $defoutput[1] contains more missing entries than that.\n\n");
+
+    print("This needs to be fixed manually in the DEF file.\n");
+    exit(2);
+}
+
+if ($debugScript) {
+    print("PATH: $ENV{PATH}\n");
+    print("EPOCROOT: $ENV{EPOCROOT}\n");
+}
+
 while (1) {
     if (++$runCount > 2) {
+        printRecordedDefFiles if ($debugScript);
         print("Internal error in $0, link succeeded, but exports may be wrong.\n");
-        printRecordedDefFiles;
         last;
     }
 
@@ -124,6 +147,8 @@ while (1) {
 
     my %fixupSymbols;
     my $foundBrokenSymbols = 0;
+    my $missingSymbolSum = 0;
+    my $missingSymbolCount = 0;
     my $errors = 0;
     while (<$elf2e32Pipe>) {
         print;
@@ -132,14 +157,17 @@ while (1) {
         } elsif (/symbol ([a-z0-9_]+) absent in the DEF file, but present in the ELF file/io) {
             $fixupSymbols{$1} = 1;
             $foundBrokenSymbols = 1;
-        } elsif (/[0-9]+ Frozen Export\(s\) missing from the ELF file/io) {
+        } elsif (/([0-9]+) Frozen Export\(s\) missing from the ELF file/io) {
+            $missingSymbolSum = $1;
             $foundBrokenSymbols = 1;
         }
     }
     close($elf2e32Pipe);
 
-    recordDefFile("Run no $runCount, elf2e32 DEF file input", "$definput[1]");
-    recordDefFile("Run no $runCount, elf2e32 DEF file output", "$defoutput[1]");
+    if ($debugScript) {
+        recordDefFile("Run no $runCount, elf2e32 DEF file input", "$definput[1]");
+        recordDefFile("Run no $runCount, elf2e32 DEF file output", "$defoutput[1]");
+    }
 
     if ($errors) {
         $returnCode = 1;
@@ -240,6 +268,9 @@ while (1) {
             } elsif ($defLine =~ s/; MISSING://) {
                 # Auto-absent symbols.
                 $extraData .= " ABSENT";
+                if (++$missingSymbolCount > $missingSymbolSum) {
+                    missingSymbolMismatch($missingSymbolSum);
+                }
             }
             print($tmpDefFile "\t$sym \@ $ordinal $extraData\n") or die("Could not write to temporary DEF file: $!");
         }
-- 
cgit v0.12


From 3a7a03f5ab0f927211050d2dcceb9440e2b0aeeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 6 Apr 2011 17:17:50 +0200
Subject: Implemented _NET_WM_SYNC_REQUEST protocol in XCB plugin.

Excluded KWin for now, as it sends multiple ConfigureNotify events per
_NET_WM_SYNC_REQUEST message.
---
 src/plugins/platforms/xcb/README                |  3 +-
 src/plugins/platforms/xcb/qxcbconnection.cpp    | 59 +++++++++++++------------
 src/plugins/platforms/xcb/qxcbconnection.h      |  1 +
 src/plugins/platforms/xcb/qxcbscreen.cpp        | 36 +++++++++++++++
 src/plugins/platforms/xcb/qxcbscreen.h          |  6 +++
 src/plugins/platforms/xcb/qxcbwindow.cpp        | 48 +++++++++++++++++++-
 src/plugins/platforms/xcb/qxcbwindow.h          |  9 ++++
 src/plugins/platforms/xcb/qxcbwindowsurface.cpp | 13 ++++++
 src/plugins/platforms/xcb/qxcbwindowsurface.h   |  1 +
 src/plugins/platforms/xcb/xcb.pro               |  2 +-
 10 files changed, 146 insertions(+), 32 deletions(-)

diff --git a/src/plugins/platforms/xcb/README b/src/plugins/platforms/xcb/README
index e88596b..17a86e6 100644
--- a/src/plugins/platforms/xcb/README
+++ b/src/plugins/platforms/xcb/README
@@ -1,2 +1,3 @@
 Required packages:
-libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm1 libxcb-icccm1-dev
+libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm1 libxcb-icccm1-dev libxcb-sync0 libxcb-sync0-dev
+
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 84d98e8..2413a32 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -105,6 +105,8 @@ QXcbConnection::QXcbConnection(const char *displayName)
 #endif //XCB_USE_XLIB
     m_setup = xcb_get_setup(xcb_connection());
 
+    initializeAllAtoms();
+
     xcb_screen_iterator_t it = xcb_setup_roots_iterator(m_setup);
 
     int screenNumber = 0;
@@ -115,8 +117,6 @@ QXcbConnection::QXcbConnection(const char *displayName)
 
     m_keyboard = new QXcbKeyboard(this);
 
-    initializeAllAtoms();
-
 #ifdef XCB_USE_DRI2
     initializeDri2();
 #endif
@@ -379,6 +379,34 @@ void QXcbConnection::log(const char *file, int line, int sequence)
 }
 #endif
 
+void QXcbConnection::handleXcbError(xcb_generic_error_t *error)
+{
+    uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
+    uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
+
+    printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
+           int(error->error_code), xcb_errors[clamped_error_code],
+           int(error->sequence), int(error->resource_id),
+           int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
+           int(error->minor_code));
+#ifdef Q_XCB_DEBUG
+    int i = 0;
+    for (; i < m_callLog.size(); ++i) {
+        if (m_callLog.at(i).sequence == error->sequence) {
+            printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+            break;
+        } else if (m_callLog.at(i).sequence > error->sequence) {
+            printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+            if (i > 0)
+                printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+            break;
+        }
+    }
+    if (i == m_callLog.size() && !m_callLog.isEmpty())
+        printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
+#endif
+}
+
 void QXcbConnection::processXcbEvents()
 {
     while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
@@ -387,32 +415,7 @@ void QXcbConnection::processXcbEvents()
         uint response_type = event->response_type & ~0x80;
 
         if (!response_type) {
-            xcb_generic_error_t *error = (xcb_generic_error_t *)event;
-
-            uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
-            uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
-
-            printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
-                   int(error->error_code), xcb_errors[clamped_error_code],
-                   int(error->sequence), int(error->resource_id),
-                   int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
-                   int(error->minor_code));
-#ifdef Q_XCB_DEBUG
-            int i = 0;
-            for (; i < m_callLog.size(); ++i) {
-                if (m_callLog.at(i).sequence == error->sequence) {
-                    printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                    break;
-                } else if (m_callLog.at(i).sequence > error->sequence) {
-                    printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
-                    if (i > 0)
-                        printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
-                    break;
-                }
-            }
-            if (i == m_callLog.size() && !m_callLog.isEmpty())
-                printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
-#endif
+            handleXcbError((xcb_generic_error_t *)event);
             continue;
         }
 
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 53846f1..e38b44e 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -252,6 +252,7 @@ public:
 #endif
 
     void sync();
+    void handleXcbError(xcb_generic_error_t *error);
 
 private slots:
     void processXcbEvents();
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index 49ed44c..1c12ee3 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -66,6 +66,42 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, xcb_screen_t *screen, int num
     };
 
     xcb_change_window_attributes(xcb_connection(), screen->root, mask, values);
+
+    xcb_generic_error_t *error;
+
+    xcb_get_property_reply_t *reply =
+        xcb_get_property_reply(xcb_connection(),
+            xcb_get_property(xcb_connection(), false, screen->root,
+                             atom(QXcbAtom::_NET_SUPPORTING_WM_CHECK),
+                             XCB_ATOM_WINDOW, 0, 1024), &error);
+
+    if (reply && reply->format == 32 && reply->type == XCB_ATOM_WINDOW) {
+        xcb_window_t windowManager = *((xcb_window_t *)xcb_get_property_value(reply));
+
+        if (windowManager != XCB_WINDOW_NONE) {
+            xcb_get_property_reply_t *windowManagerReply =
+                xcb_get_property_reply(xcb_connection(),
+                    xcb_get_property(xcb_connection(), false, windowManager,
+                                     atom(QXcbAtom::_NET_WM_NAME),
+                                     atom(QXcbAtom::UTF8_STRING), 0, 1024), &error);
+            if (windowManagerReply && windowManagerReply->format == 8 && windowManagerReply->type == atom(QXcbAtom::UTF8_STRING)) {
+                m_windowManagerName = QString::fromUtf8((const char *)xcb_get_property_value(windowManagerReply), xcb_get_property_value_length(windowManagerReply));
+                printf("Running window manager: %s\n", qPrintable(m_windowManagerName));
+            } else if (error) {
+                connection->handleXcbError(error);
+                free(error);
+            }
+
+            free(windowManagerReply);
+        }
+    } else if (error) {
+        connection->handleXcbError(error);
+        free(error);
+    }
+
+    free(reply);
+
+    m_syncRequestSupported = m_windowManagerName != QLatin1String("KWin");
 }
 
 QXcbScreen::~QXcbScreen()
diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h
index 6f69fc7..9547d01 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.h
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -43,6 +43,7 @@
 #define QXCBSCREEN_H
 
 #include <QtGui/QPlatformScreen>
+#include <QtCore/QString>
 
 #include <xcb/xcb.h>
 
@@ -66,9 +67,14 @@ public:
     xcb_screen_t *screen() const { return m_screen; }
     xcb_window_t root() const { return m_screen->root; }
 
+    QString windowManagerName() const { return m_windowManagerName; }
+    bool syncRequestSupported() const { return m_syncRequestSupported; }
+
 private:
     xcb_screen_t *m_screen;
     int m_number;
+    QString m_windowManagerName;
+    bool m_syncRequestSupported;
 };
 
 #endif
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 4a9409c..1e9a0f8 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -41,6 +41,8 @@
 
 #include "qxcbwindow.h"
 
+#include <QtDebug>
+
 #include "qxcbconnection.h"
 #include "qxcbscreen.h"
 #ifdef XCB_USE_DRI2
@@ -171,6 +173,9 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
     properties[propertyCount++] = atom(QXcbAtom::WM_TAKE_FOCUS);
     properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
 
+    if (m_screen->syncRequestSupported())
+        properties[propertyCount++] = atom(QXcbAtom::_NET_WM_SYNC_REQUEST);
+
     if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint)
         properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP);
 
@@ -178,10 +183,26 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
                                    XCB_PROP_MODE_REPLACE,
                                    m_window,
                                    atom(QXcbAtom::WM_PROTOCOLS),
-                                   4,
+                                   XCB_ATOM_ATOM,
                                    32,
                                    propertyCount,
                                    properties));
+    m_syncValue.hi = 0;
+    m_syncValue.lo = 0;
+
+    if (m_screen->syncRequestSupported()) {
+        m_syncCounter = xcb_generate_id(xcb_connection());
+        Q_XCB_CALL(xcb_sync_create_counter(xcb_connection(), m_syncCounter, m_syncValue));
+
+        Q_XCB_CALL(xcb_change_property(xcb_connection(),
+                                       XCB_PROP_MODE_REPLACE,
+                                       m_window,
+                                       atom(QXcbAtom::_NET_WM_SYNC_REQUEST_COUNTER),
+                                       XCB_ATOM_CARDINAL,
+                                       32,
+                                       1,
+                                       &m_syncCounter));
+    }
 
     if (isTransient(tlw) && tlw->parentWidget()) {
         // ICCCM 4.1.2.6
@@ -197,6 +218,8 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 QXcbWindow::~QXcbWindow()
 {
     delete m_context;
+    if (m_screen->syncRequestSupported())
+        Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
     Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
 }
 
@@ -474,6 +497,13 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even
 
             xcb_send_event(xcb_connection(), 0, m_screen->root(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&reply);
             xcb_flush(xcb_connection());
+        } else if (event->data.data32[0] == atom(QXcbAtom::_NET_WM_SYNC_REQUEST)) {
+            if (!m_hasReceivedSyncRequest) {
+                m_hasReceivedSyncRequest = true;
+                printf("Window manager supports _NET_WM_SYNC_REQUEST, syncing resizes\n");
+            }
+            m_syncValue.lo = event->data.data32[2];
+            m_syncValue.hi = event->data.data32[3];
         }
     }
 }
@@ -489,8 +519,11 @@ void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *
     }
 
     QRect rect(xpos, ypos, event->width, event->height);
-    QPlatformWindow::setGeometry(rect);
 
+    if (rect == geometry())
+        return;
+
+    QPlatformWindow::setGeometry(rect);
     QWindowSystemInterface::handleGeometryChange(widget(), rect);
 
 #if XCB_USE_DRI2
@@ -593,3 +626,14 @@ void QXcbWindow::handleFocusOutEvent(const xcb_focus_out_event_t *)
     QWindowSystemInterface::handleWindowActivated(0);
 }
 
+void QXcbWindow::updateSyncRequestCounter()
+{
+    if (m_screen->syncRequestSupported() && m_syncValue.lo != 0 || m_syncValue.hi != 0) {
+        Q_XCB_CALL(xcb_sync_set_counter(xcb_connection(), m_syncCounter, m_syncValue));
+        xcb_flush(xcb_connection());
+        connection()->sync();
+
+        m_syncValue.lo = 0;
+        m_syncValue.hi = 0;
+    }
+}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 1e9930d..0fa4d0f 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -46,6 +46,7 @@
 #include <QtGui/QPlatformWindowFormat>
 
 #include <xcb/xcb.h>
+#include <xcb/sync.h>
 
 #include "qxcbobject.h"
 
@@ -88,11 +89,19 @@ public:
 
     void handleMouseEvent(xcb_button_t detail, uint16_t state, xcb_timestamp_t time, const QPoint &local, const QPoint &global);
 
+    void updateSyncRequestCounter();
+
 private:
+
     QXcbScreen *m_screen;
 
     xcb_window_t m_window;
     QPlatformGLContext *m_context;
+
+    xcb_sync_int64_t m_syncValue;
+    xcb_sync_counter_t m_syncCounter;
+
+    bool m_hasReceivedSyncRequest;
 };
 
 #endif
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index c068d1c..718f093 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -170,6 +170,7 @@ void QXcbShmImage::preparePaint(const QRegion &region)
 QXcbWindowSurface::QXcbWindowSurface(QWidget *widget, bool setDefaultSurface)
     : QWindowSurface(widget, setDefaultSurface)
     , m_image(0)
+    , m_syncingResize(false)
 {
     QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(widget));
     setConnection(screen->connection());
@@ -213,10 +214,20 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
         m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
 
     Q_XCB_NOOP(connection());
+
+    if (m_syncingResize) {
+        xcb_flush(xcb_connection());
+        connection()->sync();
+        m_syncingResize = false;
+        window->updateSyncRequestCounter();
+    }
 }
 
 void QXcbWindowSurface::resize(const QSize &size)
 {
+    if (size == QWindowSurface::size())
+        return;
+
     Q_XCB_NOOP(connection());
     QWindowSurface::resize(size);
 
@@ -225,6 +236,8 @@ void QXcbWindowSurface::resize(const QSize &size)
     delete m_image;
     m_image = new QXcbShmImage(screen, size);
     Q_XCB_NOOP(connection());
+
+    m_syncingResize = true;
 }
 
 extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
index f87e122..23d32ef 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.h
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -66,6 +66,7 @@ public:
 
 private:
     QXcbShmImage *m_image;
+    bool m_syncingResize;
 };
 
 #endif
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index 122cb40..101bdcd 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -62,7 +62,7 @@ contains(QT_CONFIG, opengl) {
     }
 }
 
-LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm
+LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync
 
 include (../fontdatabases/genericunix/genericunix.pri)
 
-- 
cgit v0.12


From 2149763b7293be2360beb3ec1fe9117c508eedd1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 7 Apr 2011 13:57:03 +0200
Subject: Wayland: Fix xpixmap_glx readback after multi threading

---
 .../gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp      | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
index f98e026..e856c03 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -46,10 +46,6 @@ void QWaylandXPixmapGLXContext::makeCurrent()
 {
     QPlatformGLContext::makeCurrent();
 
-    while(mWindow->waitingForFrameSync()) {
-        mGlxIntegration->waylandDisplay()->iterate();
-    }
-
     glXMakeCurrent(mGlxIntegration->xDisplay(),mGlxPixmap,mContext);
 }
 
@@ -82,6 +78,7 @@ void QWaylandXPixmapGLXContext::swapBuffers()
 
 
     mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+    mWindow->waitForFrameSync();
 
 }
 
@@ -103,8 +100,7 @@ void QWaylandXPixmapGLXContext::geometryChanged()
         size = QSize(1,1);
     }
 
-    while (mWindow->waitingForFrameSync())
-        mGlxIntegration->waylandDisplay()->iterate();
+    mWindow->waitForFrameSync();
 
     delete mBuffer;
     //XFreePixmap deletes the glxPixmap as well
-- 
cgit v0.12


From 27f0f0d674cb3f3408eb3817c32abd67560eb48b Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Thu, 7 Apr 2011 15:01:23 +0300
Subject: Remove workaround and fix properly

The workaround for 3.1 can now completely removed,
since support for 3.x was dropped.

Task-number: QTBUG-4565
Reviewed-by: Miikka Heikkinen
---
 src/gui/styles/qs60style_s60.cpp | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index 6a7158c..6b79874 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -776,16 +776,8 @@ QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
 {
     CCoeControl *control = targetWidget->effectiveWinId();
     TPoint pos(0,0);
-    if (control) {
-        // FIXME properly: S60 3.1 has a bug that CCoeControl::PositionRelativeToScreen sometimes
-        // freezes the device, possibly in cases where we run out of memory.
-        // We use CCoeControl::Position instead in S60 3.1, which returns same values
-        // in most cases.
-        if (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1)
-            pos = control->Position();
-        else
-            pos = control->PositionRelativeToScreen();
-    }
+    if (control)
+        pos = control->PositionRelativeToScreen();
     return QPoint(pos.iX, pos.iY);
 }
 
-- 
cgit v0.12


From e5d27e7aeac984e46f3aa8de20160cc00fc63155 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Thu, 7 Apr 2011 15:01:20 +0200
Subject: HTTP caching internals: fix logic for PreferNetwork and PreferCache

PreferNetwork means: send out a request and read from cache if it has
                     not been modified.
PreferCache means: load resource from cache if it has not expired yet.

This commit makes the cache behave according to the documentation.

Reviewed-by: Markus Goetz
---
 src/network/access/qnetworkaccesshttpbackend.cpp   |  7 ++++-
 .../tst_qabstractnetworkcache.cpp                  | 35 ++++++++++++----------
 2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 0438fb5..4ac0a67 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -262,6 +262,11 @@ bool QNetworkAccessHttpBackend::loadFromCacheIfAllowed(QHttpNetworkRequest &http
         httpRequest.setHeaderField("If-Modified-Since", QNetworkHeadersPrivate::toHttpDate(lastModified));
 
     if (CacheLoadControlAttribute == QNetworkRequest::PreferNetwork) {
+        // PreferNetwork == send request with "If-None-Match" and "If-Modified-Since" header,
+        // which will return a 304 Not Modifed if resource has not been changed.
+        // We might read from cache later, if receiving a 304.
+        return false;
+    } else if (CacheLoadControlAttribute == QNetworkRequest::PreferCache) {
         it = cacheHeaders.findRawHeader("Cache-Control");
         if (it != cacheHeaders.rawHeaders.constEnd()) {
             QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
@@ -1145,7 +1150,7 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo
         attributes.insert(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
         attributes.insert(QNetworkRequest::HttpReasonPhraseAttribute, reasonPhrase);
     } else {
-        // this is a redirection, keep the attributes intact
+        // this is the server telling us the resource has not changed, keep the attributes intact
         attributes = oldMetaData.attributes();
     }
     metaData.setAttributes(attributes);
diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index db0d0a7..7a34a9e 100644
--- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -124,22 +124,25 @@ static bool AlwaysFalse = false;
 
 Q_DECLARE_METATYPE(QNetworkRequest::CacheLoadControl)
 
-void tst_QAbstractNetworkCache::expires_data()
+void tst_QAbstractNetworkCache::expires_data() // Server sending Expires header, but neither max-age nor Last-Modified
 {
     QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
+    // httpcachetest_expires304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << true;
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << false; // neither Last-Modified nor ETag given
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true;
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true; // we know the expiration date, so we can read from cache
 
+    // httpcachetest_expires500.cgi will send a 500 upon receiving a If-Modified-Since header
     QTest::newRow("500-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires500.cgi" << AlwaysFalse;
-    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << true;
+    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << false; // neither Last-Modified nor ETag given
     QTest::newRow("500-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires500.cgi" << AlwaysTrue;
-    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true;
+    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true; // we know the expiration date, so we can read from cache
 
+    // httpcachetest_expires200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires200.cgi" << AlwaysFalse;
     QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires200.cgi" << AlwaysTrue;
@@ -167,15 +170,17 @@ void tst_QAbstractNetworkCache::lastModified_data()
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
+    // httpcachetest_lastModified304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true;
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true;
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
 
+    // httpcachetest_lastModified200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false;
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false;
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
 }
 
 void tst_QAbstractNetworkCache::lastModified()
@@ -200,14 +205,14 @@ void tst_QAbstractNetworkCache::etag_data()
     QTest::addColumn<bool>("fetchFromCache");
 
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true;
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true; // we will send If-None-Match and get 304
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true;
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true; // we don't have expiration information, but will get 304, as with PreferNetwork
 
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false;
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false; // we will send If-None-Match and get 200
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false;
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false; // we don't have expiration information, and will get 200, as with PreferNetwork
 }
 
 void tst_QAbstractNetworkCache::etag()
@@ -247,8 +252,8 @@ void tst_QAbstractNetworkCache::cacheControl_data()
 
     // see QTBUG-7060
     //QTest::newRow("nokia-boston") << QNetworkRequest::PreferNetwork << "http://waplabdc.nokia-boston.com/browser/users/venkat/cache/Cache_directives/private_1b.asp" << true;
-    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
-    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
+    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << false; // script always returns 200, so we cannot load from cache
+    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true; // we got expiry information
 }
 
 void tst_QAbstractNetworkCache::cacheControl()
-- 
cgit v0.12


From 2310cbe07b8f7de64d47fe825e0f5a49359923d8 Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Thu, 7 Apr 2011 12:56:14 +0200
Subject: Disable DEF files by default for symbian-gcce.

elf2e32 crashes when using it, and gcce will not produce matching
symbols anyway. It can still be turned on manually by specifying
-use-deffiles.

Reviewed-by: Liang Qi
---
 configure | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index 1369b82..700a486 100755
--- a/configure
+++ b/configure
@@ -5121,7 +5121,8 @@ if [ "$CFG_QS60STYLE" = "auto" ]; then
 fi
 
 if [ "$CFG_SYMBIAN_DEFFILES" = "auto" ]; then
-    if [ "$XPLATFORM_SYMBIAN" = "yes" ] && [ "$CFG_DEV" = "no" ]; then
+    # elf2e32 crashes when using def files together with gcce.
+    if [ "$XPLATFORM_SYMBIAN" = "yes" ] && [ "$CFG_DEV" = "no" ] && [ "$XPLATFORM" != "symbian-gcce" ]; then
         CFG_SYMBIAN_DEFFILES=yes
     else
         CFG_SYMBIAN_DEFFILES=no
-- 
cgit v0.12


From 4d67ecf8a40ad0669c269091a6e15b157b4090a6 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Mon, 28 Mar 2011 15:06:25 +0200
Subject: SSL code: introduce new error value for blacklisted certificates

improve error reporting by introducing a new enum value in case the
peer certificate is blacklisted.

Reviewed-by: Markus Goetz
Task-number: QTBUG-18338
---
 src/network/ssl/qsslerror.cpp            |  4 ++++
 src/network/ssl/qsslerror.h              |  1 +
 src/network/ssl/qsslsocket_openssl.cpp   | 16 +++++++++-------
 tests/auto/qsslsocket/tst_qsslsocket.cpp | 13 +++++++------
 4 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/src/network/ssl/qsslerror.cpp b/src/network/ssl/qsslerror.cpp
index 198b1f5..ae18b47 100644
--- a/src/network/ssl/qsslerror.cpp
+++ b/src/network/ssl/qsslerror.cpp
@@ -86,6 +86,7 @@
     \value HostNameMismatch
     \value UnspecifiedError
     \value NoSslSupport
+    \value CertificateBlacklisted
 
     \sa QSslError::errorString()
 */
@@ -281,6 +282,9 @@ QString QSslError::errorString() const
         break;
     case NoSslSupport:
         break;
+    case CertificateBlacklisted:
+        errStr = QSslSocket::tr("The peer certificate is blacklisted");
+        break;
     default:
         errStr = QSslSocket::tr("Unknown error");
         break;
diff --git a/src/network/ssl/qsslerror.h b/src/network/ssl/qsslerror.h
index ce4c749..c30c02a 100644
--- a/src/network/ssl/qsslerror.h
+++ b/src/network/ssl/qsslerror.h
@@ -83,6 +83,7 @@ public:
         NoPeerCertificate,
         HostNameMismatch,
         NoSslSupport,
+        CertificateBlacklisted,
         UnspecifiedError = -1
     };
 
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 1abb295..78a78a2 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -1238,16 +1238,18 @@ bool QSslSocketBackendPrivate::startHandshake()
     X509 *x509 = q_SSL_get_peer_certificate(ssl);
     configuration.peerCertificate = QSslCertificatePrivate::QSslCertificate_from_X509(x509);
     q_X509_free(x509);
-    if (QSslCertificatePrivate::isBlacklisted(configuration.peerCertificate)) {
-        q->setErrorString(QSslSocket::tr("The peer certificate is blacklisted"));
-        q->setSocketError(QAbstractSocket::SslHandshakeFailedError);
-        emit q->error(QAbstractSocket::SslHandshakeFailedError);
-        plainSocket->disconnectFromHost();
-        return false;
-    }
 
     // Start translating errors.
     QList<QSslError> errors;
+
+    if (QSslCertificatePrivate::isBlacklisted(configuration.peerCertificate)) {
+        QSslError error(QSslError::CertificateBlacklisted, configuration.peerCertificate);
+        errors << error;
+        emit q->peerVerifyError(error);
+        if (q->state() != QAbstractSocket::ConnectedState)
+            return false;
+    }
+
     bool doVerifyPeer = configuration.peerVerifyMode == QSslSocket::VerifyPeer
                         || (configuration.peerVerifyMode == QSslSocket::AutoVerifyPeer
                             && mode == QSslSocket::SslClientMode);
diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index 9c32c2b..5b30a39 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -188,7 +188,7 @@ private slots:
     void ignoreSslErrorsListWithSlot();
     void readFromClosedSocket();
     void writeBigChunk();
-    void blacklist();
+    void blacklistedCertificates();
     void setEmptyDefaultConfiguration();
 
     static void exitLoop()
@@ -1983,7 +1983,7 @@ void tst_QSslSocket::writeBigChunk()
     socket->close();
 }
 
-void tst_QSslSocket::blacklist()
+void tst_QSslSocket::blacklistedCertificates()
 {
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy)
@@ -2004,14 +2004,15 @@ void tst_QSslSocket::blacklist()
     QVERIFY(sender->state() == QAbstractSocket::ConnectedState);
     receiver->setObjectName("receiver");
     sender->setObjectName("sender");
-    receiver->ignoreSslErrors();
     receiver->startClientEncryption();
 
-    connect(receiver, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(exitLoop()));
+    connect(receiver, SIGNAL(sslErrors(QList<QSslError>)), SLOT(exitLoop()));
     connect(receiver, SIGNAL(encrypted()), SLOT(exitLoop()));
     enterLoop(1);
-    QCOMPARE(receiver->error(), QAbstractSocket::SslHandshakeFailedError);
-    QCOMPARE(receiver->errorString(), QString("The peer certificate is blacklisted"));
+    QList<QSslError> sslErrors = receiver->sslErrors();
+    QVERIFY(sslErrors.count() > 0);
+    // there are more errors (self signed cert and hostname mismatch), but we only care about the blacklist error
+    QCOMPARE(sslErrors.at(0).error(), QSslError::CertificateBlacklisted);
 }
 
 void tst_QSslSocket::setEmptyDefaultConfiguration()
-- 
cgit v0.12


From ece08933ededbc5c484087b427a1b97e63fde69c Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 7 Apr 2011 16:01:00 +0200
Subject: Removed useless comment

That call was removed in 0ee221b374ffef3657247be4c78e05689e04bef7
---
 src/corelib/thread/qthread.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index acf0fce..aaa1e6d 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -149,9 +149,6 @@ QAdoptedThread::QAdoptedThread(QThreadData *data)
 
 QAdoptedThread::~QAdoptedThread()
 {
-#ifndef QT_NO_THREAD
-//    QThreadPrivate::finish(this);
-#endif
     // fprintf(stderr, "~QAdoptedThread = %p\n", this);
 }
 
-- 
cgit v0.12


From c238398e8e120c870c7581dc3a415c5d8d910e88 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 7 Apr 2011 16:25:02 +0200
Subject: Made wayland plugin single-threaded, yay :)

Not calling QApplication::processEvents() in qt_init any more, and not
using a write socket notifier to send data over the wayland protocol.
---
 src/gui/kernel/qapplication_qpa.cpp                |   2 -
 src/plugins/platforms/wayland/qwaylanddisplay.cpp  | 111 +++++++++++----
 src/plugins/platforms/wayland/qwaylanddisplay.h    |  28 +++-
 .../platforms/wayland/qwaylandeventthread.cpp      | 158 ---------------------
 .../platforms/wayland/qwaylandeventthread.h        |  87 ------------
 src/plugins/platforms/wayland/qwaylandwindow.cpp   |  14 +-
 src/plugins/platforms/wayland/qwaylandwindow.h     |   1 -
 src/plugins/platforms/wayland/wayland.pro          |   6 +-
 8 files changed, 117 insertions(+), 290 deletions(-)
 delete mode 100644 src/plugins/platforms/wayland/qwaylandeventthread.cpp
 delete mode 100644 src/plugins/platforms/wayland/qwaylandeventthread.h

diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp
index b1f26fd..1d4400a 100644
--- a/src/gui/kernel/qapplication_qpa.cpp
+++ b/src/gui/kernel/qapplication_qpa.cpp
@@ -564,8 +564,6 @@ void qt_init(QApplicationPrivate *priv, int type)
     init_platform(QLatin1String(platformName), platformPluginPath);
     init_plugins(pluginList);
 
-    QApplication::processEvents();
-
     QColormap::initialize();
     QFont::initialize();
 #ifndef QT_NO_CURSOR
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index 4f456c9..e2bfaa2 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -45,12 +45,12 @@
 #include "qwaylandscreen.h"
 #include "qwaylandcursor.h"
 #include "qwaylandinputdevice.h"
-#include "qwaylandeventthread.h"
 
 #ifdef QT_WAYLAND_GL_SUPPORT
 #include "gl_integration/qwaylandglintegration.h"
 #endif
 
+#include <QtCore/QAbstractEventDispatcher>
 #include <QtGui/QApplication>
 
 #include <unistd.h>
@@ -113,24 +113,6 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = {
     QWaylandDisplay::shellHandleConfigure,
 };
 
-void QWaylandDisplay::displayHandleGlobal(uint32_t id, QByteArray interface, uint32_t version)
-{
-    Q_UNUSED(version);
-
-    if (interface == "compositor") {
-        mCompositor = wl_compositor_create(mDisplay, id);
-    } else if (interface == "shm") {
-        mShm = wl_shm_create(mDisplay, id);
-    } else if (interface == "shell"){
-        mShell = wl_shell_create(mDisplay, id);
-        wl_shell_add_listener(mShell, &shellListener, this);
-    } else if (interface == "input_device") {
-        QWaylandInputDevice *inputDevice =
-            new QWaylandInputDevice(mDisplay, id);
-        mInputDevices.append(inputDevice);
-    }
-}
-
 QWaylandDisplay::QWaylandDisplay(void)
 {
     mDisplay = wl_display_connect(NULL);
@@ -142,24 +124,29 @@ QWaylandDisplay::QWaylandDisplay(void)
     mEglIntegration = QWaylandGLIntegration::createGLIntegration(this);
 #endif
 
-    mEventThread = new QWaylandEventThread(this);
-
-
-    mEventThread->waitForScreens();
+    qRegisterMetaType<uint32_t>("uint32_t");
 
 #ifdef QT_WAYLAND_GL_SUPPORT
     mEglIntegration->initialize();
 #endif
 
+    connect(QAbstractEventDispatcher::instance(), SIGNAL(aboutToBlock()), this, SLOT(flushRequests()));
+
+    wl_display_add_global_listener(mDisplay, QWaylandDisplay::displayHandleGlobal, this);
+    mFd = wl_display_get_fd(mDisplay, sourceUpdate, this);
 
+    mReadNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read, this);
+    connect(mReadNotifier, SIGNAL(activated(int)), this, SLOT(readEvents()));
+
+    waitForScreens();
 }
 
 QWaylandDisplay::~QWaylandDisplay(void)
 {
+    close(mFd);
 #ifdef QT_WAYLAND_GL_SUPPORT
     delete mEglIntegration;
 #endif
-    delete mEventThread;
     wl_display_destroy(mDisplay);
 }
 
@@ -179,3 +166,79 @@ void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, void *data)
     wl_display_frame_callback(mDisplay, func, data);
 }
 
+void QWaylandDisplay::flushRequests()
+{
+    if (mSocketMask & WL_DISPLAY_WRITABLE)
+        wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE);
+}
+
+void QWaylandDisplay::readEvents()
+{
+    wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
+}
+
+int QWaylandDisplay::sourceUpdate(uint32_t mask, void *data)
+{
+    QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
+    waylandDisplay->mSocketMask = mask;
+
+    return 0;
+}
+
+void QWaylandDisplay::outputHandleGeometry(void *data,
+                                           struct wl_output *output,
+                                           int32_t x, int32_t y,
+                                           int32_t width, int32_t height)
+{
+    //call back function called from another thread;
+    //but its safe to call createScreen from another thread since
+    //QWaylandScreen does a moveToThread
+    QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
+    QRect outputRect = QRect(x, y, width, height);
+    waylandDisplay->createNewScreen(output,outputRect);
+}
+
+const struct wl_output_listener QWaylandDisplay::outputListener = {
+    QWaylandDisplay::outputHandleGeometry
+};
+
+void QWaylandDisplay::waitForScreens()
+{
+    flushRequests();
+    while (mScreens.isEmpty())
+        readEvents();
+}
+
+void QWaylandDisplay::displayHandleGlobal(struct wl_display *display,
+                                          uint32_t id,
+                                          const char *interface,
+                                          uint32_t version,
+                                          void *data)
+{
+    Q_UNUSED(display);
+    QWaylandDisplay *that = static_cast<QWaylandDisplay *>(data);
+    that->displayHandleGlobal(id, QByteArray(interface), version);
+}
+
+void QWaylandDisplay::displayHandleGlobal(uint32_t id,
+                                          const QByteArray &interface,
+                                          uint32_t version)
+{
+    Q_UNUSED(version);
+
+    if (interface == "output") {
+        struct wl_output *output = wl_output_create(mDisplay, id);
+        wl_output_add_listener(output, &outputListener, this);
+    } else if (interface == "compositor") {
+        mCompositor = wl_compositor_create(mDisplay, id);
+    } else if (interface == "shm") {
+        mShm = wl_shm_create(mDisplay, id);
+    } else if (interface == "shell"){
+        mShell = wl_shell_create(mDisplay, id);
+        wl_shell_add_listener(mShell, &shellListener, this);
+    } else if (interface == "input_device") {
+        QWaylandInputDevice *inputDevice =
+            new QWaylandInputDevice(mDisplay, id);
+        mInputDevices.append(inputDevice);
+    }
+}
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index 4cfb7b5..ac0ad71 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -55,8 +55,6 @@ class QWaylandBuffer;
 class QPlatformScreen;
 class QWaylandScreen;
 class QWaylandGLIntegration;
-class QWaylandEventThread;
-
 class QWaylandDisplay : public QObject {
     Q_OBJECT
 
@@ -85,17 +83,39 @@ public:
     struct wl_display *wl_display() const { return mDisplay; }
 public slots:
     void createNewScreen(struct wl_output *output, QRect geometry);
-    void displayHandleGlobal(uint32_t id, QByteArray interface, uint32_t version);
+    void readEvents();
+    void flushRequests();
 
 private:
+    void waitForScreens();
+    void displayHandleGlobal(uint32_t id,
+                             const QByteArray &interface,
+                             uint32_t version);
+
     struct wl_display *mDisplay;
-    QWaylandEventThread *mEventThread;
     struct wl_compositor *mCompositor;
     struct wl_shm *mShm;
     struct wl_shell *mShell;
     QList<QPlatformScreen *> mScreens;
     QList<QWaylandInputDevice *> mInputDevices;
 
+    QSocketNotifier *mReadNotifier;
+    int mFd;
+    bool mScreensInitialized;
+
+    uint32_t mSocketMask;
+
+    static const struct wl_output_listener outputListener;
+    static int sourceUpdate(uint32_t mask, void *data);
+    static void displayHandleGlobal(struct wl_display *display,
+                                    uint32_t id,
+                                    const char *interface,
+                                    uint32_t version, void *data);
+    static void outputHandleGeometry(void *data,
+                                     struct wl_output *output,
+                                     int32_t x, int32_t y,
+                                     int32_t width, int32_t height);
+
 #ifdef QT_WAYLAND_GL_SUPPORT
     QWaylandGLIntegration *mEglIntegration;
 #endif
diff --git a/src/plugins/platforms/wayland/qwaylandeventthread.cpp b/src/plugins/platforms/wayland/qwaylandeventthread.cpp
deleted file mode 100644
index 1474d9c..0000000
--- a/src/plugins/platforms/wayland/qwaylandeventthread.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandeventthread.h"
-
-#include <QtCore/QMetaType>
-
-QWaylandEventThread::QWaylandEventThread(QWaylandDisplay *display)
-    : QObject()
-    , mDisplay(display)
-    , mReadNotifier(0)
-    , mWriteNotifier(0)
-    , mFd(0)
-    , mScreensInitialized(false)
-{
-    qRegisterMetaType<uint32_t>("uint32_t");
-    QThread *thread = new QThread(this);
-    moveToThread(thread);
-    connect(thread,SIGNAL(started()),SLOT(runningInThread()));
-    thread->start();
-
-}
-
-QWaylandEventThread::~QWaylandEventThread()
-{
-    close(mFd);
-}
-
-void QWaylandEventThread::runningInThread()
-{
-
-    wl_display_add_global_listener(mDisplay->wl_display(),
-                                   QWaylandEventThread::displayHandleGlobal, this);
-    int fd = wl_display_get_fd(mDisplay->wl_display(), sourceUpdate, this);
-    mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
-    connect(mReadNotifier,
-            SIGNAL(activated(int)), this, SLOT(readEvents()));
-
-    mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this);
-    connect(mWriteNotifier,
-            SIGNAL(activated(int)), this, SLOT(flushRequests()));
-    mWriteNotifier->setEnabled(false);
-
-    readEvents();
-}
-
-
-int QWaylandEventThread::sourceUpdate(uint32_t mask, void *data)
-{
-    QWaylandEventThread *eventThread = (QWaylandEventThread *) data;
-
-    /* FIXME: We get a callback here when we ask wl_display for the
-     * fd, but at that point we don't have the socket notifier as we
-     * need the fd to create that.  We'll probably need to split that
-     * API into get_fd and set_update_func functions. */
-    if (eventThread->mWriteNotifier == NULL)
-        return 0;
-
-    QMetaObject::invokeMethod(eventThread->mWriteNotifier,"setEnabled",Qt::QueuedConnection,
-                              Q_ARG(bool,mask & WL_DISPLAY_WRITABLE));
-//    eventThread->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE);
-
-    return 0;
-}
-
-void QWaylandEventThread::readEvents()
-{
-    wl_display_iterate(mDisplay->wl_display(), WL_DISPLAY_READABLE);
-}
-
-
-void QWaylandEventThread::flushRequests()
-{
-    wl_display_iterate(mDisplay->wl_display(), WL_DISPLAY_WRITABLE);
-}
-
-void QWaylandEventThread::outputHandleGeometry(void *data,
-                                           struct wl_output *output,
-                                           int32_t x, int32_t y,
-                                           int32_t width, int32_t height)
-{
-    //call back function called from another thread;
-    //but its safe to call createScreen from another thread since
-    //QWaylandScreen does a moveToThread
-    QWaylandEventThread *waylandEventThread = static_cast<QWaylandEventThread *>(data);
-    QRect outputRect = QRect(x, y, width, height);
-    waylandEventThread->mDisplay->createNewScreen(output,outputRect);
-    waylandEventThread->mScreensInitialized = true;
-    waylandEventThread->mWaitForScreens.wakeAll();
-}
-
-const struct wl_output_listener QWaylandEventThread::outputListener = {
-    QWaylandEventThread::outputHandleGeometry
-};
-
-void QWaylandEventThread::displayHandleGlobal(wl_display *display,
-                                              uint32_t id,
-                                              const char *interface,
-                                              uint32_t version,
-                                              void *data)
-{
-    if (strcmp(interface, "output") == 0) {
-        struct wl_output *output = wl_output_create(display, id);
-        wl_output_add_listener(output, &outputListener, data);
-    }
-    Q_UNUSED(display);
-    QWaylandEventThread *that = static_cast<QWaylandEventThread *>(data);
-    QByteArray interfaceByteArray(interface);
-    QMetaObject::invokeMethod(that->mDisplay,"displayHandleGlobal",Qt::QueuedConnection,
-                              Q_ARG(uint32_t,id),Q_ARG(QByteArray,interfaceByteArray),Q_ARG(uint32_t,version));
-}
-
-void QWaylandEventThread::waitForScreens()
-{
-    QMutex lock;
-    lock.lock();
-    if (!mScreensInitialized) {
-        mWaitForScreens.wait(&lock);
-    }
-}
diff --git a/src/plugins/platforms/wayland/qwaylandeventthread.h b/src/plugins/platforms/wayland/qwaylandeventthread.h
deleted file mode 100644
index 7a5189e..0000000
--- a/src/plugins/platforms/wayland/qwaylandeventthread.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDEVENTTHREAD_H
-#define QWAYLANDEVENTTHREAD_H
-
-#include "qwaylanddisplay.h"
-
-#include <QtCore/QObject>
-#include <QtCore/QThread>
-#include <QtCore/QSocketNotifier>
-#include <QtCore/QMutex>
-
-class QWaylandEventThread : public QObject
-{
-    Q_OBJECT
-public:
-    explicit QWaylandEventThread(QWaylandDisplay *display);
-    ~QWaylandEventThread();
-
-    static int sourceUpdate(uint32_t mask, void *data);
-
-    void waitForScreens();
-
-signals:
-public slots:
-    void runningInThread();
-    void readEvents();
-    void flushRequests();
-private:
-    QWaylandDisplay *mDisplay;
-    QSocketNotifier *mReadNotifier;
-    QSocketNotifier *mWriteNotifier;
-    int mFd;
-    QWaitCondition mWaitForScreens;
-    bool mScreensInitialized;
-
-    static const struct wl_output_listener outputListener;
-    static void displayHandleGlobal(struct wl_display *display,
-                                    uint32_t id,
-                                    const char *interface,
-                                    uint32_t version, void *data);
-    static void outputHandleGeometry(void *data,
-                                     struct wl_output *output,
-                                     int32_t x, int32_t y,
-                                     int32_t width, int32_t height);
-};
-
-#endif // QWAYLANDEVENTTHREAD_H
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index aa72ad5..c7cd147 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -142,18 +142,12 @@ void QWaylandWindow::frameCallback(void *data, uint32_t time)
 {
     Q_UNUSED(time);
     QWaylandWindow *self = static_cast<QWaylandWindow*>(data);
-    if (self->mWaitingForFrameSync) {
-        self->mWaitingForFrameSync = false;
-        self->mFrameSyncWait.wakeAll();
-    }
+    self->mWaitingForFrameSync = false;
 }
 
 void QWaylandWindow::waitForFrameSync()
 {
-    if (!mWaitingForFrameSync) {
-        return;
-    }
-    QMutex lock;
-    lock.lock();
-    mFrameSyncWait.wait(&lock);
+    mDisplay->flushRequests();
+    while (mWaitingForFrameSync)
+        mDisplay->readEvents();
 }
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
index ad4bba4..35b82bd 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -44,7 +44,6 @@
 
 #include <QtGui/QPlatformWindow>
 #include <QtCore/QWaitCondition>
-#include <QtCore/QMutex>
 
 #include "qwaylanddisplay.h"
 
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index 849299a..e5c866b 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -14,8 +14,7 @@ SOURCES =   main.cpp \
             qwaylanddisplay.cpp \
             qwaylandwindow.cpp \
             qwaylandscreen.cpp \
-            qwaylandshmwindow.cpp \
-            qwaylandeventthread.cpp
+            qwaylandshmwindow.cpp
 
 HEADERS =   qwaylandintegration.h \
             qwaylandcursor.h \
@@ -24,8 +23,7 @@ HEADERS =   qwaylandintegration.h \
             qwaylandscreen.h \
             qwaylandshmsurface.h \
             qwaylandbuffer.h \
-            qwaylandshmwindow.h \
-            qwaylandeventthread.h
+            qwaylandshmwindow.h
 
 INCLUDEPATH += $$QMAKE_INCDIR_WAYLAND
 LIBS += $$QMAKE_LIBS_WAYLAND
-- 
cgit v0.12


From f94a2cb583c579652b3d7d9af5100fd03da6e421 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 7 Apr 2011 16:54:26 +0200
Subject: Fixed crash in XCB backend.

We need to sync here for some reason.
---
 src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 2413a32..7ad12fe 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -126,6 +126,8 @@ QXcbConnection::QXcbConnection(const char *displayName)
 
     QAbstractEventDispatcher *dispatcher = QAbstractEventDispatcher::instance(qApp->thread());
     connect(dispatcher, SIGNAL(aboutToBlock()), this, SLOT(processXcbEvents()));
+
+    sync();
 }
 
 QXcbConnection::~QXcbConnection()
-- 
cgit v0.12


From 5b48f0fadd7624d8535f7d9b2d4c4af452d3b9dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 7 Apr 2011 17:54:23 +0200
Subject: Wayland: Add a egl xcomposite backend

---
 .../platforms/eglconvenience/eglconvenience.pri    |   7 ++
 .../eglconvenience/xlibeglintegration.pri          |   7 ++
 .../wayland/gl_integration/gl_integration.pri      |   4 +
 .../qwaylandxcompositeeglcontext.cpp               | 128 +++++++++++++++++++++
 .../xcomposite_egl/qwaylandxcompositeeglcontext.h  |  41 +++++++
 .../qwaylandxcompositeeglintegration.cpp           |  97 ++++++++++++++++
 .../qwaylandxcompositeeglintegration.h             |  57 +++++++++
 .../xcomposite_egl/qwaylandxcompositeeglwindow.cpp |  36 ++++++
 .../xcomposite_egl/qwaylandxcompositeeglwindow.h   |  24 ++++
 .../xcomposite_egl/xcomposite_egl.pri              |  15 +++
 src/plugins/platforms/wayland/wayland.pro          |   5 +-
 11 files changed, 420 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/platforms/eglconvenience/eglconvenience.pri
 create mode 100644 src/plugins/platforms/eglconvenience/xlibeglintegration.pri
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri

diff --git a/src/plugins/platforms/eglconvenience/eglconvenience.pri b/src/plugins/platforms/eglconvenience/eglconvenience.pri
new file mode 100644
index 0000000..322d4e4
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/eglconvenience.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH += $$PWD
+
+SOURCES += \
+    $$PWD/qeglconvenience.cpp
+
+HEADERS += \
+    $$PWD/qeglconvenience.h
diff --git a/src/plugins/platforms/eglconvenience/xlibeglintegration.pri b/src/plugins/platforms/eglconvenience/xlibeglintegration.pri
new file mode 100644
index 0000000..9404a70
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/xlibeglintegration.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+    $$PWD/qxlibeglintegration.h
+
+SOURCES += \
+    $$PWD/qxlibeglintegration.cpp
diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index 52272c3..73a0c25 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -21,3 +21,7 @@ xpixmap_glx {
 xcomposite_glx {
     include ($$PWD/xcomposite_glx/xcomposite_glx.pri)
 }
+
+xcomposite_egl {
+    include ($$PWD/xcomposite_egl/xcomposite_egl.pri)
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
new file mode 100644
index 0000000..33ab7c5
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
@@ -0,0 +1,128 @@
+#include "qwaylandxcompositeeglcontext.h"
+
+#include "qwaylandxcompositeeglwindow.h"
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+#include <QtCore/QDebug>
+
+#include "qeglconvenience.h"
+#include "qxlibeglintegration.h"
+
+#include <X11/extensions/Xcomposite.h>
+
+QWaylandXCompositeEGLContext::QWaylandXCompositeEGLContext(QWaylandXCompositeEGLIntegration *glxIntegration, QWaylandXCompositeEGLWindow *window)
+    : QPlatformGLContext()
+    , mEglIntegration(glxIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mXWindow(0)
+    , mConfig(q_configFromQPlatformWindowFormat(glxIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_WINDOW_BIT))
+    , mWaitingForSync(false)
+{
+    QVector<EGLint> eglContextAttrs;
+    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION); eglContextAttrs.append(2);
+    eglContextAttrs.append(EGL_NONE);
+
+    mContext = eglCreateContext(glxIntegration->eglDisplay(),mConfig,EGL_NO_CONTEXT,eglContextAttrs.constData());
+    if (mContext == EGL_NO_CONTEXT) {
+        qFatal("failed to find context");
+    }
+
+    geometryChanged();
+}
+
+void QWaylandXCompositeEGLContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+
+    eglMakeCurrent(mEglIntegration->eglDisplay(),mEglWindowSurface,mEglWindowSurface,mContext);
+}
+
+void QWaylandXCompositeEGLContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+    eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QWaylandXCompositeEGLContext::swapBuffers()
+{
+    QSize size = mWindow->geometry().size();
+
+    eglSwapBuffers(mEglIntegration->eglDisplay(),mEglWindowSurface);
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+    mWindow->waitForFrameSync();
+}
+
+void * QWaylandXCompositeEGLContext::getProcAddress(const QString &procName)
+{
+    return (void *)eglGetProcAddress(qPrintable(procName));
+}
+
+QPlatformWindowFormat QWaylandXCompositeEGLContext::platformWindowFormat() const
+{
+    return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
+}
+
+void QWaylandXCompositeEGLContext::sync_function(void *data)
+{
+    QWaylandXCompositeEGLContext *that = static_cast<QWaylandXCompositeEGLContext *>(data);
+    that->mWaitingForSync = false;
+}
+
+void QWaylandXCompositeEGLContext::geometryChanged()
+{
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
+    delete mBuffer;
+    //XFreePixmap deletes the glxPixmap as well
+    if (mXWindow) {
+        XDestroyWindow(mEglIntegration->xDisplay(),mXWindow);
+    }
+
+    VisualID visualId = QXlibEglIntegration::getCompatibleVisualId(mEglIntegration->xDisplay(),mEglIntegration->eglDisplay(),mConfig);
+
+    XVisualInfo visualInfoTemplate;
+    memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+    visualInfoTemplate.visualid = visualId;
+
+    int matchingCount = 0;
+    XVisualInfo *visualInfo = XGetVisualInfo(mEglIntegration->xDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount);
+
+    Colormap cmap = XCreateColormap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),visualInfo->visual,AllocNone);
+
+    XSetWindowAttributes a;
+    a.colormap = cmap;
+    mXWindow = XCreateWindow(mEglIntegration->xDisplay(), mEglIntegration->rootWindow(),0, 0, size.width(), size.height(),
+                             0, visualInfo->depth, InputOutput, visualInfo->visual,
+                             CWColormap, &a);
+
+    XCompositeRedirectWindow(mEglIntegration->xDisplay(), mXWindow, CompositeRedirectManual);
+    XMapWindow(mEglIntegration->xDisplay(), mXWindow);
+
+    mEglWindowSurface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mConfig,mXWindow,0);
+    if (mEglWindowSurface == EGL_NO_SURFACE) {
+        qFatal("Could not make eglsurface");
+    }
+
+    XSync(mEglIntegration->xDisplay(),False);
+    mBuffer = new QWaylandXCompositeBuffer(mEglIntegration->waylandXComposite(),
+                                           (uint32_t)mXWindow,
+                                           size,
+                                           mEglIntegration->waylandDisplay()->argbVisual());
+    mWindow->attach(mBuffer);
+    wl_display_sync_callback(mEglIntegration->waylandDisplay()->wl_display(),
+                             QWaylandXCompositeEGLContext::sync_function,
+                             this);
+
+    mWaitingForSync = true;
+    wl_display_sync(mEglIntegration->waylandDisplay()->wl_display(),0);
+    mEglIntegration->waylandDisplay()->flushRequests();
+    while (mWaitingForSync) {
+        mEglIntegration->waylandDisplay()->readEvents();
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
new file mode 100644
index 0000000..a6ca49e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
@@ -0,0 +1,41 @@
+#ifndef QWAYLANDXCOMPOSITEEGLCONTEXT_H
+#define QWAYLANDXCOMPOSITEEGLCONTEXT_H
+
+#include <QtGui/QPlatformGLContext>
+
+#include <QtCore/QWaitCondition>
+
+#include "qwaylandbuffer.h"
+#include "qwaylandxcompositeeglintegration.h"
+
+class QWaylandXCompositeEGLWindow;
+
+class QWaylandXCompositeEGLContext : public QPlatformGLContext
+{
+public:
+    QWaylandXCompositeEGLContext(QWaylandXCompositeEGLIntegration *glxIntegration, QWaylandXCompositeEGLWindow *window);
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandXCompositeEGLIntegration *mEglIntegration;
+    QWaylandXCompositeEGLWindow *mWindow;
+    QWaylandBuffer *mBuffer;
+
+    Window mXWindow;
+    EGLConfig mConfig;
+    EGLContext mContext;
+    EGLSurface mEglWindowSurface;
+
+    static void sync_function(void *data);
+    bool mWaitingForSync;
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
new file mode 100644
index 0000000..e8b4fd4
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
@@ -0,0 +1,97 @@
+#include "qwaylandxcompositeeglintegration.h"
+
+#include "qwaylandxcompositeeglwindow.h"
+
+#include <QtCore/QDebug>
+
+#include "wayland-xcomposite-client-protocol.h"
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandXCompositeEGLIntegration(waylandDisplay);
+}
+
+QWaylandXCompositeEGLIntegration::QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDispaly)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(waylandDispaly)
+{
+    wl_display_add_global_listener(mWaylandDisplay->wl_display(), QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal,
+                                   this);
+}
+
+QWaylandXCompositeEGLIntegration::~QWaylandXCompositeEGLIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+void QWaylandXCompositeEGLIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandXCompositeEGLIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandXCompositeEGLWindow(widget,this);
+}
+
+Display * QWaylandXCompositeEGLIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+EGLDisplay QWaylandXCompositeEGLIntegration::eglDisplay() const
+{
+    return mEglDisplay;
+}
+
+int QWaylandXCompositeEGLIntegration::screen() const
+{
+    return mScreen;
+}
+
+Window QWaylandXCompositeEGLIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandXCompositeEGLIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
+wl_xcomposite * QWaylandXCompositeEGLIntegration::waylandXComposite() const
+{
+    return mWaylandComposite;
+}
+
+const struct wl_xcomposite_listener QWaylandXCompositeEGLIntegration::xcomposite_listener = {
+    QWaylandXCompositeEGLIntegration::rootInformation
+};
+
+void QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
+{
+    Q_UNUSED(version);
+    if (strcmp(interface, "xcomposite") == 0) {
+        QWaylandXCompositeEGLIntegration *integration = static_cast<QWaylandXCompositeEGLIntegration *>(data);
+        integration->mWaylandComposite = wl_xcomposite_create(display,id);
+        wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+    }
+
+}
+
+void QWaylandXCompositeEGLIntegration::rootInformation(void *data, wl_xcomposite *xcomposite, const char *display_name, uint32_t root_window)
+{
+    Q_UNUSED(xcomposite);
+    QWaylandXCompositeEGLIntegration *integration = static_cast<QWaylandXCompositeEGLIntegration *>(data);
+
+    integration->mDisplay = XOpenDisplay(display_name);
+    integration->mRootWindow = (Window) root_window;
+    integration->mScreen = XDefaultScreen(integration->mDisplay);
+    integration->mEglDisplay = eglGetDisplay(integration->mDisplay);
+    eglBindAPI(EGL_OPENGL_ES_API);
+    EGLint minor,major;
+    if (!eglInitialize(integration->mEglDisplay,&major,&minor)) {
+        qFatal("Failed to initialize EGL");
+    }
+    eglSwapInterval(integration->eglDisplay(),0);
+    qDebug() << "ROOT INFORMATION" << integration->mDisplay << integration->mRootWindow << integration->mScreen;
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
new file mode 100644
index 0000000..3289c9a
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
@@ -0,0 +1,57 @@
+#ifndef QWAYLANDXCOMPOSITEEGLINTEGRATION_H
+#define QWAYLANDXCOMPOSITEEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+#include "wayland-client.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <QWaitCondition>
+
+#include <X11/Xlib.h>
+#include <EGL/egl.h>
+
+struct wl_xcomposite;
+
+class QWaylandXCompositeEGLIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDispaly);
+    ~QWaylandXCompositeEGLIntegration();
+
+    void initialize();
+
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+    struct wl_xcomposite *waylandXComposite() const;
+
+    Display *xDisplay() const;
+    EGLDisplay eglDisplay() const;
+    int screen() const;
+    Window rootWindow() const;
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+    struct wl_xcomposite *mWaylandComposite;
+
+    Display *mDisplay;
+    EGLDisplay mEglDisplay;
+    int mScreen;
+    Window mRootWindow;
+
+    static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id,
+                             const char *interface, uint32_t version, void *data);
+
+    static const struct wl_xcomposite_listener xcomposite_listener;
+    static void rootInformation(void *data,
+                 struct wl_xcomposite *xcomposite,
+                 const char *display_name,
+                 uint32_t root_window);
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
new file mode 100644
index 0000000..ab3f7ae
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
@@ -0,0 +1,36 @@
+#include "qwaylandxcompositeeglwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandXCompositeEGLWindow::QWaylandXCompositeEGLWindow(QWidget *window, QWaylandXCompositeEGLIntegration *glxIntegration)
+    : QWaylandWindow(window)
+    , mGlxIntegration(glxIntegration)
+    , mContext(0)
+{
+
+}
+
+QWaylandWindow::WindowType QWaylandXCompositeEGLWindow::windowType() const
+{
+    //yeah. this type needs a new name
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandXCompositeEGLWindow::glContext() const
+{
+    if (!mContext) {
+        qDebug() << "creating glcontext;";
+        QWaylandXCompositeEGLWindow *that = const_cast<QWaylandXCompositeEGLWindow *>(this);
+        that->mContext = new QWaylandXCompositeEGLContext(mGlxIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandXCompositeEGLWindow::setGeometry(const QRect &rect)
+{
+    QWaylandWindow::setGeometry(rect);
+
+    if (mContext) {
+        mContext->geometryChanged();
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
new file mode 100644
index 0000000..5cdde70
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
@@ -0,0 +1,24 @@
+#ifndef QWAYLANDXCOMPOSITEEGLWINDOW_H
+#define QWAYLANDXCOMPOSITEEGLWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandxcompositeeglintegration.h"
+#include "qwaylandxcompositeeglcontext.h"
+
+class QWaylandXCompositeEGLWindow : public QWaylandWindow
+{
+public:
+    QWaylandXCompositeEGLWindow(QWidget *window, QWaylandXCompositeEGLIntegration *glxIntegration);
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+
+private:
+    QWaylandXCompositeEGLIntegration *mGlxIntegration;
+    QWaylandXCompositeEGLContext *mContext;
+
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri
new file mode 100644
index 0000000..c3533f9
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri
@@ -0,0 +1,15 @@
+include (../xcomposite_share/xcomposite_share.pri)
+include (../../../eglconvenience/eglconvenience.pri)
+include (../../../eglconvenience/xlibeglintegration.pri)
+
+LIBS += -lXcomposite -lEGL
+
+SOURCES += \
+    $$PWD/qwaylandxcompositeeglcontext.cpp \
+    $$PWD/qwaylandxcompositeeglintegration.cpp \
+    $$PWD/qwaylandxcompositeeglwindow.cpp
+
+HEADERS += \
+    $$PWD/qwaylandxcompositeeglcontext.h \
+    $$PWD/qwaylandxcompositeeglintegration.h \
+    $$PWD/qwaylandxcompositeeglwindow.h
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index e5c866b..bd017cc 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -38,8 +38,11 @@ contains(QT_CONFIG, opengl) {
     contains(QT_CONFIG, opengles2) {
         CONFIG += wayland_egl
         #CONFIG += xpixmap_egl
+        #CONFIG += xcomposite_egl
     } else {
-        CONFIG += xpixmap_glx    
+        CONFIG += xpixmap_glx
+        #CONFIG += xcomposite_gl
+
     }
 
     include ($$PWD/gl_integration/gl_integration.pri)
-- 
cgit v0.12


From 77843fdd856cef5d48e5851d0d961fe5bf4455b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 7 Apr 2011 18:02:15 +0200
Subject: Wayland: Add license headers to new files

---
 .../gl_integration/qwaylandglintegration.cpp       | 41 ++++++++++++++
 .../wayland/gl_integration/qwaylandglintegration.h | 41 ++++++++++++++
 .../gl_integration/qwaylandglwindowsurface.h       |  2 +-
 .../wayland_egl/qwaylandeglinclude.h               | 41 ++++++++++++++
 .../wayland_egl/qwaylandeglintegration.cpp         | 41 ++++++++++++++
 .../wayland_egl/qwaylandeglintegration.h           | 41 ++++++++++++++
 .../wayland_egl/qwaylandeglwindow.cpp              |  2 +-
 .../gl_integration/wayland_egl/qwaylandeglwindow.h |  2 +-
 .../qwaylandxcompositeeglcontext.cpp               | 41 ++++++++++++++
 .../xcomposite_egl/qwaylandxcompositeeglcontext.h  | 41 ++++++++++++++
 .../qwaylandxcompositeeglintegration.cpp           | 41 ++++++++++++++
 .../qwaylandxcompositeeglintegration.h             | 41 ++++++++++++++
 .../xcomposite_egl/qwaylandxcompositeeglwindow.cpp | 41 ++++++++++++++
 .../xcomposite_egl/qwaylandxcompositeeglwindow.h   | 41 ++++++++++++++
 .../qwaylandxcompositeglxcontext.cpp               | 41 ++++++++++++++
 .../xcomposite_glx/qwaylandxcompositeglxcontext.h  | 41 ++++++++++++++
 .../qwaylandxcompositeglxintegration.cpp           | 41 ++++++++++++++
 .../qwaylandxcompositeglxintegration.h             | 41 ++++++++++++++
 .../xcomposite_glx/qwaylandxcompositeglxwindow.cpp | 41 ++++++++++++++
 .../xcomposite_glx/qwaylandxcompositeglxwindow.h   | 41 ++++++++++++++
 .../xcomposite_share/qwaylandxcompositebuffer.cpp  | 41 ++++++++++++++
 .../xcomposite_share/qwaylandxcompositebuffer.h    | 41 ++++++++++++++
 .../wayland-xcomposite-client-protocol.h           | 61 +++++++++++++--------
 .../xcomposite_share/wayland-xcomposite-protocol.c | 62 ++++++++++++++--------
 .../xpixmap_egl/qwaylandxpixmapeglcontext.cpp      | 41 ++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapeglcontext.h        | 41 ++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapeglintegration.cpp  | 41 ++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapeglintegration.h    | 41 ++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapwindow.cpp          | 41 ++++++++++++++
 .../xpixmap_egl/qwaylandxpixmapwindow.h            | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxcontext.cpp      | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxcontext.h        | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxintegration.cpp  | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxintegration.h    | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxwindow.cpp       | 41 ++++++++++++++
 .../xpixmap_glx/qwaylandxpixmapglxwindow.h         | 41 ++++++++++++++
 src/plugins/platforms/wayland/qwaylandbuffer.h     |  2 +-
 37 files changed, 1355 insertions(+), 47 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
index 9a0a824..9c8ef4e 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandglintegration.h"
 
 QWaylandGLIntegration::QWaylandGLIntegration()
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
index 16115d5..ac16039 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDGLINTEGRATION_H
 #define QWAYLANDGLINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
index faff872..8d53b42 100644
--- a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
@@ -4,7 +4,7 @@
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the config.tests of the Qt Toolkit.
+** This file is part of the plugins of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
 ** No Commercial Usage
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
index 778c3db..5dc2add 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDEGLINCLUDE_H
 #define QWAYLANDEGLINCLUDE_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
index 942e591..39e7be5 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandeglintegration.h"
 
 #include "gl_integration/qwaylandglintegration.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
index 8b166ce..bf4c3fe 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDEGLINTEGRATION_H
 #define QWAYLANDEGLINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
index a9aa46f..d7cf0a5 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
@@ -4,7 +4,7 @@
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the config.tests of the Qt Toolkit.
+** This file is part of the plugins of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
 ** No Commercial Usage
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
index ef1e02a..549d039 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
@@ -4,7 +4,7 @@
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the config.tests of the Qt Toolkit.
+** This file is part of the plugins of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
 ** No Commercial Usage
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
index 33ab7c5..92acf75 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeeglcontext.h"
 
 #include "qwaylandxcompositeeglwindow.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
index a6ca49e..f0693d4 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEEGLCONTEXT_H
 #define QWAYLANDXCOMPOSITEEGLCONTEXT_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
index e8b4fd4..352e651 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeeglintegration.h"
 
 #include "qwaylandxcompositeeglwindow.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
index 3289c9a..590ae37 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEEGLINTEGRATION_H
 #define QWAYLANDXCOMPOSITEEGLINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
index ab3f7ae..1c9d36f 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeeglwindow.h"
 
 #include <QtCore/QDebug>
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
index 5cdde70..fc33b32 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEEGLWINDOW_H
 #define QWAYLANDXCOMPOSITEEGLWINDOW_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
index 679772c..c108fbd 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeglxcontext.h"
 
 #include "qwaylandxcompositeglxwindow.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
index e5ccd9e..b45ec3f 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEGLXCONTEXT_H
 #define QWAYLANDXCOMPOSITEGLXCONTEXT_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
index dce3d27..da92bc8 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeglxintegration.h"
 
 #include "qwaylandxcompositeglxwindow.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
index 650fdcf..24a4016 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEGLXINTEGRATION_H
 #define QWAYLANDXCOMPOSITEGLXINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
index 57ee27e..db0f254 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositeglxwindow.h"
 
 #include <QtCore/QDebug>
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
index 75058a5..536153d 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEGLXWINDOW_H
 #define QWAYLANDXCOMPOSITEGLXWINDOW_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
index 218907e..4b0d3a0 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxcompositebuffer.h"
 
 #include "wayland-client.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
index c9332d9..b346651 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXCOMPOSITEBUFFER_H
 #define QWAYLANDXCOMPOSITEBUFFER_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
index 1955a74..72376e1 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
@@ -1,24 +1,43 @@
-/*
- * Copyright © 2010 Kristian Høgsberg
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
 
 
 #ifndef XCOMPOSITE_CLIENT_PROTOCOL_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
index da2e4a2..5c966fd 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
@@ -1,25 +1,43 @@
-/*
- * Copyright © 2010 Kristian Høgsberg
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
 
 #include <stdlib.h>
 #include <stdint.h>
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
index 32ba6de..b8ff4c4 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapeglcontext.h"
 
 #include "../../../eglconvenience/qeglconvenience.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
index e6c6e8d..811d75d 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QXPIXMAPREADBACKGLCONTEXT_H
 #define QXPIXMAPREADBACKGLCONTEXT_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
index 8ccfc67..f6967e1 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapeglintegration.h"
 
 #include <QDebug>
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
index 9e7cb66..16c3632 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXPIXMAPEGLINTEGRATION_H
 #define QWAYLANDXPIXMAPEGLINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
index 35ce41a..43a80b5 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapwindow.h"
 
 #include "qwaylandxpixmapeglcontext.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
index 1f10112..f6cae1d 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXPIXMAPWINDOW_H
 #define QWAYLANDXPIXMAPWINDOW_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
index e856c03..8ccd7c9 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapglxcontext.h"
 
 #include "qwaylandshmsurface.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
index c4c3796..3ea9dfe 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXPIXMAPGLXCONTEXT_H
 #define QWAYLANDXPIXMAPGLXCONTEXT_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
index f094946..33d6b06 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapglxintegration.h"
 
 #include "qwaylandxpixmapglxwindow.h"
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
index c48abb4..c7a80de 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXPIXMAPGLXINTEGRATION_H
 #define QWAYLANDXPIXMAPGLXINTEGRATION_H
 
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
index a191320..065a6fd 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qwaylandxpixmapglxwindow.h"
 
 QWaylandXPixmapGLXWindow::QWaylandXPixmapGLXWindow(QWidget *window, QWaylandXPixmapGLXIntegration *glxIntegration)
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
index 6aba21c..5f4d24f 100644
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
+++ b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QWAYLANDXPIXMAPGLXWINDOW_H
 #define QWAYLANDXPIXMAPGLXWINDOW_H
 
diff --git a/src/plugins/platforms/wayland/qwaylandbuffer.h b/src/plugins/platforms/wayland/qwaylandbuffer.h
index 643e89c..8779d5f 100644
--- a/src/plugins/platforms/wayland/qwaylandbuffer.h
+++ b/src/plugins/platforms/wayland/qwaylandbuffer.h
@@ -4,7 +4,7 @@
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the config.tests of the Qt Toolkit.
+** This file is part of the plugins of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
 ** No Commercial Usage
-- 
cgit v0.12


From 7cad215190414cc2a146d95f4077dffa3bd4e6a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 8 Apr 2011 09:33:38 +0200
Subject: Added _NET_WM_PID in XCB backend.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 1e9a0f8..f0b9e32 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -213,6 +213,12 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
                                        1, &parentWindow));
 
     }
+
+    // set the PID to let the WM kill the application if unresponsive
+    long pid = getpid();
+    Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+                                   atom(QXcbAtom::_NET_WM_PID), XCB_ATOM_CARDINAL, 32,
+                                   1, &pid));
 }
 
 QXcbWindow::~QXcbWindow()
-- 
cgit v0.12


From b42914ba7b2c2ec08abeb4ec658ffaea019e3e3f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 8 Apr 2011 09:44:34 +0200
Subject: Set the _NET_WM_WINDOW_TYPE property in the XCB backend.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 38 ++++++++++++++++++++++++++++++++
 src/plugins/platforms/xcb/qxcbwindow.h   |  1 +
 2 files changed, 39 insertions(+)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index f0b9e32..ad91602 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -304,6 +304,8 @@ Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
 {
     Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
 
+    setNetWmWindowTypes(flags);
+
     if (type == Qt::ToolTip)
         flags |= Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint;
     if (type == Qt::Popup)
@@ -407,6 +409,42 @@ Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
     return QPlatformWindow::setWindowFlags(flags);
 }
 
+void QXcbWindow::setNetWmWindowTypes(Qt::WindowFlags flags)
+{
+    // in order of decreasing priority
+    QVector<uint> windowTypes;
+
+    Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+
+    switch (type) {
+    case Qt::Dialog:
+    case Qt::Sheet:
+        windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG));
+        break;
+    case Qt::Tool:
+    case Qt::Drawer:
+        windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY));
+        break;
+    case Qt::ToolTip:
+        windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
+        break;
+    case Qt::SplashScreen:
+        windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH));
+        break;
+    default:
+        break;
+    }
+
+    if (flags & Qt::FramelessWindowHint)
+        windowTypes.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE));
+
+    windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL));
+
+    Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+                                   atom(QXcbAtom::_NET_WM_WINDOW_TYPE), XCB_ATOM_ATOM, 32,
+                                   windowTypes.count(), windowTypes.constData()));
+}
+
 WId QXcbWindow::winId() const
 {
     return m_window;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 0fa4d0f..e049837 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -92,6 +92,7 @@ public:
     void updateSyncRequestCounter();
 
 private:
+    void setNetWmWindowTypes(Qt::WindowFlags flags);
 
     QXcbScreen *m_screen;
 
-- 
cgit v0.12


From 41132f22be02fe4ec73e8e3b5795bdd630344414 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 8 Apr 2011 09:46:08 +0200
Subject: Fixed logical error in XCB backend.

---
 src/plugins/platforms/xcb/qxcbwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index ad91602..107e004 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -672,7 +672,7 @@ void QXcbWindow::handleFocusOutEvent(const xcb_focus_out_event_t *)
 
 void QXcbWindow::updateSyncRequestCounter()
 {
-    if (m_screen->syncRequestSupported() && m_syncValue.lo != 0 || m_syncValue.hi != 0) {
+    if (m_screen->syncRequestSupported() && (m_syncValue.lo != 0 || m_syncValue.hi != 0)) {
         Q_XCB_CALL(xcb_sync_set_counter(xcb_connection(), m_syncCounter, m_syncValue));
         xcb_flush(xcb_connection());
         connection()->sync();
-- 
cgit v0.12


From ce472d082a992547fdd51eb3eda2ee07d06802b6 Mon Sep 17 00:00:00 2001
From: Eckhart Koppen <eckhart.koppen@nokia.com>
Date: Fri, 8 Apr 2011 11:23:00 +0300
Subject: Updated QtOpenGL DEF file

Absented missig functions

Reviewed-by: TrustMe
---
 src/s60installs/bwins/QtOpenGLu.def | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/s60installs/bwins/QtOpenGLu.def b/src/s60installs/bwins/QtOpenGLu.def
index f1db022..27aed05 100644
--- a/src/s60installs/bwins/QtOpenGLu.def
+++ b/src/s60installs/bwins/QtOpenGLu.def
@@ -818,7 +818,7 @@ EXPORTS
 	?glGenFramebuffers@QGLFunctions@@QAEXHPAI@Z @ 817 NONAME ; void QGLFunctions::glGenFramebuffers(int, unsigned int *)
 	?glVertexAttrib3fv@QGLFunctions@@QAEXIPBM@Z @ 818 NONAME ; void QGLFunctions::glVertexAttrib3fv(unsigned int, float const *)
 	?glGetVertexAttribPointerv@QGLFunctions@@QAEXIIPAPAX@Z @ 819 NONAME ; void QGLFunctions::glGetVertexAttribPointerv(unsigned int, unsigned int, void * *)
-	?snippetNameStr@QGLEngineSharedShaders@@SA?AVQByteArray@@W4SnippetName@1@@Z @ 820 NONAME ; class QByteArray QGLEngineSharedShaders::snippetNameStr(enum QGLEngineSharedShaders::SnippetName)
+	?snippetNameStr@QGLEngineSharedShaders@@SA?AVQByteArray@@W4SnippetName@1@@Z @ 820 NONAME ABSENT ; class QByteArray QGLEngineSharedShaders::snippetNameStr(enum QGLEngineSharedShaders::SnippetName)
 	?glUniformMatrix4fv@QGLFunctions@@QAEXHHEPBM@Z @ 821 NONAME ; void QGLFunctions::glUniformMatrix4fv(int, int, unsigned char, float const *)
 	?setContext@QGLTextureGlyphCache@@QAEXPBVQGLContext@@@Z @ 822 NONAME ; void QGLTextureGlyphCache::setContext(class QGLContext const *)
 	?glDeleteBuffers@QGLFunctions@@QAEXHPBI@Z @ 823 NONAME ; void QGLFunctions::glDeleteBuffers(int, unsigned int const *)
-- 
cgit v0.12


From 7f18116cbf6bcae95473ff2d41929ddef66f74c9 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 8 Apr 2011 11:04:53 +0200
Subject: Re-apply part of ba8e5eedf5f40091eb67dd391a7dcaf9299db2f5

It was somehow lost in the merge of the native symbian threads
(wrong merge was cf94df01d2d2364653f2ab602688394450e92d31)
---
 src/corelib/thread/qthread_unix.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index a8c5924..89546b6 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -170,18 +170,28 @@ Q_DESTRUCTOR_FUNCTION(destroy_current_thread_data_key)
 // Utility functions for getting, setting and clearing thread specific data.
 static QThreadData *get_thread_data()
 {
+#ifdef HAVE_TLS
+    return currentThreadData;
+#else
     pthread_once(&current_thread_data_once, create_current_thread_data_key);
     return reinterpret_cast<QThreadData *>(pthread_getspecific(current_thread_data_key));
+#endif
 }
 
 static void set_thread_data(QThreadData *data)
 {
+#ifdef HAVE_TLS
+    currentThreadData = data;
+#endif
     pthread_once(&current_thread_data_once, create_current_thread_data_key);
     pthread_setspecific(current_thread_data_key, data);
 }
 
 static void clear_thread_data()
 {
+#ifdef HAVE_TLS
+    currentThreadData = 0;
+#endif
     pthread_setspecific(current_thread_data_key, 0);
 }
 
-- 
cgit v0.12


From df07da9730db0fb8f4fdc515671e89bf4964fb78 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 8 Apr 2011 11:16:56 +0200
Subject: Fix bad merge

Code was removed in that commit 834ad29849ebef99d7e5c516cde26d550abff7cd
But the merge d54b3f04fa629fe031f1083073eef0145f0d6b1e reintroduced it back
---
 src/corelib/thread/qthread_unix.cpp | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 89546b6..044eb05 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -280,22 +280,6 @@ void *QThreadPrivate::start(void *arg)
         thr->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag));
     }
 
-#ifdef Q_OS_SYMBIAN
-    // Because Symbian Open C does not provide a way to convert between
-    // RThread and pthread_t, we must delay initialization of the RThread
-    // handle when creating a thread, until we are running in the new thread.
-    // Here, we pick up the current thread and assign that to the handle.
-    init_symbian_thread_handle(data->symbian_thread_handle);
-
-    // On symbian, threads other than the main thread are non critical by default
-    // This means a worker thread can crash without crashing the application - to
-    // use this feature, we would need to use RThread::Logon in the main thread
-    // to catch abnormal thread exit and emit the finished signal.
-    // For the sake of cross platform consistency, we set the thread as process critical
-    // - advanced users who want the symbian behaviour can change the critical
-    // attribute of the thread again once the app gains control in run()
-    User::SetCritical(User::EProcessCritical);
-#endif
     data->threadId = (Qt::HANDLE)pthread_self();
     set_thread_data(data);
 
-- 
cgit v0.12


From 51900ce698f7873eeabcd8723e61198a2c8d854d Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 8 Apr 2011 11:29:09 +0200
Subject: Fix crash after merge of the native symbian thread branch.

The memory leak was fixed in two different ways in
b6c60b0c9778f51af8c80f853d840ba25910c6f4 and
0ee221b374ffef3657247be4c78e05689e04bef7
after the merge, the thread are now deleted twice.
---
 tests/auto/qthread/tst_qthread.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 9d8937c..6ad0678 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -964,7 +964,6 @@ void tst_QThread::adoptMultipleThreads()
     QTestEventLoop::instance().enterLoop(5);
     QVERIFY(!QTestEventLoop::instance().timeout());
     QCOMPARE(int(recorder.activationCount), numThreads);
-    qDeleteAll(nativeThreads);
 }
 
 void tst_QThread::adoptMultipleThreadsOverlap()
-- 
cgit v0.12


From 32a2ccfedd0aa09311a173525f89f8e4894319f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 8 Apr 2011 13:40:26 +0200
Subject: Prevented crash due to dangling pointer in QWaylandInputDevice.

When a QWaylandWindow is destroyed we need to make sure it's not still
referenced by QWaylandInputDevice.
---
 src/plugins/platforms/wayland/qwaylanddisplay.h       | 4 +++-
 src/plugins/platforms/wayland/qwaylandinputdevice.cpp | 8 ++++++++
 src/plugins/platforms/wayland/qwaylandinputdevice.h   | 1 +
 src/plugins/platforms/wayland/qwaylandwindow.cpp      | 7 ++++++-
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index ac0ad71..e02767d 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -76,11 +76,13 @@ public:
 #endif
     void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
 
-
     void syncCallback(wl_display_sync_func_t func, void *data);
     void frameCallback(wl_display_frame_func_t func, void *data);
 
     struct wl_display *wl_display() const { return mDisplay; }
+
+    QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+
 public slots:
     void createNewScreen(struct wl_output *output, QRect geometry);
     void readEvents();
diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp
index 47f9c91..6c2f341 100644
--- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp
+++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp
@@ -83,6 +83,14 @@ QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display,
 #endif
 }
 
+void QWaylandInputDevice::handleWindowDestroyed(QWaylandWindow *window)
+{
+    if (window == mPointerFocus)
+        mPointerFocus = 0;
+    if (window == mKeyboardFocus)
+        mKeyboardFocus = 0;
+}
+
 void QWaylandInputDevice::inputHandleMotion(void *data,
 					    struct wl_input_device *input_device,
 					    uint32_t time,
diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.h b/src/plugins/platforms/wayland/qwaylandinputdevice.h
index 2328db8..3c83252 100644
--- a/src/plugins/platforms/wayland/qwaylandinputdevice.h
+++ b/src/plugins/platforms/wayland/qwaylandinputdevice.h
@@ -59,6 +59,7 @@ class QWaylandInputDevice {
 public:
     QWaylandInputDevice(struct wl_display *display, uint32_t id);
     void attach(QWaylandBuffer *buffer, int x, int y);
+    void handleWindowDestroyed(QWaylandWindow *window);
 
 private:
     struct wl_display *mDisplay;
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index c7cd147..d58b39d 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -41,9 +41,10 @@
 
 #include "qwaylandwindow.h"
 
+#include "qwaylandbuffer.h"
 #include "qwaylanddisplay.h"
+#include "qwaylandinputdevice.h"
 #include "qwaylandscreen.h"
-#include "qwaylandbuffer.h"
 
 #include <QtGui/QWidget>
 #include <QtGui/QWindowSystemInterface>
@@ -66,6 +67,10 @@ QWaylandWindow::~QWaylandWindow()
 {
     if (mSurface)
         wl_surface_destroy(mSurface);
+
+    QList<QWaylandInputDevice *> inputDevices = mDisplay->inputDevices();
+    for (int i = 0; i < inputDevices.size(); ++i)
+        inputDevices.at(i)->handleWindowDestroyed(this);
 }
 
 WId QWaylandWindow::winId() const
-- 
cgit v0.12


From dd60cf7ba8afdf5c84f5793c1e1d08ab18303a74 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 8 Apr 2011 14:55:16 +0200
Subject: Use the qt_static_metacall in QueuedConnection

And also in QMetaMethod::invoke

Reviewed-by: brad
---
 src/corelib/kernel/qmetaobject.cpp | 18 ++++++++++++++----
 src/corelib/kernel/qobject.cpp     | 31 ++++++++++++++++++-------------
 src/corelib/kernel/qobject_p.h     | 10 ++++++----
 src/dbus/qdbusintegrator.cpp       |  3 +--
 src/dbus/qdbusintegrator_p.h       |  9 ++++-----
 5 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index f0426f5..e671056 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1625,9 +1625,19 @@ bool QMetaMethod::invoke(QObject *object,
         val9.data()
     };
     // recompute the methodIndex by reversing the arithmetic in QMetaObject::property()
-    int methodIndex = ((handle - priv(mobj->d.data)->methodData) / 5) + mobj->methodOffset();
+    int idx_relative = ((handle - priv(mobj->d.data)->methodData) / 5);
+    int idx_offset =  mobj->methodOffset();
+    QObjectPrivate::StaticMetaCallFunction callFunction =
+        (QMetaObjectPrivate::get(mobj)->revision >= 6 && mobj->d.extradata)
+        ? reinterpret_cast<const QMetaObjectExtraData *>(mobj->d.extradata)->static_metacall : 0;
+
     if (connectionType == Qt::DirectConnection) {
-        return QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, methodIndex, param) < 0;
+        if (callFunction) {
+            callFunction(object, QMetaObject::InvokeMetaMethod, idx_relative, param);
+            return true;
+        } else {
+            return QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, idx_relative + idx_offset, param) < 0;
+        }
     } else if (connectionType == Qt::QueuedConnection) {
         if (returnValue.data()) {
             qWarning("QMetaMethod::invoke: Unable to invoke methods with return values in "
@@ -1661,7 +1671,7 @@ bool QMetaMethod::invoke(QObject *object,
             }
         }
 
-        QCoreApplication::postEvent(object, new QMetaCallEvent(methodIndex,
+        QCoreApplication::postEvent(object, new QMetaCallEvent(idx_offset, idx_relative, callFunction,
                                                         0, -1, nargs, types, args));
     } else { // blocking queued connection
 #ifndef QT_NO_THREAD
@@ -1672,7 +1682,7 @@ bool QMetaMethod::invoke(QObject *object,
         }
 
         QSemaphore semaphore;
-        QCoreApplication::postEvent(object, new QMetaCallEvent(methodIndex,
+        QCoreApplication::postEvent(object, new QMetaCallEvent(idx_offset, idx_relative, callFunction,
                                                         0, -1, 0, 0, param, &semaphore));
         semaphore.acquire();
 #endif // QT_NO_THREAD
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 4cbeee2..357cfd3 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -490,10 +490,12 @@ void QObjectPrivate::clearGuards(QObject *object)
 
 /*! \internal
  */
-QMetaCallEvent::QMetaCallEvent(int id, const QObject *sender, int signalId,
+QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction,
+                               const QObject *sender, int signalId,
                                int nargs, int *types, void **args, QSemaphore *semaphore)
-    : QEvent(MetaCall), id_(id), sender_(sender), signalId_(signalId),
-      nargs_(nargs), types_(types), args_(args), semaphore_(semaphore)
+    : QEvent(MetaCall), sender_(sender), signalId_(signalId),
+      nargs_(nargs), types_(types), args_(args), semaphore_(semaphore),
+      callFunction_(callFunction), method_offset_(method_offset), method_relative_(method_relative)
 { }
 
 /*! \internal
@@ -516,9 +518,13 @@ QMetaCallEvent::~QMetaCallEvent()
 
 /*! \internal
  */
-int QMetaCallEvent::placeMetaCall(QObject *object)
+void QMetaCallEvent::placeMetaCall(QObject *object)
 {
-    return QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, id_, args_);
+    if (callFunction_) {
+        callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_);
+    } else {
+        QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_);
+    }
 }
 
 /*!
@@ -3445,12 +3451,11 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
     args[0] = 0; // return value
     for (int n = 1; n < nargs; ++n)
         args[n] = QMetaType::construct((types[n] = c->argumentTypes[n-1]), argv[n]);
-    QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method(),
-                                                               sender,
-                                                               signal,
-                                                               nargs,
-                                                               types,
-                                                               args));
+    QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method_offset,
+                                                                c->method_relative,
+                                                                c->callFunction,
+                                                                sender, signal, nargs,
+                                                                types, args));
 }
 
 
@@ -3530,7 +3535,6 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                 continue;
 #ifndef QT_NO_THREAD
             } else if (c->connectionType == Qt::BlockingQueuedConnection) {
-                const int method = c->method();
                 locker.unlock();
                 if (receiverInSameThread) {
                     qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: "
@@ -3539,7 +3543,8 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
                     receiver->metaObject()->className(), receiver);
                 }
                 QSemaphore semaphore;
-                QCoreApplication::postEvent(receiver, new QMetaCallEvent(method,
+                QCoreApplication::postEvent(receiver, new QMetaCallEvent(c->method_offset, c->method_relative,
+                                                                         c->callFunction,
                                                                          sender, signal_absolute_index,
                                                                          0, 0,
                                                                          argv ? argv : empty_argv,
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 71b5bee..2711a4b 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -257,25 +257,27 @@ class QSemaphore;
 class Q_CORE_EXPORT QMetaCallEvent : public QEvent
 {
 public:
-    QMetaCallEvent(int id, const QObject *sender, int signalId,
+    QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction , const QObject *sender, int signalId,
                    int nargs = 0, int *types = 0, void **args = 0, QSemaphore *semaphore = 0);
     ~QMetaCallEvent();
 
-    inline int id() const { return id_; }
+    inline int id() const { return method_offset_ + method_relative_; }
     inline const QObject *sender() const { return sender_; }
     inline int signalId() const { return signalId_; }
     inline void **args() const { return args_; }
 
-    virtual int placeMetaCall(QObject *object);
+    virtual void placeMetaCall(QObject *object);
 
 private:
-    int id_;
     const QObject *sender_;
     int signalId_;
     int nargs_;
     int *types_;
     void **args_;
     QSemaphore *semaphore_;
+    QObjectPrivate::StaticMetaCallFunction callFunction_;
+    ushort method_offset_;
+    ushort method_relative_;
 };
 
 class QBoolBlocker
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index ee917a5..5f4dadd 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -1515,7 +1515,7 @@ QDBusActivateObjectEvent::~QDBusActivateObjectEvent()
     // semaphore releasing happens in ~QMetaCallEvent
 }
 
-int QDBusActivateObjectEvent::placeMetaCall(QObject *)
+void QDBusActivateObjectEvent::placeMetaCall(QObject *)
 {
     QDBusConnectionPrivate *that = QDBusConnectionPrivate::d(connection);
 
@@ -1526,7 +1526,6 @@ int QDBusActivateObjectEvent::placeMetaCall(QObject *)
                                         QDBusLockerBase::AfterDeliver, that);
 
     handled = true;
-    return -1;
 }
 
 void QDBusConnectionPrivate::handleSignal(const QString &key, const QDBusMessage& msg)
diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h
index 4047c24..59255f9 100644
--- a/src/dbus/qdbusintegrator_p.h
+++ b/src/dbus/qdbusintegrator_p.h
@@ -95,13 +95,12 @@ class QDBusCallDeliveryEvent: public QMetaCallEvent
 public:
     QDBusCallDeliveryEvent(const QDBusConnection &c, int id, QObject *sender,
                            const QDBusMessage &msg, const QList<int> &types, int f = 0)
-        : QMetaCallEvent(id, sender, -1), connection(c), message(msg), metaTypes(types), flags(f)
+        : QMetaCallEvent(0, id, 0, sender, -1), connection(c), message(msg), metaTypes(types), flags(f)
         { }
 
-    int placeMetaCall(QObject *object)
+    void placeMetaCall(QObject *object)
     {
         QDBusConnectionPrivate::d(connection)->deliverCall(object, flags, message, metaTypes, id());
-        return -1;
     }
 
 private:
@@ -117,12 +116,12 @@ public:
     QDBusActivateObjectEvent(const QDBusConnection &c, QObject *sender,
                              const QDBusConnectionPrivate::ObjectTreeNode &n,
                              int p, const QDBusMessage &m, QSemaphore *s = 0)
-        : QMetaCallEvent(-1, sender, -1, 0, 0, 0, s), connection(c), node(n),
+        : QMetaCallEvent(0, -1, 0, sender, -1, 0, 0, 0, s), connection(c), node(n),
           pathStartPos(p), message(m), handled(false)
         { }
     ~QDBusActivateObjectEvent();
 
-    int placeMetaCall(QObject *);
+    void placeMetaCall(QObject *);
 
 private:
     QDBusConnection connection; // just for refcounting
-- 
cgit v0.12


From fb1de89d4debd6c26c774fed20e5ad7ee7185832 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Fri, 8 Apr 2011 16:11:24 +0200
Subject: Adapt drag distance for uikit.

---
 src/plugins/platforms/uikit/quikitscreen.mm | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/uikit/quikitscreen.mm b/src/plugins/platforms/uikit/quikitscreen.mm
index ec94e3a..97382e3 100644
--- a/src/plugins/platforms/uikit/quikitscreen.mm
+++ b/src/plugins/platforms/uikit/quikitscreen.mm
@@ -41,6 +41,8 @@
 
 #include "quikitscreen.h"
 
+#include <QtGui/QApplication>
+
 #include <QtDebug>
 
 QT_BEGIN_NAMESPACE
@@ -65,7 +67,10 @@ QUIKitScreen::QUIKitScreen(int screenIndex)
     m_depth = 24;
 
     const qreal inch = 25.4;
-    m_physicalSize = QSize(qRound(bounds.size.width * inch / 160.), qRound(bounds.size.height * inch / 160.));
+    const qreal dpi = 160.;
+    m_physicalSize = QSize(qRound(bounds.size.width * inch / dpi), qRound(bounds.size.height * inch / dpi));
+    if (m_index == 0)
+        qApp->setStartDragDistance(12);
     [pool release];
 }
 
-- 
cgit v0.12


From a951fb79139498774d021759d0466b4b2ff50e68 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 7 Apr 2011 11:25:08 +0100
Subject: QUdpSocket autotest updates

1. Start the default bearer, when Qt is built with bearer management
2. Allow server sockets to have IPv6 any addresses
3. Broadcasting test - broadcast on each valid broadcast address
4. Enable IPv6 tests on symbian
5. writeDatagram test - workaround symbian having a smaller recieve
   buffer for UDP packets than the maximum packet size it can send.
6. Add QEXPECT_FAIL for some multicast tests on symbian, the OS support
   for multicast is incomplete.
7. Choke the echo test, as the test server shuts down the echo service
   for 10 seconds when receiving packets too fast.
8. For manual testing, added the FORCE_SESSION macro to test behaviour
   of UDP sockets when they have an explicit network session associated

Reviewed-by: Markus Goetz
---
 tests/auto/qudpsocket/tst_qudpsocket.cpp | 191 +++++++++++++++++++++++++++----
 1 file changed, 168 insertions(+), 23 deletions(-)

diff --git a/tests/auto/qudpsocket/tst_qudpsocket.cpp b/tests/auto/qudpsocket/tst_qudpsocket.cpp
index e6fe068..2c8049f 100644
--- a/tests/auto/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/qudpsocket/tst_qudpsocket.cpp
@@ -55,9 +55,15 @@
 #include <qstringlist.h>
 #include "../network-settings.h"
 
+#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtNetwork/qnetworkconfigmanager.h>
+#include <QtNetwork/qnetworkconfiguration.h>
+#include <QtNetwork/qnetworksession.h>
+#endif
+
 Q_DECLARE_METATYPE(QHostAddress)
 Q_DECLARE_METATYPE(QNetworkInterface)
-
+Q_DECLARE_METATYPE(QSharedPointer<QNetworkSession>)
 //TESTED_CLASS=
 //TESTED_FILES=
 
@@ -114,6 +120,13 @@ private slots:
 protected slots:
     void empty_readyReadSlot();
     void empty_connectedSlot();
+
+private:
+#ifndef QT_NO_BEARERMANAGEMENT
+    QNetworkConfigurationManager *netConfMan;
+    QNetworkConfiguration networkConfiguration;
+    QSharedPointer<QNetworkSession> networkSession;
+#endif
 };
 
 tst_QUdpSocket::tst_QUdpSocket()
@@ -132,6 +145,16 @@ void tst_QUdpSocket::initTestCase_data()
 
     QTest::newRow("WithoutProxy") << false << 0;
     QTest::newRow("WithSocks5Proxy") << true << int(QNetworkProxy::Socks5Proxy);
+
+#ifndef QT_NO_BEARERMANAGEMENT
+    netConfMan = new QNetworkConfigurationManager(this);
+    networkConfiguration = netConfMan->defaultConfiguration();
+    networkSession = QSharedPointer<QNetworkSession>(new QNetworkSession(networkConfiguration));
+    if (!networkSession->isOpen()) {
+        networkSession->open();
+        QVERIFY(networkSession->waitForOpened(30000));
+    }
+#endif
 }
 
 void tst_QUdpSocket::init()
@@ -156,6 +179,9 @@ void tst_QUdpSocket::cleanup()
 void tst_QUdpSocket::constructing()
 {
     QUdpSocket socket;
+#ifdef FORCE_SESSION
+    socket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     QVERIFY(socket.isSequential());
     QVERIFY(!socket.isOpen());
@@ -173,6 +199,9 @@ void tst_QUdpSocket::constructing()
 void tst_QUdpSocket::unconnectedServerAndClientTest()
 {
     QUdpSocket serverSocket;
+#ifdef FORCE_SESSION
+    serverSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
 
@@ -183,11 +212,14 @@ void tst_QUdpSocket::unconnectedServerAndClientTest()
     const char *message[] = {"Yo mista", "Yo", "Wassap"};
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(serverSocket.localAddress() == QHostAddress::Any))
+    if (!(serverSocket.localAddress() == QHostAddress::Any || serverSocket.localAddress() == QHostAddress::AnyIPv6))
         serverAddress = serverSocket.localAddress();
 
     for (int i = 0; i < 3; ++i) {
         QUdpSocket clientSocket;
+#ifdef FORCE_SESSION
+        clientSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
         QCOMPARE(int(clientSocket.writeDatagram(message[i], strlen(message[i]),
                                                serverAddress, serverSocket.localPort())),
                 int(strlen(message[i])));
@@ -218,8 +250,21 @@ void tst_QUdpSocket::broadcasting()
 #endif
     const char *message[] = {"Yo mista", "", "Yo", "Wassap"};
 
+    QList<QHostAddress> broadcastAddresses;
+    foreach (QNetworkInterface iface, QNetworkInterface::allInterfaces()) {
+        if ((iface.flags() & QNetworkInterface::CanBroadcast)
+            && iface.flags() & QNetworkInterface::IsUp) {
+            for (int i=0;i<iface.addressEntries().count();i++)
+                broadcastAddresses.append(iface.addressEntries().at(i).broadcast());
+        }
+    }
+    if (broadcastAddresses.isEmpty())
+        QSKIP("No interface can broadcast", SkipAll);
     for (int i = 0; i < 4; ++i) {
         QUdpSocket serverSocket;
+#ifdef FORCE_SESSION
+        serverSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
         QVERIFY2(serverSocket.bind(QHostAddress::Any, 5000), serverSocket.errorString().toLatin1().constData());
 
         QCOMPARE(serverSocket.state(), QUdpSocket::BoundState);
@@ -227,10 +272,18 @@ void tst_QUdpSocket::broadcasting()
         connect(&serverSocket, SIGNAL(readyRead()), SLOT(empty_readyReadSlot()));
 
         QUdpSocket broadcastSocket;
+#ifdef FORCE_SESSION
+        broadcastSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
+        broadcastSocket.bind();
 
         for (int j = 0; j < 100; ++j) {
-            broadcastSocket.writeDatagram(message[i], strlen(message[i]),
-                QHostAddress::Broadcast, 5000);
+            for (int k = 0; k < 4; k++) {
+                broadcastSocket.writeDatagram(message[i], strlen(message[i]),
+                    QHostAddress::Broadcast, 5000);
+                foreach (QHostAddress addr, broadcastAddresses)
+                    broadcastSocket.writeDatagram(message[i], strlen(message[i]), addr, 5000);
+            }
             QTestEventLoop::instance().enterLoop(15);
             if (QTestEventLoop::instance().timeout()) {
 #if defined(Q_OS_FREEBSD)
@@ -281,15 +334,19 @@ void tst_QUdpSocket::loop()
 
     QUdpSocket peter;
     QUdpSocket paul;
+#ifdef FORCE_SESSION
+    peter.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+    paul.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     QVERIFY2(peter.bind(), peter.errorString().toLatin1().constData());
     QVERIFY2(paul.bind(), paul.errorString().toLatin1().constData());
 
     QHostAddress peterAddress = QHostAddress::LocalHost;
-    if (!(peter.localAddress() == QHostAddress::Any))
+    if (!(peter.localAddress() == QHostAddress::Any || peter.localAddress() == QHostAddress::AnyIPv6))
         peterAddress = peter.localAddress();
     QHostAddress pualAddress = QHostAddress::LocalHost;
-    if (!(paul.localAddress() == QHostAddress::Any))
+    if (!(paul.localAddress() == QHostAddress::Any || paul.localAddress() == QHostAddress::AnyIPv6))
         pualAddress = paul.localAddress();
 
     QCOMPARE(peter.writeDatagram(peterMessage.data(), peterMessage.length(),
@@ -322,8 +379,8 @@ void tst_QUdpSocket::ipv6Loop_data()
 
 void tst_QUdpSocket::ipv6Loop()
 {
-#if defined(Q_OS_SYMBIAN)
-    QSKIP("Symbian IPv6 is not yet supported", SkipAll);
+#if defined(QT_NO_IPV6)
+    QSKIP("IPv6 is not yet supported", SkipAll);
 #endif
     QFETCH(QByteArray, peterMessage);
     QFETCH(QByteArray, paulMessage);
@@ -331,6 +388,10 @@ void tst_QUdpSocket::ipv6Loop()
 
     QUdpSocket peter;
     QUdpSocket paul;
+#ifdef FORCE_SESSION
+    peter.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+    paul.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     quint16 peterPort = 28124;
     quint16 paulPort = 28123;
@@ -382,9 +443,13 @@ void tst_QUdpSocket::empty_connectedSlot()
 void tst_QUdpSocket::readLine()
 {
     QUdpSocket socket1;
+    QUdpSocket socket2;
+#ifdef FORCE_SESSION
+    socket1.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+    socket2.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY2(socket1.bind(), socket1.errorString().toLatin1().constData());
 
-    QUdpSocket socket2;
     socket2.connectToHost("127.0.0.1", socket1.localPort());
     QVERIFY(socket2.waitForConnected(5000));
 }
@@ -394,13 +459,19 @@ void tst_QUdpSocket::readLine()
 void tst_QUdpSocket::pendingDatagramSize()
 {
     QUdpSocket server;
+#ifdef FORCE_SESSION
+    server.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY2(server.bind(), server.errorString().toLatin1().constData());
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(server.localAddress() == QHostAddress::Any))
+    if (!(server.localAddress() == QHostAddress::Any || server.localAddress() == QHostAddress::AnyIPv6))
         serverAddress = server.localAddress();
 
     QUdpSocket client;
+#ifdef FORCE_SESSION
+    client.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY(client.writeDatagram("this is", 7, serverAddress, server.localPort()) == 7);
     QVERIFY(client.writeDatagram(0, 0, serverAddress, server.localPort()) == 0);
     QVERIFY(client.writeDatagram("3 messages", 10, serverAddress, server.localPort()) == 10);
@@ -442,13 +513,19 @@ void tst_QUdpSocket::pendingDatagramSize()
 void tst_QUdpSocket::writeDatagram()
 {
     QUdpSocket server;
+#ifdef FORCE_SESSION
+    server.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY2(server.bind(), server.errorString().toLatin1().constData());
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(server.localAddress() == QHostAddress::Any))
+    if (!(server.localAddress() == QHostAddress::Any || server.localAddress() == QHostAddress::AnyIPv6))
         serverAddress = server.localAddress();
 
     QUdpSocket client;
+#ifdef FORCE_SESSION
+    client.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     qRegisterMetaType<qint64>("qint64");
     qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
@@ -475,8 +552,16 @@ void tst_QUdpSocket::writeDatagram()
         QCOMPARE(*static_cast<const qint64 *>(bytesspy.at(0).at(0).constData()),
                 qint64(i * 1024));
         QCOMPARE(errorspy.count(), 0);
-        if (!server.waitForReadyRead(5000))
+        if (!server.waitForReadyRead(5000)) {
+#ifdef Q_OS_SYMBIAN
+            //symbian receive buffer for datagrams is ~30k, but it can send datagrams up to the maximum 64k...
+            if (i > 28) {
+                i = 64;
+                continue;
+            }
+#endif
             QSKIP(QString("UDP packet lost at size %1, unable to complete the test.").arg(i * 1024).toLatin1().data(), SkipSingle);
+        }
         QCOMPARE(server.pendingDatagramSize(), qint64(i * 1024));
         QCOMPARE(server.readDatagram(0, 0), qint64(0));
     }
@@ -501,14 +586,21 @@ void tst_QUdpSocket::performance()
 #endif // Q_OS_SYMBIAN
 
     QUdpSocket server;
+#ifdef FORCE_SESSION
+    server.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY2(server.bind(), server.errorString().toLatin1().constData());
 
     QHostAddress serverAddress = QHostAddress::LocalHost;
-    if (!(server.localAddress() == QHostAddress::Any))
+    if (!(server.localAddress() == QHostAddress::Any || server.localAddress() == QHostAddress::AnyIPv6))
         serverAddress = server.localAddress();
 
     QUdpSocket client;
+#ifdef FORCE_SESSION
+    client.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     client.connectToHost(serverAddress, server.localPort());
+    QVERIFY(client.waitForConnected(10000));
 
     QTime stopWatch;
     stopWatch.start();
@@ -548,8 +640,14 @@ void tst_QUdpSocket::bindMode()
     }
 
     QUdpSocket socket;
+#ifdef FORCE_SESSION
+    socket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY2(socket.bind(), socket.errorString().toLatin1().constData());
     QUdpSocket socket2;
+#ifdef FORCE_SESSION
+    socket2.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY(!socket2.bind(socket.localPort()));
 #if defined(Q_OS_SYMBIAN)
     if(RProcess().HasCapability(ECapabilityNetworkControl)) {
@@ -619,16 +717,12 @@ void tst_QUdpSocket::writeDatagramToNonExistingPeer_data()
     QTest::addColumn<bool>("bind");
     QTest::addColumn<QHostAddress>("peerAddress");
     QHostAddress localhost(QHostAddress::LocalHost);
-#if !defined(Q_OS_SYMBIAN)
     QHostAddress remote = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first();
-#endif
 
     QTest::newRow("localhost-unbound") << false << localhost;
     QTest::newRow("localhost-bound") << true << localhost;
-#if !defined(Q_OS_SYMBIAN)
     QTest::newRow("remote-unbound") << false << remote;
     QTest::newRow("remote-bound") << true << remote;
-#endif
 }
 
 void tst_QUdpSocket::writeDatagramToNonExistingPeer()
@@ -639,6 +733,9 @@ void tst_QUdpSocket::writeDatagramToNonExistingPeer()
     quint16 peerPort = 33533 + int(bind);
 
     QUdpSocket sUdp;
+#ifdef FORCE_SESSION
+    sUdp.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QSignalSpy sReadyReadSpy(&sUdp, SIGNAL(readyRead()));
     if (bind)
         QVERIFY(sUdp.bind());
@@ -651,14 +748,10 @@ void tst_QUdpSocket::writeToNonExistingPeer_data()
 {
     QTest::addColumn<QHostAddress>("peerAddress");
     QHostAddress localhost(QHostAddress::LocalHost);
-#if !defined(Q_OS_SYMBIAN)
     QHostAddress remote = QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first();
-#endif
     // write (required to be connected)
     QTest::newRow("localhost") << localhost;
-#if !defined(Q_OS_SYMBIAN)
     QTest::newRow("remote") << remote;
-#endif
 }
 
 void tst_QUdpSocket::writeToNonExistingPeer()
@@ -669,9 +762,13 @@ void tst_QUdpSocket::writeToNonExistingPeer()
     qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
 
     QUdpSocket sConnected;
+#ifdef FORCE_SESSION
+    sConnected.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QSignalSpy sConnectedReadyReadSpy(&sConnected, SIGNAL(readyRead()));
     QSignalSpy sConnectedErrorSpy(&sConnected, SIGNAL(error(QAbstractSocket::SocketError)));
     sConnected.connectToHost(peerAddress, peerPort, QIODevice::ReadWrite);
+    QVERIFY(sConnected.waitForConnected(10000));
 
     // the first write succeeds...
     QCOMPARE(sConnected.write("", 1), qint64(1));
@@ -845,12 +942,18 @@ void tst_QUdpSocket::zeroLengthDatagram()
         return;
 
     QUdpSocket receiver;
+#ifdef FORCE_SESSION
+    receiver.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QVERIFY(receiver.bind());
 
     QVERIFY(!receiver.waitForReadyRead(100));
     QVERIFY(!receiver.hasPendingDatagrams());
 
     QUdpSocket sender;
+#ifdef FORCE_SESSION
+    sender.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     QCOMPARE(sender.writeDatagram(QByteArray(), QHostAddress::LocalHost, receiver.localPort()), qint64(0));
 
     QVERIFY(receiver.waitForReadyRead(1000));
@@ -892,6 +995,9 @@ void tst_QUdpSocket::multicastTtlOption()
     }
 
     QUdpSocket udpSocket;
+#ifdef FORCE_SESSION
+    udpSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     // bind, but ignore the result, we are only interested in initializing the socket
     (void) udpSocket.bind(bindAddress, 0);
     udpSocket.setSocketOption(QUdpSocket::MulticastTtlOption, ttl);
@@ -931,6 +1037,9 @@ void tst_QUdpSocket::multicastLoopbackOption()
     }
 
     QUdpSocket udpSocket;
+#ifdef FORCE_SESSION
+    udpSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     // bind, but ignore the result, we are only interested in initializing the socket
     (void) udpSocket.bind(bindAddress, 0);
     udpSocket.setSocketOption(QUdpSocket::MulticastLoopbackOption, loopback);
@@ -951,6 +1060,9 @@ void tst_QUdpSocket::multicastJoinBeforeBind()
     QFETCH(QHostAddress, groupAddress);
 
     QUdpSocket udpSocket;
+#ifdef FORCE_SESSION
+    udpSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     // cannot join group before binding
     QTest::ignoreMessage(QtWarningMsg, "QUdpSocket::joinMulticastGroup() called on a QUdpSocket when not in QUdpSocket::BoundState");
     QVERIFY(!udpSocket.joinMulticastGroup(groupAddress));
@@ -972,8 +1084,16 @@ void tst_QUdpSocket::multicastLeaveAfterClose()
     }
 
     QUdpSocket udpSocket;
+#ifdef FORCE_SESSION
+    udpSocket.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
+#ifdef Q_OS_SYMBIAN
+    QVERIFY2(udpSocket.bind(),
+        qPrintable(udpSocket.errorString()));
+#else
     QVERIFY2(udpSocket.bind(groupAddress, 0),
              qPrintable(udpSocket.errorString()));
+#endif
     QVERIFY2(udpSocket.joinMulticastGroup(groupAddress),
              qPrintable(udpSocket.errorString()));
     udpSocket.close();
@@ -997,6 +1117,9 @@ void tst_QUdpSocket::setMulticastInterface_data()
 
 void tst_QUdpSocket::setMulticastInterface()
 {
+#ifdef Q_OS_SYMBIAN
+    QSKIP("Symbian has no IPV6_MULTICAST_IF equivalent", SkipAll);
+#else
     QFETCH_GLOBAL(bool, setProxy);
     QFETCH(QNetworkInterface, iface);
     QFETCH(QHostAddress, address);
@@ -1019,6 +1142,7 @@ void tst_QUdpSocket::setMulticastInterface()
     } else {
         QVERIFY(!iface2.isValid());
     }
+#endif
 }
 
 void tst_QUdpSocket::multicast_data()
@@ -1058,8 +1182,17 @@ void tst_QUdpSocket::multicast()
     }
 
     QUdpSocket receiver;
+#ifdef FORCE_SESSION
+    receiver.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
 
     // bind first, then verify that we can join the multicast group
+#ifdef Q_OS_SYMBIAN
+    if (!setProxy) {
+        QEXPECT_FAIL("same bind, group ipv4 address", "bind to group address not supported on symbian", Abort);
+        QEXPECT_FAIL("same bind, group ipv6 address", "bind to group address not supported on symbian", Abort);
+    }
+#endif
     QVERIFY2(receiver.bind(bindAddress, 0) == bindResult,
              qPrintable(receiver.errorString()));
     if (!bindResult)
@@ -1077,6 +1210,10 @@ void tst_QUdpSocket::multicast()
                                   << QByteArray("cdef");
 
     QUdpSocket sender;
+#ifdef FORCE_SESSION
+    sender.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
+    sender.bind();
     foreach (const QByteArray &datagram, datagrams) {
         QCOMPARE(int(sender.writeDatagram(datagram, groupAddress, receiver.localPort())),
                  int(datagram.size()));
@@ -1092,6 +1229,9 @@ void tst_QUdpSocket::multicast()
         receiver.readDatagram(datagram.data(), datagram.size(), 0, 0);
         receivedDatagrams << datagram;
     }
+#ifdef Q_OS_SYMBIAN
+    QEXPECT_FAIL("valid bind, group ipv4 address", "IPv4 multicast not supported on symbian", Abort);
+#endif
     QCOMPARE(receivedDatagrams, datagrams);
 
     QVERIFY2(receiver.leaveMulticastGroup(groupAddress), qPrintable(receiver.errorString()));
@@ -1112,15 +1252,19 @@ void tst_QUdpSocket::echo()
     QHostAddress remote = info.addresses().first();
 
     QUdpSocket sock;
+#ifdef FORCE_SESSION
+    sock.setProperty("_q_networksession", QVariant::fromValue(networkSession));
+#endif
     if (connect) {
         sock.connectToHost(remote, 7);
+        QVERIFY(sock.waitForConnected(10000));
     } else {
         sock.bind();
     }
     QByteArray out(30, 'x');
     QByteArray in;
     int successes = 0;
-    for (int i=0;i<20;i++) {
+    for (int i=0;i<10;i++) {
         if (connect) {
             sock.write(out);
         } else {
@@ -1143,8 +1287,9 @@ void tst_QUdpSocket::echo()
         if (!sock.isValid())
             QFAIL(sock.errorString().toLatin1().constData());
         qDebug() << "packets in" << successes << "out" << i;
+        QTest::qWait(50); //choke to avoid triggering flood/DDoS protections on echo service
     }
-    QVERIFY(successes >= 18);
+    QVERIFY(successes >= 9);
 }
 
 QTEST_MAIN(tst_QUdpSocket)
-- 
cgit v0.12


From 847df81a5680fe4d71196d0afe5e68e41ae49700 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 7 Apr 2011 15:10:31 +0100
Subject: Implement support for sockets started before the event loop

If there is no event loop when a socket notification is enabled,
then invoke the method via a queued connection so that it is run
again when the event loop is started.

This covers sockets created and having an asynchronous API called
before calling QCoreApplication::exec().

Reviewed-by: Markus Goetz
---
 src/network/socket/qsymbiansocketengine.cpp | 69 +++++++++++------------------
 src/network/socket/qsymbiansocketengine_p.h |  2 +-
 tests/auto/qtcpsocket/tst_qtcpsocket.cpp    | 45 ++++++++++++++++++-
 3 files changed, 72 insertions(+), 44 deletions(-)

diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 165316d..f1b2982 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -1433,6 +1433,26 @@ void QSymbianSocketEnginePrivate::setError(TInt symbianError)
     hasSetSocketError = true;
 }
 
+void QSymbianSocketEngine::startNotifications()
+{
+    Q_D(QSymbianSocketEngine);
+#ifdef QNATIVESOCKETENGINE_DEBUG
+        qDebug() << "QSymbianSocketEngine::startNotifications" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
+#endif
+    if (!d->asyncSelect && (d->readNotificationsEnabled || d->writeNotificationsEnabled || d->exceptNotificationsEnabled)) {
+        if (d->threadData->eventDispatcher) {
+            d->asyncSelect = q_check_ptr(new QAsyncSelect(
+                static_cast<QEventDispatcherSymbian*> (d->threadData->eventDispatcher), d->nativeSocket,
+                this));
+        } else {
+            // call again when event dispatcher has been created
+            QMetaObject::invokeMethod(this, "startNotifications", Qt::QueuedConnection);
+        }
+    }
+    if (d->asyncSelect)
+        d->asyncSelect->IssueRequest();
+}
+
 bool QSymbianSocketEngine::isReadNotificationEnabled() const
 {
     Q_D(const QSymbianSocketEngine);
@@ -1448,13 +1468,7 @@ void QSymbianSocketEngine::setReadNotificationEnabled(bool enable)
     qDebug() << "QSymbianSocketEngine::setReadNotificationEnabled" << enable << "socket" << d->socketDescriptor;
 #endif
     d->readNotificationsEnabled = enable;
-    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(
-            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
-                d->nativeSocket, this));
-    // TODO: what do we do if event dispatcher doesn't exist yet?
-    if (d->asyncSelect)
-        d->asyncSelect->IssueRequest();
+    startNotifications();
 }
 
 bool QSymbianSocketEngine::isWriteNotificationEnabled() const
@@ -1472,13 +1486,7 @@ void QSymbianSocketEngine::setWriteNotificationEnabled(bool enable)
     qDebug() << "QSymbianSocketEngine::setWriteNotificationEnabled" << enable << "socket" << d->socketDescriptor;
 #endif
     d->writeNotificationsEnabled = enable;
-    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(
-            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
-                d->nativeSocket, this));
-    // TODO: what do we do if event dispatcher doesn't exist yet?
-    if (d->asyncSelect)
-        d->asyncSelect->IssueRequest();
+    startNotifications();
 }
 
 bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
@@ -1489,7 +1497,6 @@ bool QSymbianSocketEngine::isExceptionNotificationEnabled() const
     return false;
 }
 
-// FIXME do we really need this for symbian?
 void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
 {
     Q_D(QSymbianSocketEngine);
@@ -1498,12 +1505,7 @@ void QSymbianSocketEngine::setExceptionNotificationEnabled(bool enable)
     qDebug() << "QSymbianSocketEngine::setExceptionNotificationEnabled" << enable << "socket" << d->socketDescriptor;
 #endif
     d->exceptNotificationsEnabled = enable;
-    if (enable && d->threadData->eventDispatcher && !d->asyncSelect)
-        d->asyncSelect = q_check_ptr(
-            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
-                d->nativeSocket, this));
-    if (d->asyncSelect)
-        d->asyncSelect->IssueRequest();
+    startNotifications();
 }
 
 bool QSymbianSocketEngine::waitForRead(int msecs, bool *timedOut)
@@ -1588,38 +1590,21 @@ qint64 QSymbianSocketEngine::bytesToWrite() const
     return 0;
 }
 
-//TODO: is defining PostThreadChangeEvent as QEvent::User + 1 safe?
-//TODO: would QMetaObject::invokeMethod(obj, "postThreadChangeSlot", Qt::QueuedConnection) be better?
-//TODO: if QTBUG-16787 is implemented, use that instead
 bool QSymbianSocketEngine::event(QEvent* ev)
 {
     Q_D(QSymbianSocketEngine);
+    if (ev->type() == QEvent::ThreadChange) {
 #ifdef QNATIVESOCKETENGINE_DEBUG
-    qDebug() << "QSymbianSocketEngine::event";
-#endif
-    switch (ev->type()) {
-    case QEvent::ThreadChange:
-#ifdef QNATIVESOCKETENGINE_DEBUG
-        qDebug() << "ThreadChange" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
+        qDebug() << "QSymbianSocketEngine::event - ThreadChange" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
 #endif
         if (d->asyncSelect) {
             delete d->asyncSelect;
             d->asyncSelect = 0;
-            QEvent *postThreadChangeEvent = new QEvent(PostThreadChangeEvent);
-            QCoreApplication::postEvent(this, postThreadChangeEvent);
+            // recreate select in new thread (because it is queued, the method is called in the new thread context)
+            QMetaObject::invokeMethod(this, "startNotifications", Qt::QueuedConnection);
         }
         d->selectTimer.Close();
         return true;
-    case PostThreadChangeEvent:
-#ifdef QNATIVESOCKETENGINE_DEBUG
-        qDebug() << "PostThreadChangeEvent" << d->readNotificationsEnabled << d->writeNotificationsEnabled << d->exceptNotificationsEnabled;
-#endif
-        // recreate select in new thread
-        d->asyncSelect = q_check_ptr(
-            new QAsyncSelect(static_cast<QEventDispatcherSymbian*>(d->threadData->eventDispatcher),
-                d->nativeSocket, this));
-        d->asyncSelect->IssueRequest();
-        return true;
     }
     return QAbstractSocketEngine::event(ev);
 }
diff --git a/src/network/socket/qsymbiansocketengine_p.h b/src/network/socket/qsymbiansocketengine_p.h
index bbe1269..85ab54a 100644
--- a/src/network/socket/qsymbiansocketengine_p.h
+++ b/src/network/socket/qsymbiansocketengine_p.h
@@ -134,7 +134,7 @@ public:
 
     bool event(QEvent* ev);
 
-    static const QEvent::Type PostThreadChangeEvent = (QEvent::Type)(QEvent::User + 1);
+    Q_INVOKABLE void startNotifications();
 
 public Q_SLOTS:
     // TODO: Why do we do this? This is private Qt implementation stuff anyway, no need for it
diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
index 6852e29..623e02b 100644
--- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp
@@ -106,6 +106,7 @@ Q_DECLARE_METATYPE(QList<QNetworkProxy>)
 //TESTED_FILES=
 
 QT_FORWARD_DECLARE_CLASS(QTcpSocket)
+QT_FORWARD_DECLARE_CLASS(SocketPair)
 
 class tst_QTcpSocket : public QObject
 {
@@ -138,6 +139,7 @@ public slots:
     void init();
     void cleanup();
 private slots:
+    void socketsConstructedBeforeEventLoop();
     void constructing();
     void setInvalidSocketDescriptor();
     void setSocketDescriptor();
@@ -221,6 +223,8 @@ protected slots:
     void abortiveClose_abortSlot();
     void remoteCloseErrorSlot();
     void proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *auth);
+    void earlySocketBytesSent(qint64 bytes);
+    void earlySocketReadyRead();
 
 private:
     QByteArray expectedReplyIMAP();
@@ -243,6 +247,10 @@ private:
     bool gotClosedSignal;
     int numConnections;
     static int loopLevel;
+
+    SocketPair *earlyConstructedSockets;
+    int earlyBytesWrittenCount;
+    int earlyReadyReadCount;
 };
 
 enum ProxyTests {
@@ -296,8 +304,16 @@ public:
 
 tst_QTcpSocket::tst_QTcpSocket()
 {
-    Q_SET_DEFAULT_IAP
     tmpSocket = 0;
+
+    //This code relates to the socketsConstructedBeforeEventLoop test case
+    earlyConstructedSockets = new SocketPair;
+    QVERIFY(earlyConstructedSockets->create());
+    earlyBytesWrittenCount = 0;
+    earlyReadyReadCount = 0;
+    connect(earlyConstructedSockets->endPoints[0], SIGNAL(readyRead()), this, SLOT(earlySocketReadyRead()));
+    connect(earlyConstructedSockets->endPoints[1], SIGNAL(bytesWritten(qint64)), this, SLOT(earlySocketBytesSent(qint64)));
+    earlyConstructedSockets->endPoints[1]->write("hello work");
 }
 
 tst_QTcpSocket::~tst_QTcpSocket()
@@ -399,6 +415,33 @@ void tst_QTcpSocket::proxyAuthenticationRequired(const QNetworkProxy &, QAuthent
 
 //----------------------------------------------------------------------------------
 
+void tst_QTcpSocket::socketsConstructedBeforeEventLoop()
+{
+    QFETCH_GLOBAL(bool, setProxy);
+    QFETCH_GLOBAL(bool, ssl);
+    if (setProxy || ssl)
+        return;
+    //This test checks that sockets constructed before QCoreApplication::exec() still emit signals
+    //see construction code in the tst_QTcpSocket constructor
+    enterLoop(3);
+    QCOMPARE(earlyBytesWrittenCount, 1);
+    QCOMPARE(earlyReadyReadCount, 1);
+    earlyConstructedSockets->endPoints[0]->close();
+    earlyConstructedSockets->endPoints[1]->close();
+}
+
+void tst_QTcpSocket::earlySocketBytesSent(qint64 bytes)
+{
+    earlyBytesWrittenCount++;
+}
+
+void tst_QTcpSocket::earlySocketReadyRead()
+{
+    earlyReadyReadCount++;
+}
+
+//----------------------------------------------------------------------------------
+
 void tst_QTcpSocket::constructing()
 {
     QTcpSocket *socket = newSocket();
-- 
cgit v0.12


From b554326134bab9ec0a9d8592c3052640ababd5cc Mon Sep 17 00:00:00 2001
From: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
Date: Mon, 11 Apr 2011 08:58:09 +0200
Subject: Cocoa: Fixup wrong code in patch baaa5ae

Sort of imbarassing, but baaa5ae went in before I checked
that the old-behaviour-flag also worked. Which is didn't.
This patch will make things good.

Task-number: QTBUG-11481
Reviewed-by: jbache
---
 src/gui/kernel/qwidget_mac.mm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index aca1d53..8784ffd 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -2830,7 +2830,7 @@ void QWidgetPrivate::setSubWindowStacking(bool set)
                 if ([pwin isVisible]
                     && (ptype == Qt::Window || ptype == Qt::Dialog)
                     && ![qwin parentWindow]
-                    && (!use_behaviour_qt473 && parent->windowModality() == Qt::ApplicationModal)) {
+                    && (use_behaviour_qt473 || parent->windowModality() == Qt::ApplicationModal)) {
                     NSInteger level = [qwin level];
                     [pwin addChildWindow:qwin ordered:NSWindowAbove];
                     if ([qwin level] < level)
-- 
cgit v0.12


From 59e20b0eedb7308d3428e7744e076a8b49b1cf25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 11 Apr 2011 09:00:14 +0200
Subject: Wayland: Rename XPixmap GL integrations to Readback

---
 .../wayland/gl_integration/gl_integration.pri      |   8 +-
 .../readback_egl/qwaylandreadbackeglcontext.cpp    | 174 ++++++++++++++++++++
 .../readback_egl/qwaylandreadbackeglcontext.h      |  80 ++++++++++
 .../qwaylandreadbackeglintegration.cpp             | 112 +++++++++++++
 .../readback_egl/qwaylandreadbackeglintegration.h  |  82 ++++++++++
 .../readback_egl/qwaylandreadbackeglwindow.cpp     |  76 +++++++++
 .../readback_egl/qwaylandreadbackeglwindow.h       |  66 ++++++++
 .../gl_integration/readback_egl/readback_egl.pri   |  14 ++
 .../readback_glx/qwaylandreadbackglxcontext.cpp    | 163 +++++++++++++++++++
 .../readback_glx/qwaylandreadbackglxcontext.h      |  79 +++++++++
 .../qwaylandreadbackglxintegration.cpp             |  97 +++++++++++
 .../readback_glx/qwaylandreadbackglxintegration.h  |  80 ++++++++++
 .../readback_glx/qwaylandreadbackglxwindow.cpp     |  73 +++++++++
 .../readback_glx/qwaylandreadbackglxwindow.h       |  65 ++++++++
 .../gl_integration/readback_glx/readback_glx.pri   |  12 ++
 .../xpixmap_egl/qwaylandxpixmapeglcontext.cpp      | 177 ---------------------
 .../xpixmap_egl/qwaylandxpixmapeglcontext.h        |  80 ----------
 .../xpixmap_egl/qwaylandxpixmapeglintegration.cpp  | 112 -------------
 .../xpixmap_egl/qwaylandxpixmapeglintegration.h    |  82 ----------
 .../xpixmap_egl/qwaylandxpixmapwindow.cpp          |  75 ---------
 .../xpixmap_egl/qwaylandxpixmapwindow.h            |  66 --------
 .../gl_integration/xpixmap_egl/xpixmap_egl.pri     |  14 --
 .../xpixmap_glx/qwaylandxpixmapglxcontext.cpp      | 163 -------------------
 .../xpixmap_glx/qwaylandxpixmapglxcontext.h        |  79 ---------
 .../xpixmap_glx/qwaylandxpixmapglxintegration.cpp  |  97 -----------
 .../xpixmap_glx/qwaylandxpixmapglxintegration.h    |  80 ----------
 .../xpixmap_glx/qwaylandxpixmapglxwindow.cpp       |  73 ---------
 .../xpixmap_glx/qwaylandxpixmapglxwindow.h         |  65 --------
 .../gl_integration/xpixmap_glx/xpixmap_glx.pri     |  12 --
 src/plugins/platforms/wayland/wayland.pro          |   4 +-
 30 files changed, 1179 insertions(+), 1181 deletions(-)
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h
 create mode 100644 src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
 delete mode 100644 src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri

diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index 73a0c25..835f880 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -10,12 +10,12 @@ wayland_egl {
     include ($$PWD/wayland_egl/wayland_egl.pri)
 }
 
-xpixmap_egl {
-    include ($$PWD/xpixmap_egl/xpixmap_egl.pri)
+readback_egl {
+    include ($$PWD/readback_egl/readback_egl.pri)
 }
 
-xpixmap_glx {
-    include ($$PWD/xpixmap_glx/xpixmap_glx.pri)
+readback_glx {
+    include ($$PWD/readback_glx/readback_glx.pri)
 }
 
 xcomposite_glx {
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp
new file mode 100644
index 0000000..d63087d
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglcontext.h"
+
+#include "../../../eglconvenience/qeglconvenience.h"
+
+#include <QtOpenGL/QGLContext>
+#include <QtOpenGL/private/qglextensions_p.h>
+
+#include "qwaylandshmsurface.h"
+
+#include <QtCore/QDebug>
+
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+    const int width = img.width();
+    const int height = img.height();
+
+    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+    {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+        }
+    } else {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+        }
+    }
+}
+
+QWaylandReadbackEglContext::QWaylandReadbackEglContext(QWaylandReadbackEglIntegration *eglIntegration, QWaylandReadbackEglWindow *window)
+    : mEglIntegration(eglIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mPixmap(0)
+    , mConfig(q_configFromQPlatformWindowFormat(eglIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_PIXMAP_BIT))
+    , mPixmapSurface(EGL_NO_SURFACE)
+{
+    QVector<EGLint> eglContextAttrs;
+    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+    eglContextAttrs.append(2);
+    eglContextAttrs.append(EGL_NONE);
+
+    mContext = eglCreateContext(eglIntegration->eglDisplay(),mConfig,0,eglContextAttrs.constData());
+
+    geometryChanged();
+}
+
+QWaylandReadbackEglContext::~QWaylandReadbackEglContext()
+{
+    eglDestroyContext(mEglIntegration->eglDisplay(),mContext);
+}
+
+void QWaylandReadbackEglContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+
+    mWindow->waitForFrameSync();
+
+    eglMakeCurrent(mEglIntegration->eglDisplay(),mPixmapSurface,mPixmapSurface,mContext);
+}
+
+void QWaylandReadbackEglContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+    eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QWaylandReadbackEglContext::swapBuffers()
+{
+    eglSwapBuffers(mEglIntegration->eglDisplay(),mPixmapSurface);
+
+    if (QPlatformGLContext::currentContext() != this) {
+        makeCurrent();
+    }
+
+    QSize size = mWindow->geometry().size();
+
+    QImage img(size,QImage::Format_ARGB32);
+    const uchar *constBits = img.bits();
+    void *pixels = const_cast<uchar *>(constBits);
+
+    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+    img = img.mirrored();
+    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
+    constBits = img.bits();
+
+    const uchar *constDstBits = mBuffer->image()->bits();
+    uchar *dstBits = const_cast<uchar *>(constDstBits);
+    memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+}
+
+void * QWaylandReadbackEglContext::getProcAddress(const QString &procName)
+{
+    return (void *) eglGetProcAddress(procName.toLatin1().data());
+}
+
+QPlatformWindowFormat QWaylandReadbackEglContext::platformWindowFormat() const
+{
+    return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
+}
+
+void QWaylandReadbackEglContext::geometryChanged()
+{
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
+    mWindow->waitForFrameSync();
+
+    delete mBuffer;
+    if (mPixmap)
+        XFreePixmap(mEglIntegration->xDisplay(),mPixmap);
+
+    mBuffer = new QWaylandShmBuffer(mEglIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+    mWindow->attach(mBuffer);
+    mPixmap = XCreatePixmap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),size.width(),size.height(),mEglIntegration->depth());
+    XSync(mEglIntegration->xDisplay(),False);
+
+    mPixmapSurface = eglCreatePixmapSurface(mEglIntegration->eglDisplay(),mConfig,mPixmap,0);
+    if (mPixmapSurface == EGL_NO_SURFACE) {
+        qDebug() << "Could not make egl surface out of pixmap :(";
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h
new file mode 100644
index 0000000..ac68275
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLGLCONTEXT_H
+#define QWAYLANDREADBACKEGLGLCONTEXT_H
+
+#include <QPlatformGLContext>
+#include <QtGui/QWidget>
+
+#include "qwaylandreadbackeglintegration.h"
+#include "qwaylandreadbackeglwindow.h"
+
+class QWaylandShmBuffer;
+
+class QWaylandReadbackEglContext : public QPlatformGLContext
+{
+public:
+    QWaylandReadbackEglContext(QWaylandReadbackEglIntegration *eglIntegration, QWaylandReadbackEglWindow *window);
+    ~QWaylandReadbackEglContext();
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    virtual QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandReadbackEglIntegration *mEglIntegration;
+    QWaylandReadbackEglWindow *mWindow;
+    QWaylandShmBuffer *mBuffer;
+
+    Pixmap mPixmap;
+
+    EGLConfig mConfig;
+    EGLContext mContext;
+    EGLSurface mPixmapSurface;
+};
+
+#endif // QWAYLANDREADBACKEGLGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
new file mode 100644
index 0000000..9347691
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglintegration.h"
+
+#include <QDebug>
+
+#include "qwaylandreadbackeglwindow.h"
+
+QWaylandReadbackEglIntegration::QWaylandReadbackEglIntegration(QWaylandDisplay *display)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(display)
+{
+    qDebug() << "Using Wayland Readback-EGL";
+    char *display_name = getenv("DISPLAY");
+    mDisplay = XOpenDisplay(display_name);
+    mScreen = XDefaultScreen(mDisplay);
+    mRootWindow = XDefaultRootWindow(mDisplay);
+    XSync(mDisplay, False);
+}
+
+QWaylandReadbackEglIntegration::~QWaylandReadbackEglIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+
+QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandReadbackEglIntegration(waylandDisplay);
+}
+
+void QWaylandReadbackEglIntegration::initialize()
+{
+    eglBindAPI(EGL_OPENGL_ES_API);
+    mEglDisplay = eglGetDisplay(mDisplay);
+    EGLint major, minor;
+    EGLBoolean initialized = eglInitialize(mEglDisplay,&major,&minor);
+    if (initialized) {
+        qDebug() << "EGL initialized successfully" << major << "," << minor;
+    } else {
+        qDebug() << "EGL could not initialized. All EGL and GL operations will fail";
+    }
+}
+
+QWaylandWindow * QWaylandReadbackEglIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandReadbackEglWindow(widget,this);
+}
+
+EGLDisplay QWaylandReadbackEglIntegration::eglDisplay()
+{
+    return mEglDisplay;
+}
+
+Window QWaylandReadbackEglIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+int QWaylandReadbackEglIntegration::depth() const
+{
+    return XDefaultDepth(mDisplay,mScreen);
+}
+
+Display * QWaylandReadbackEglIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+QWaylandDisplay * QWaylandReadbackEglIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h
new file mode 100644
index 0000000..84fa64f
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLINTEGRATION_H
+#define QWAYLANDREADBACKEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+#include <EGL/egl.h>
+
+class QWaylandReadbackEglIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandReadbackEglIntegration(QWaylandDisplay *display);
+    ~QWaylandReadbackEglIntegration();
+
+    void initialize();
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+    Display *xDisplay() const;
+    Window rootWindow() const;
+    int depth() const;
+
+    EGLDisplay eglDisplay();
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+    Display *mDisplay;
+    int mScreen;
+    Window mRootWindow;
+    EGLDisplay mEglDisplay;
+
+};
+
+#endif // QWAYLANDREADBACKEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp
new file mode 100644
index 0000000..2ae212b
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglwindow.h"
+
+#include "qwaylandreadbackeglcontext.h"
+
+QWaylandReadbackEglWindow::QWaylandReadbackEglWindow(QWidget *window, QWaylandReadbackEglIntegration *eglIntegration)
+    : QWaylandShmWindow(window)
+    , mEglIntegration(eglIntegration)
+    , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandReadbackEglWindow::windowType() const
+{
+    //We'r lying, maybe we should add a type, but for now it will do
+    //since this is primarly used by the windowsurface.
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext *QWaylandReadbackEglWindow::glContext() const
+{
+    if (!mContext) {
+        QWaylandReadbackEglWindow *that = const_cast<QWaylandReadbackEglWindow *>(this);
+        that->mContext = new QWaylandReadbackEglContext(mEglIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandReadbackEglWindow::setGeometry(const QRect &rect)
+{
+    QPlatformWindow::setGeometry(rect);
+
+    if (mContext)
+        mContext->geometryChanged();
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h
new file mode 100644
index 0000000..453ad27
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLWINDOW_H
+#define QWAYLANDREADBACKEGLWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandreadbackeglintegration.h"
+
+class QWaylandReadbackEglContext;
+
+class QWaylandReadbackEglWindow : public QWaylandShmWindow
+{
+public:
+    QWaylandReadbackEglWindow(QWidget *window, QWaylandReadbackEglIntegration *eglIntegration);
+
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+
+private:
+    QWaylandReadbackEglIntegration *mEglIntegration;
+    QWaylandReadbackEglContext *mContext;
+};
+
+#endif // QWAYLANDREADBACKEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri b/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri
new file mode 100644
index 0000000..0d8e01b
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri
@@ -0,0 +1,14 @@
+
+LIBS += -lX11 -lXext -lEGL
+
+HEADERS += \
+    $$PWD/qwaylandreadbackeglintegration.h \
+    $$PWD/qwaylandreadbackeglcontext.h \
+    $$PWD/qwaylandreadbackeglwindow.h \
+    $$PWD/../../../eglconvenience/qeglconvenience.h
+
+SOURCES += \
+    $$PWD/qwaylandreadbackeglintegration.cpp \
+    $$PWD/qwaylandreadbackeglwindow.cpp \
+    $$PWD/qwaylandreadbackeglcontext.cpp \
+    $$PWD/../../../eglconvenience/qeglconvenience.cpp
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp
new file mode 100644
index 0000000..08c5cf6c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxcontext.h"
+
+#include "qwaylandshmsurface.h"
+#include "qwaylandreadbackglxwindow.h"
+
+#include <QtCore/QDebug>
+
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+    const int width = img.width();
+    const int height = img.height();
+
+    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+    {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+        }
+    } else {
+        for (int i = 0; i < height; ++i) {
+            uint *p = (uint *) img.scanLine(i);
+            for (int x = 0; x < width; ++x)
+                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+        }
+    }
+}
+
+QWaylandReadbackGlxContext::QWaylandReadbackGlxContext(QWaylandReadbackGlxIntegration *glxIntegration, QWaylandReadbackGlxWindow *window)
+    : QPlatformGLContext()
+    , mGlxIntegration(glxIntegration)
+    , mWindow(window)
+    , mBuffer(0)
+    , mPixmap(0)
+    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat(),GLX_PIXMAP_BIT))
+    , mGlxPixmap(0)
+{
+    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
+    mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
+
+    geometryChanged();
+}
+
+void QWaylandReadbackGlxContext::makeCurrent()
+{
+    QPlatformGLContext::makeCurrent();
+
+    glXMakeCurrent(mGlxIntegration->xDisplay(),mGlxPixmap,mContext);
+}
+
+void QWaylandReadbackGlxContext::doneCurrent()
+{
+    QPlatformGLContext::doneCurrent();
+}
+
+void QWaylandReadbackGlxContext::swapBuffers()
+{
+    if (QPlatformGLContext::currentContext() != this) {
+        makeCurrent();
+    }
+
+    QSize size = mWindow->geometry().size();
+
+    QImage img(size,QImage::Format_ARGB32);
+    const uchar *constBits = img.bits();
+    void *pixels = const_cast<uchar *>(constBits);
+
+    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+    img = img.mirrored();
+    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
+    constBits = img.bits();
+
+    const uchar *constDstBits = mBuffer->image()->bits();
+    uchar *dstBits = const_cast<uchar *>(constDstBits);
+    memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+    mWindow->waitForFrameSync();
+
+}
+
+void * QWaylandReadbackGlxContext::getProcAddress(const QString &procName)
+{
+    return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QWaylandReadbackGlxContext::platformWindowFormat() const
+{
+    return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+}
+
+void QWaylandReadbackGlxContext::geometryChanged()
+{
+    QSize size(mWindow->geometry().size());
+    if (size.isEmpty()) {
+        //QGLWidget wants a context for a window without geometry
+        size = QSize(1,1);
+    }
+
+    mWindow->waitForFrameSync();
+
+    delete mBuffer;
+    //XFreePixmap deletes the glxPixmap as well
+    if (mPixmap) {
+        XFreePixmap(mGlxIntegration->xDisplay(),mPixmap);
+    }
+
+    mBuffer = new QWaylandShmBuffer(mGlxIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+    mWindow->attach(mBuffer);
+    int depth = XDefaultDepth(mGlxIntegration->xDisplay(),mGlxIntegration->screen());
+    mPixmap = XCreatePixmap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),size.width(),size.height(),depth);
+    XSync(mGlxIntegration->xDisplay(),False);
+
+    mGlxPixmap = glXCreatePixmap(mGlxIntegration->xDisplay(),mConfig,mPixmap,0);
+
+    if (!mGlxPixmap) {
+        qDebug() << "Could not make egl surface out of pixmap :(";
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h
new file mode 100644
index 0000000..5fafcf0
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXCONTEXT_H
+#define QWAYLANDREADBACKGLXCONTEXT_H
+
+#include <QPlatformGLContext>
+
+#include "qwaylandreadbackglxintegration.h"
+
+#include "qglxconvenience.h"
+
+class QWaylandReadbackGlxWindow;
+class QWaylandShmBuffer;
+
+class QWaylandReadbackGlxContext : public QPlatformGLContext
+{
+public:
+    QWaylandReadbackGlxContext(QWaylandReadbackGlxIntegration *glxIntegration, QWaylandReadbackGlxWindow *window);
+
+    void makeCurrent();
+    void doneCurrent();
+    void swapBuffers();
+    void* getProcAddress(const QString& procName);
+
+    QPlatformWindowFormat platformWindowFormat() const;
+
+    void geometryChanged();
+
+private:
+    QWaylandReadbackGlxIntegration *mGlxIntegration;
+    QWaylandReadbackGlxWindow *mWindow;
+    QWaylandShmBuffer *mBuffer;
+
+    Pixmap mPixmap;
+    GLXFBConfig mConfig;
+    GLXContext mContext;
+    GLXPixmap mGlxPixmap;
+};
+
+#endif // QWAYLANDREADBACKGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
new file mode 100644
index 0000000..7e2a74d
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxintegration.h"
+
+#include "qwaylandreadbackglxwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandReadbackGlxIntegration::QWaylandReadbackGlxIntegration(QWaylandDisplay * waylandDispaly)
+    : QWaylandGLIntegration()
+    , mWaylandDisplay(waylandDispaly)
+{
+    qDebug() << "Using Wayland Readback-GLX";
+    char *display_name = getenv("DISPLAY");
+    mDisplay = XOpenDisplay(display_name);
+    mScreen = XDefaultScreen(mDisplay);
+    mRootWindow = XDefaultRootWindow(mDisplay);
+    XSync(mDisplay, False);
+}
+
+QWaylandReadbackGlxIntegration::~QWaylandReadbackGlxIntegration()
+{
+    XCloseDisplay(mDisplay);
+}
+
+void QWaylandReadbackGlxIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandReadbackGlxIntegration::createEglWindow(QWidget *widget)
+{
+    return new QWaylandReadbackGlxWindow(widget,this);
+}
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+    return new QWaylandReadbackGlxIntegration(waylandDisplay);
+}
+
+Display * QWaylandReadbackGlxIntegration::xDisplay() const
+{
+    return mDisplay;
+}
+
+int QWaylandReadbackGlxIntegration::screen() const
+{
+    return mScreen;
+}
+
+Window QWaylandReadbackGlxIntegration::rootWindow() const
+{
+    return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandReadbackGlxIntegration::waylandDisplay() const
+{
+    return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h
new file mode 100644
index 0000000..9056393
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXINTEGRATION_H
+#define QWAYLANDREADBACKGLXINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+class QWaylandReadbackGlxIntegration : public QWaylandGLIntegration
+{
+public:
+    QWaylandReadbackGlxIntegration(QWaylandDisplay * waylandDispaly);
+    ~QWaylandReadbackGlxIntegration();
+
+    void initialize();
+
+    QWaylandWindow *createEglWindow(QWidget *widget);
+
+    QWaylandDisplay *waylandDisplay() const;
+
+    Display *xDisplay() const;
+    int screen() const;
+    Window rootWindow() const;
+
+private:
+    QWaylandDisplay *mWaylandDisplay;
+
+    Display *mDisplay;
+    int mScreen;
+    Window mRootWindow;
+
+};
+
+#endif // QWAYLANDREADBACKGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp
new file mode 100644
index 0000000..ca1603c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxwindow.h"
+
+QWaylandReadbackGlxWindow::QWaylandReadbackGlxWindow(QWidget *window, QWaylandReadbackGlxIntegration *glxIntegration)
+    : QWaylandShmWindow(window)
+    , mGlxIntegration(glxIntegration)
+    , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandReadbackGlxWindow::windowType() const
+{
+    //yeah. this type needs a new name
+    return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandReadbackGlxWindow::glContext() const
+{
+    if (!mContext) {
+        QWaylandReadbackGlxWindow *that = const_cast<QWaylandReadbackGlxWindow *>(this);
+        that->mContext = new QWaylandReadbackGlxContext(mGlxIntegration,that);
+    }
+    return mContext;
+}
+
+void QWaylandReadbackGlxWindow::setGeometry(const QRect &rect)
+{
+    QWaylandShmWindow::setGeometry(rect);
+
+    if (mContext) {
+        mContext->geometryChanged();
+    }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h
new file mode 100644
index 0000000..4d7bb3e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXWINDOW_H
+#define QWAYLANDREADBACKGLXWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandreadbackglxintegration.h"
+#include "qwaylandreadbackglxcontext.h"
+
+class QWaylandReadbackGlxWindow : public QWaylandShmWindow
+{
+public:
+    QWaylandReadbackGlxWindow(QWidget *window, QWaylandReadbackGlxIntegration *glxIntegration);
+    WindowType windowType() const;
+
+    QPlatformGLContext *glContext() const;
+
+    void setGeometry(const QRect &rect);
+
+private:
+    QWaylandReadbackGlxIntegration *mGlxIntegration;
+    QWaylandReadbackGlxContext *mContext;
+
+};
+
+#endif // QWAYLANDREADBACKGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri b/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri
new file mode 100644
index 0000000..f8ea005
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri
@@ -0,0 +1,12 @@
+include (../../../glxconvenience/glxconvenience.pri)
+HEADERS += \
+    $$PWD/qwaylandreadbackglxintegration.h \
+    $$PWD/qwaylandreadbackglxwindow.h \
+    $$PWD/qwaylandreadbackglxcontext.h
+
+SOURCES += \
+    $$PWD/qwaylandreadbackglxintegration.cpp \
+    $$PWD/qwaylandreadbackglxwindow.cpp \
+    $$PWD/qwaylandreadbackglxcontext.cpp
+
+LIBS += -lX11
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
deleted file mode 100644
index b8ff4c4..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapeglcontext.h"
-
-#include "../../../eglconvenience/qeglconvenience.h"
-
-#include <QtOpenGL/QGLContext>
-#include <QtOpenGL/private/qglextensions_p.h>
-
-#include "qwaylandshmsurface.h"
-
-#include <QtCore/QDebug>
-
-static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
-{
-    const int width = img.width();
-    const int height = img.height();
-
-    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
-        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
-    {
-        for (int i = 0; i < height; ++i) {
-            uint *p = (uint *) img.scanLine(i);
-            for (int x = 0; x < width; ++x)
-                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
-        }
-    } else {
-        for (int i = 0; i < height; ++i) {
-            uint *p = (uint *) img.scanLine(i);
-            for (int x = 0; x < width; ++x)
-                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
-        }
-    }
-}
-
-QXPixmapReadbackGLContext::QXPixmapReadbackGLContext(QWaylandXPixmapEglIntegration *eglIntegration, QWaylandXPixmapWindow *window)
-    : mEglIntegration(eglIntegration)
-    , mWindow(window)
-    , mBuffer(0)
-    , mPixmap(0)
-    , mConfig(q_configFromQPlatformWindowFormat(eglIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_PIXMAP_BIT))
-    , mPixmapSurface(EGL_NO_SURFACE)
-{
-    QVector<EGLint> eglContextAttrs;
-    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
-    eglContextAttrs.append(2);
-    eglContextAttrs.append(EGL_NONE);
-
-    mContext = eglCreateContext(eglIntegration->eglDisplay(),mConfig,0,eglContextAttrs.constData());
-
-    geometryChanged();
-}
-
-QXPixmapReadbackGLContext::~QXPixmapReadbackGLContext()
-{
-    eglDestroyContext(mEglIntegration->eglDisplay(),mContext);
-}
-
-void QXPixmapReadbackGLContext::makeCurrent()
-{
-    QPlatformGLContext::makeCurrent();
-
-    while(mWindow->waitingForFrameSync()) {
-        mEglIntegration->waylandDisplay()->iterate();
-    }
-
-    eglMakeCurrent(mEglIntegration->eglDisplay(),mPixmapSurface,mPixmapSurface,mContext);
-}
-
-void QXPixmapReadbackGLContext::doneCurrent()
-{
-    QPlatformGLContext::doneCurrent();
-    eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
-}
-
-void QXPixmapReadbackGLContext::swapBuffers()
-{
-    eglSwapBuffers(mEglIntegration->eglDisplay(),mPixmapSurface);
-
-    if (QPlatformGLContext::currentContext() != this) {
-        makeCurrent();
-    }
-
-    QSize size = mWindow->geometry().size();
-
-    QImage img(size,QImage::Format_ARGB32);
-    const uchar *constBits = img.bits();
-    void *pixels = const_cast<uchar *>(constBits);
-
-    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
-
-    img = img.mirrored();
-    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
-    constBits = img.bits();
-
-    const uchar *constDstBits = mBuffer->image()->bits();
-    uchar *dstBits = const_cast<uchar *>(constDstBits);
-    memcpy(dstBits,constBits,(img.width()*4) * img.height());
-
-
-    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
-}
-
-void * QXPixmapReadbackGLContext::getProcAddress(const QString &procName)
-{
-    return (void *) eglGetProcAddress(procName.toLatin1().data());
-}
-
-QPlatformWindowFormat QXPixmapReadbackGLContext::platformWindowFormat() const
-{
-    return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
-}
-
-void QXPixmapReadbackGLContext::geometryChanged()
-{
-    QSize size(mWindow->geometry().size());
-    if (size.isEmpty()) {
-        //QGLWidget wants a context for a window without geometry
-        size = QSize(1,1);
-    }
-
-    while (mWindow->waitingForFrameSync())
-        mEglIntegration->waylandDisplay()->iterate();
-
-    delete mBuffer;
-    if (mPixmap)
-        XFreePixmap(mEglIntegration->xDisplay(),mPixmap);
-
-    mBuffer = new QWaylandShmBuffer(mEglIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
-    mWindow->attach(mBuffer);
-    mPixmap = XCreatePixmap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),size.width(),size.height(),mEglIntegration->depth());
-    XSync(mEglIntegration->xDisplay(),False);
-
-    mPixmapSurface = eglCreatePixmapSurface(mEglIntegration->eglDisplay(),mConfig,mPixmap,0);
-    if (mPixmapSurface == EGL_NO_SURFACE) {
-        qDebug() << "Could not make egl surface out of pixmap :(";
-    }
-}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
deleted file mode 100644
index 811d75d..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QXPIXMAPREADBACKGLCONTEXT_H
-#define QXPIXMAPREADBACKGLCONTEXT_H
-
-#include <QPlatformGLContext>
-#include <QtGui/QWidget>
-
-#include "qwaylandxpixmapeglintegration.h"
-#include "qwaylandxpixmapwindow.h"
-
-class QWaylandShmBuffer;
-
-class QXPixmapReadbackGLContext : public QPlatformGLContext
-{
-public:
-    QXPixmapReadbackGLContext(QWaylandXPixmapEglIntegration *eglIntegration, QWaylandXPixmapWindow *window);
-    ~QXPixmapReadbackGLContext();
-
-    void makeCurrent();
-    void doneCurrent();
-    void swapBuffers();
-    void* getProcAddress(const QString& procName);
-
-    virtual QPlatformWindowFormat platformWindowFormat() const;
-
-    void geometryChanged();
-
-private:
-    QWaylandXPixmapEglIntegration *mEglIntegration;
-    QWaylandXPixmapWindow *mWindow;
-    QWaylandShmBuffer *mBuffer;
-
-    Pixmap mPixmap;
-
-    EGLConfig mConfig;
-    EGLContext mContext;
-    EGLSurface mPixmapSurface;
-};
-
-#endif // QXPIXMAPREADBACKGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
deleted file mode 100644
index f6967e1..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapeglintegration.h"
-
-#include <QDebug>
-
-#include "qwaylandxpixmapwindow.h"
-
-QWaylandXPixmapEglIntegration::QWaylandXPixmapEglIntegration(QWaylandDisplay *display)
-    : QWaylandGLIntegration()
-    , mWaylandDisplay(display)
-{
-    qDebug() << "Using Wayland XPixmap-EGL";
-    char *display_name = getenv("DISPLAY");
-    mDisplay = XOpenDisplay(display_name);
-    mScreen = XDefaultScreen(mDisplay);
-    mRootWindow = XDefaultRootWindow(mDisplay);
-    XSync(mDisplay, False);
-}
-
-QWaylandXPixmapEglIntegration::~QWaylandXPixmapEglIntegration()
-{
-    XCloseDisplay(mDisplay);
-}
-
-
-QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
-{
-    return new QWaylandXPixmapEglIntegration(waylandDisplay);
-}
-
-void QWaylandXPixmapEglIntegration::initialize()
-{
-    eglBindAPI(EGL_OPENGL_ES_API);
-    mEglDisplay = eglGetDisplay(mDisplay);
-    EGLint major, minor;
-    EGLBoolean initialized = eglInitialize(mEglDisplay,&major,&minor);
-    if (initialized) {
-        qDebug() << "EGL initialized successfully" << major << "," << minor;
-    } else {
-        qDebug() << "EGL could not initialized. All EGL and GL operations will fail";
-    }
-}
-
-QWaylandWindow * QWaylandXPixmapEglIntegration::createEglWindow(QWidget *widget)
-{
-    return new QWaylandXPixmapWindow(widget,this);
-}
-
-EGLDisplay QWaylandXPixmapEglIntegration::eglDisplay()
-{
-    return mEglDisplay;
-}
-
-Window QWaylandXPixmapEglIntegration::rootWindow() const
-{
-    return mRootWindow;
-}
-
-int QWaylandXPixmapEglIntegration::depth() const
-{
-    return XDefaultDepth(mDisplay,mScreen);
-}
-
-Display * QWaylandXPixmapEglIntegration::xDisplay() const
-{
-    return mDisplay;
-}
-
-QWaylandDisplay * QWaylandXPixmapEglIntegration::waylandDisplay() const
-{
-    return mWaylandDisplay;
-}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
deleted file mode 100644
index 16c3632..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDXPIXMAPEGLINTEGRATION_H
-#define QWAYLANDXPIXMAPEGLINTEGRATION_H
-
-#include "gl_integration/qwaylandglintegration.h"
-
-#include <QtCore/QTextStream>
-#include <QtCore/QDataStream>
-#include <QtCore/QMetaType>
-#include <QtCore/QVariant>
-#include <QtGui/QWidget>
-
-#include <X11/Xlib.h>
-
-#include <EGL/egl.h>
-
-class QWaylandXPixmapEglIntegration : public QWaylandGLIntegration
-{
-public:
-    QWaylandXPixmapEglIntegration(QWaylandDisplay *display);
-    ~QWaylandXPixmapEglIntegration();
-
-    void initialize();
-    QWaylandWindow *createEglWindow(QWidget *widget);
-
-    QWaylandDisplay *waylandDisplay() const;
-    Display *xDisplay() const;
-    Window rootWindow() const;
-    int depth() const;
-
-    EGLDisplay eglDisplay();
-
-private:
-    QWaylandDisplay *mWaylandDisplay;
-    Display *mDisplay;
-    int mScreen;
-    Window mRootWindow;
-    EGLDisplay mEglDisplay;
-
-};
-
-#endif // QWAYLANDXPIXMAPEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
deleted file mode 100644
index 43a80b5..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapwindow.h"
-
-#include "qwaylandxpixmapeglcontext.h"
-QWaylandXPixmapWindow::QWaylandXPixmapWindow(QWidget *window, QWaylandXPixmapEglIntegration *eglIntegration)
-    : QWaylandShmWindow(window)
-    , mEglIntegration(eglIntegration)
-    , mContext(0)
-{
-}
-
-QWaylandWindow::WindowType QWaylandXPixmapWindow::windowType() const
-{
-    //We'r lying, maybe we should add a type, but for now it will do
-    //since this is primarly used by the windowsurface.
-    return QWaylandWindow::Egl;
-}
-
-QPlatformGLContext *QWaylandXPixmapWindow::glContext() const
-{
-    if (!mContext) {
-        QWaylandXPixmapWindow *that = const_cast<QWaylandXPixmapWindow *>(this);
-        that->mContext = new QXPixmapReadbackGLContext(mEglIntegration,that);
-    }
-    return mContext;
-}
-
-void QWaylandXPixmapWindow::setGeometry(const QRect &rect)
-{
-    QPlatformWindow::setGeometry(rect);
-
-    if (mContext)
-        mContext->geometryChanged();
-}
-
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
deleted file mode 100644
index f6cae1d..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDXPIXMAPWINDOW_H
-#define QWAYLANDXPIXMAPWINDOW_H
-
-#include "qwaylandshmwindow.h"
-#include "qwaylandxpixmapeglintegration.h"
-
-class QXPixmapReadbackGLContext;
-
-class QWaylandXPixmapWindow : public QWaylandShmWindow
-{
-public:
-    QWaylandXPixmapWindow(QWidget *window, QWaylandXPixmapEglIntegration *eglIntegration);
-
-    WindowType windowType() const;
-
-    QPlatformGLContext *glContext() const;
-
-    void setGeometry(const QRect &rect);
-
-private:
-    QWaylandXPixmapEglIntegration *mEglIntegration;
-    QXPixmapReadbackGLContext *mContext;
-};
-
-#endif // QWAYLANDXPIXMAPWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri b/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri
deleted file mode 100644
index 87e2d28..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_egl/xpixmap_egl.pri
+++ /dev/null
@@ -1,14 +0,0 @@
-
-LIBS += -lX11 -lXext -lEGL
-
-HEADERS += \
-    gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.h \
-    gl_integration/xpixmap_egl/qwaylandxpixmapwindow.h \
-    gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.h \
-    $$PWD/../../../eglconvenience/qeglconvenience.h
-
-SOURCES += \
-    gl_integration/xpixmap_egl/qwaylandxpixmapeglintegration.cpp \
-    gl_integration/xpixmap_egl/qwaylandxpixmapwindow.cpp \
-    gl_integration/xpixmap_egl/qwaylandxpixmapeglcontext.cpp \
-    $$PWD/../../../eglconvenience/qeglconvenience.cpp
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
deleted file mode 100644
index 8ccd7c9..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapglxcontext.h"
-
-#include "qwaylandshmsurface.h"
-#include "qwaylandxpixmapglxwindow.h"
-
-#include <QtCore/QDebug>
-
-static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
-{
-    const int width = img.width();
-    const int height = img.height();
-
-    if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
-        || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
-    {
-        for (int i = 0; i < height; ++i) {
-            uint *p = (uint *) img.scanLine(i);
-            for (int x = 0; x < width; ++x)
-                p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
-        }
-    } else {
-        for (int i = 0; i < height; ++i) {
-            uint *p = (uint *) img.scanLine(i);
-            for (int x = 0; x < width; ++x)
-                p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
-        }
-    }
-}
-
-QWaylandXPixmapGLXContext::QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegration *glxIntegration, QWaylandXPixmapGLXWindow *window)
-    : QPlatformGLContext()
-    , mGlxIntegration(glxIntegration)
-    , mWindow(window)
-    , mBuffer(0)
-    , mPixmap(0)
-    , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat(),GLX_PIXMAP_BIT))
-    , mGlxPixmap(0)
-{
-    XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
-    mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
-
-    geometryChanged();
-}
-
-void QWaylandXPixmapGLXContext::makeCurrent()
-{
-    QPlatformGLContext::makeCurrent();
-
-    glXMakeCurrent(mGlxIntegration->xDisplay(),mGlxPixmap,mContext);
-}
-
-void QWaylandXPixmapGLXContext::doneCurrent()
-{
-    QPlatformGLContext::doneCurrent();
-}
-
-void QWaylandXPixmapGLXContext::swapBuffers()
-{
-    if (QPlatformGLContext::currentContext() != this) {
-        makeCurrent();
-    }
-
-    QSize size = mWindow->geometry().size();
-
-    QImage img(size,QImage::Format_ARGB32);
-    const uchar *constBits = img.bits();
-    void *pixels = const_cast<uchar *>(constBits);
-
-    glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
-
-    img = img.mirrored();
-    qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
-    constBits = img.bits();
-
-    const uchar *constDstBits = mBuffer->image()->bits();
-    uchar *dstBits = const_cast<uchar *>(constDstBits);
-    memcpy(dstBits,constBits,(img.width()*4) * img.height());
-
-
-    mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
-    mWindow->waitForFrameSync();
-
-}
-
-void * QWaylandXPixmapGLXContext::getProcAddress(const QString &procName)
-{
-    return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
-}
-
-QPlatformWindowFormat QWaylandXPixmapGLXContext::platformWindowFormat() const
-{
-    return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
-}
-
-void QWaylandXPixmapGLXContext::geometryChanged()
-{
-    QSize size(mWindow->geometry().size());
-    if (size.isEmpty()) {
-        //QGLWidget wants a context for a window without geometry
-        size = QSize(1,1);
-    }
-
-    mWindow->waitForFrameSync();
-
-    delete mBuffer;
-    //XFreePixmap deletes the glxPixmap as well
-    if (mPixmap) {
-        XFreePixmap(mGlxIntegration->xDisplay(),mPixmap);
-    }
-
-    mBuffer = new QWaylandShmBuffer(mGlxIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
-    mWindow->attach(mBuffer);
-    int depth = XDefaultDepth(mGlxIntegration->xDisplay(),mGlxIntegration->screen());
-    mPixmap = XCreatePixmap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),size.width(),size.height(),depth);
-    XSync(mGlxIntegration->xDisplay(),False);
-
-    mGlxPixmap = glXCreatePixmap(mGlxIntegration->xDisplay(),mConfig,mPixmap,0);
-
-    if (!mGlxPixmap) {
-        qDebug() << "Could not make egl surface out of pixmap :(";
-    }
-}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
deleted file mode 100644
index 3ea9dfe..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDXPIXMAPGLXCONTEXT_H
-#define QWAYLANDXPIXMAPGLXCONTEXT_H
-
-#include <QPlatformGLContext>
-
-#include "qwaylandxpixmapglxintegration.h"
-
-#include "qglxconvenience.h"
-
-class QWaylandXPixmapGLXWindow;
-class QWaylandShmBuffer;
-
-class QWaylandXPixmapGLXContext : public QPlatformGLContext
-{
-public:
-    QWaylandXPixmapGLXContext(QWaylandXPixmapGLXIntegration *glxIntegration, QWaylandXPixmapGLXWindow *window);
-
-    void makeCurrent();
-    void doneCurrent();
-    void swapBuffers();
-    void* getProcAddress(const QString& procName);
-
-    QPlatformWindowFormat platformWindowFormat() const;
-
-    void geometryChanged();
-
-private:
-    QWaylandXPixmapGLXIntegration *mGlxIntegration;
-    QWaylandXPixmapGLXWindow *mWindow;
-    QWaylandShmBuffer *mBuffer;
-
-    Pixmap mPixmap;
-    GLXFBConfig mConfig;
-    GLXContext mContext;
-    GLXPixmap mGlxPixmap;
-};
-
-#endif // QWAYLANDXPIXMAPGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
deleted file mode 100644
index 33d6b06..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapglxintegration.h"
-
-#include "qwaylandxpixmapglxwindow.h"
-
-#include <QtCore/QDebug>
-
-QWaylandXPixmapGLXIntegration::QWaylandXPixmapGLXIntegration(QWaylandDisplay * waylandDispaly)
-    : QWaylandGLIntegration()
-    , mWaylandDisplay(waylandDispaly)
-{
-    qDebug() << "Using Wayland XPixmap-GLX";
-    char *display_name = getenv("DISPLAY");
-    mDisplay = XOpenDisplay(display_name);
-    mScreen = XDefaultScreen(mDisplay);
-    mRootWindow = XDefaultRootWindow(mDisplay);
-    XSync(mDisplay, False);
-}
-
-QWaylandXPixmapGLXIntegration::~QWaylandXPixmapGLXIntegration()
-{
-    XCloseDisplay(mDisplay);
-}
-
-void QWaylandXPixmapGLXIntegration::initialize()
-{
-}
-
-QWaylandWindow * QWaylandXPixmapGLXIntegration::createEglWindow(QWidget *widget)
-{
-    return new QWaylandXPixmapGLXWindow(widget,this);
-}
-
-QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
-{
-    return new QWaylandXPixmapGLXIntegration(waylandDisplay);
-}
-
-Display * QWaylandXPixmapGLXIntegration::xDisplay() const
-{
-    return mDisplay;
-}
-
-int QWaylandXPixmapGLXIntegration::screen() const
-{
-    return mScreen;
-}
-
-Window QWaylandXPixmapGLXIntegration::rootWindow() const
-{
-    return mRootWindow;
-}
-
-QWaylandDisplay * QWaylandXPixmapGLXIntegration::waylandDisplay() const
-{
-    return mWaylandDisplay;
-}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
deleted file mode 100644
index c7a80de..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxintegration.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDXPIXMAPGLXINTEGRATION_H
-#define QWAYLANDXPIXMAPGLXINTEGRATION_H
-
-#include "gl_integration/qwaylandglintegration.h"
-
-#include <QtCore/QTextStream>
-#include <QtCore/QDataStream>
-#include <QtCore/QMetaType>
-#include <QtCore/QVariant>
-#include <QtGui/QWidget>
-
-#include <X11/Xlib.h>
-
-class QWaylandXPixmapGLXIntegration : public QWaylandGLIntegration
-{
-public:
-    QWaylandXPixmapGLXIntegration(QWaylandDisplay * waylandDispaly);
-    ~QWaylandXPixmapGLXIntegration();
-
-    void initialize();
-
-    QWaylandWindow *createEglWindow(QWidget *widget);
-
-    QWaylandDisplay *waylandDisplay() const;
-
-    Display *xDisplay() const;
-    int screen() const;
-    Window rootWindow() const;
-
-private:
-    QWaylandDisplay *mWaylandDisplay;
-
-    Display *mDisplay;
-    int mScreen;
-    Window mRootWindow;
-
-};
-
-#endif // QWAYLANDXPIXMAPGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
deleted file mode 100644
index 065a6fd..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaylandxpixmapglxwindow.h"
-
-QWaylandXPixmapGLXWindow::QWaylandXPixmapGLXWindow(QWidget *window, QWaylandXPixmapGLXIntegration *glxIntegration)
-    : QWaylandShmWindow(window)
-    , mGlxIntegration(glxIntegration)
-    , mContext(0)
-{
-}
-
-QWaylandWindow::WindowType QWaylandXPixmapGLXWindow::windowType() const
-{
-    //yeah. this type needs a new name
-    return QWaylandWindow::Egl;
-}
-
-QPlatformGLContext * QWaylandXPixmapGLXWindow::glContext() const
-{
-    if (!mContext) {
-        QWaylandXPixmapGLXWindow *that = const_cast<QWaylandXPixmapGLXWindow *>(this);
-        that->mContext = new QWaylandXPixmapGLXContext(mGlxIntegration,that);
-    }
-    return mContext;
-}
-
-void QWaylandXPixmapGLXWindow::setGeometry(const QRect &rect)
-{
-    QWaylandShmWindow::setGeometry(rect);
-
-    if (mContext) {
-        mContext->geometryChanged();
-    }
-}
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
deleted file mode 100644
index 5f4d24f..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAYLANDXPIXMAPGLXWINDOW_H
-#define QWAYLANDXPIXMAPGLXWINDOW_H
-
-#include "qwaylandshmwindow.h"
-#include "qwaylandxpixmapglxintegration.h"
-#include "qwaylandxpixmapglxcontext.h"
-
-class QWaylandXPixmapGLXWindow : public QWaylandShmWindow
-{
-public:
-    QWaylandXPixmapGLXWindow(QWidget *window, QWaylandXPixmapGLXIntegration *glxIntegration);
-    WindowType windowType() const;
-
-    QPlatformGLContext *glContext() const;
-
-    void setGeometry(const QRect &rect);
-
-private:
-    QWaylandXPixmapGLXIntegration *mGlxIntegration;
-    QWaylandXPixmapGLXContext *mContext;
-
-};
-
-#endif // QWAYLANDXPIXMAPGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri b/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
deleted file mode 100644
index 2b6ae0d..0000000
--- a/src/plugins/platforms/wayland/gl_integration/xpixmap_glx/xpixmap_glx.pri
+++ /dev/null
@@ -1,12 +0,0 @@
-include (../../../glxconvenience/glxconvenience.pri)
-HEADERS += \
-    $$PWD/qwaylandxpixmapglxintegration.h \
-    gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.h \
-    gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.h
-
-SOURCES += \
-    $$PWD/qwaylandxpixmapglxintegration.cpp \
-    gl_integration/xpixmap_glx/qwaylandxpixmapglxwindow.cpp \
-    gl_integration/xpixmap_glx/qwaylandxpixmapglxcontext.cpp
-
-LIBS += -lX11
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index bd017cc..ae17a14 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -37,10 +37,10 @@ contains(QT_CONFIG, opengl) {
 
     contains(QT_CONFIG, opengles2) {
         CONFIG += wayland_egl
-        #CONFIG += xpixmap_egl
+        #CONFIG += readback_egl
         #CONFIG += xcomposite_egl
     } else {
-        CONFIG += xpixmap_glx
+        CONFIG += readback_glx
         #CONFIG += xcomposite_gl
 
     }
-- 
cgit v0.12


From 6a8beac59f5824e1fc826f513495fbb8478b79ce Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 11 Apr 2011 10:33:29 +0200
Subject: Revert "HTTP caching internals: fix logic for PreferNetwork and
 PreferCache"

This reverts commit e5d27e7aeac984e46f3aa8de20160cc00fc63155.
Broke the CI.
---
 src/network/access/qnetworkaccesshttpbackend.cpp   |  7 +----
 .../tst_qabstractnetworkcache.cpp                  | 35 ++++++++++------------
 2 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 4ac0a67..0438fb5 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -262,11 +262,6 @@ bool QNetworkAccessHttpBackend::loadFromCacheIfAllowed(QHttpNetworkRequest &http
         httpRequest.setHeaderField("If-Modified-Since", QNetworkHeadersPrivate::toHttpDate(lastModified));
 
     if (CacheLoadControlAttribute == QNetworkRequest::PreferNetwork) {
-        // PreferNetwork == send request with "If-None-Match" and "If-Modified-Since" header,
-        // which will return a 304 Not Modifed if resource has not been changed.
-        // We might read from cache later, if receiving a 304.
-        return false;
-    } else if (CacheLoadControlAttribute == QNetworkRequest::PreferCache) {
         it = cacheHeaders.findRawHeader("Cache-Control");
         if (it != cacheHeaders.rawHeaders.constEnd()) {
             QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
@@ -1150,7 +1145,7 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo
         attributes.insert(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
         attributes.insert(QNetworkRequest::HttpReasonPhraseAttribute, reasonPhrase);
     } else {
-        // this is the server telling us the resource has not changed, keep the attributes intact
+        // this is a redirection, keep the attributes intact
         attributes = oldMetaData.attributes();
     }
     metaData.setAttributes(attributes);
diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index 7a34a9e..db0d0a7 100644
--- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -124,25 +124,22 @@ static bool AlwaysFalse = false;
 
 Q_DECLARE_METATYPE(QNetworkRequest::CacheLoadControl)
 
-void tst_QAbstractNetworkCache::expires_data() // Server sending Expires header, but neither max-age nor Last-Modified
+void tst_QAbstractNetworkCache::expires_data()
 {
     QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
-    // httpcachetest_expires304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << false; // neither Last-Modified nor ETag given
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true; // we know the expiration date, so we can read from cache
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true;
 
-    // httpcachetest_expires500.cgi will send a 500 upon receiving a If-Modified-Since header
     QTest::newRow("500-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires500.cgi" << AlwaysFalse;
-    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << false; // neither Last-Modified nor ETag given
+    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << true;
     QTest::newRow("500-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires500.cgi" << AlwaysTrue;
-    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true; // we know the expiration date, so we can read from cache
+    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true;
 
-    // httpcachetest_expires200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires200.cgi" << AlwaysFalse;
     QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires200.cgi" << AlwaysTrue;
@@ -170,17 +167,15 @@ void tst_QAbstractNetworkCache::lastModified_data()
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
-    // httpcachetest_lastModified304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true;
 
-    // httpcachetest_lastModified200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false;
 }
 
 void tst_QAbstractNetworkCache::lastModified()
@@ -205,14 +200,14 @@ void tst_QAbstractNetworkCache::etag_data()
     QTest::addColumn<bool>("fetchFromCache");
 
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true; // we will send If-None-Match and get 304
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true; // we don't have expiration information, but will get 304, as with PreferNetwork
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true;
 
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false; // we will send If-None-Match and get 200
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false; // we don't have expiration information, and will get 200, as with PreferNetwork
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false;
 }
 
 void tst_QAbstractNetworkCache::etag()
@@ -252,8 +247,8 @@ void tst_QAbstractNetworkCache::cacheControl_data()
 
     // see QTBUG-7060
     //QTest::newRow("nokia-boston") << QNetworkRequest::PreferNetwork << "http://waplabdc.nokia-boston.com/browser/users/venkat/cache/Cache_directives/private_1b.asp" << true;
-    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << false; // script always returns 200, so we cannot load from cache
-    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true; // we got expiry information
+    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
+    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
 }
 
 void tst_QAbstractNetworkCache::cacheControl()
-- 
cgit v0.12


From b033bb91ea6fd32989cc59904aa79db9a188bf5b Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Fri, 8 Apr 2011 17:34:51 +0200
Subject: Make sure removed QTextBlock is invalid

If the block is removed from document block map, we will mark the
right node to the current head->freelist index, but it shouldn't
be accessed directly, otherwise it can cause crash because of
uninitialized node.

Hence we need to check if a node index is equal to current freelist
index. If so, it cannot be a valid block.

Task-number: QTBUG-18500
Reviewed-by: Eskil
---
 src/gui/text/qfragmentmap_p.h            |  5 +++++
 src/gui/text/qtextobject.cpp             |  5 +++++
 src/gui/text/qtextobject.h               |  2 +-
 tests/auto/qtextblock/tst_qtextblock.cpp | 12 ++++++++++++
 4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/gui/text/qfragmentmap_p.h b/src/gui/text/qfragmentmap_p.h
index 501bfff..4057142 100644
--- a/src/gui/text/qfragmentmap_p.h
+++ b/src/gui/text/qfragmentmap_p.h
@@ -195,6 +195,10 @@ public:
         head->root = new_root;
     }
 
+    inline bool isValid(uint n) const {
+        return n > 0 && n != head->freelist;
+    }
+
     union {
         Header *head;
         Fragment *fragments;
@@ -854,6 +858,7 @@ public:
         return data.fragment(index);
     }
     inline uint position(uint node, uint field = 0) const { return data.position(node, field); }
+    inline bool isValid(uint n) const { return data.isValid(n); }
     inline uint next(uint n) const { return data.next(n); }
     inline uint previous(uint n) const { return data.previous(n); }
     inline uint size(uint node, uint field = 0) const { return data.size(node, field); }
diff --git a/src/gui/text/qtextobject.cpp b/src/gui/text/qtextobject.cpp
index 94f2fc7..a403cc5 100644
--- a/src/gui/text/qtextobject.cpp
+++ b/src/gui/text/qtextobject.cpp
@@ -891,6 +891,11 @@ QTextBlockUserData::~QTextBlockUserData()
     Returns true if this text block is valid; otherwise returns false.
 */
 
+bool QTextBlock::isValid() const
+{
+    return p != 0 && p->blockMap().isValid(n);
+}
+
 /*!
     \fn QTextBlock &QTextBlock::operator=(const QTextBlock &other)
 
diff --git a/src/gui/text/qtextobject.h b/src/gui/text/qtextobject.h
index d5c1e8d..73aed79 100644
--- a/src/gui/text/qtextobject.h
+++ b/src/gui/text/qtextobject.h
@@ -204,7 +204,7 @@ public:
     inline QTextBlock(const QTextBlock &o) : p(o.p), n(o.n) {}
     inline QTextBlock &operator=(const QTextBlock &o) { p = o.p; n = o.n; return *this; }
 
-    inline bool isValid() const { return p != 0 && n != 0; }
+    bool isValid() const;
 
     inline bool operator==(const QTextBlock &o) const { return p == o.p && n == o.n; }
     inline bool operator!=(const QTextBlock &o) const { return p != o.p || n != o.n; }
diff --git a/tests/auto/qtextblock/tst_qtextblock.cpp b/tests/auto/qtextblock/tst_qtextblock.cpp
index cec3a6a..748d921 100644
--- a/tests/auto/qtextblock/tst_qtextblock.cpp
+++ b/tests/auto/qtextblock/tst_qtextblock.cpp
@@ -76,6 +76,7 @@ private slots:
     void excludeParagraphSeparatorFragment();
     void backwardsBlockIterator();
     void previousBlock_qtbug18026();
+    void removedBlock_qtbug18500();
 
 private:
     QTextDocument *doc;
@@ -181,5 +182,16 @@ void tst_QTextBlock::previousBlock_qtbug18026()
     QVERIFY(last.isValid());
 }
 
+void tst_QTextBlock::removedBlock_qtbug18500()
+{
+    cursor.insertText("line 1\nline 2\nline 3 \nline 4\n");
+    cursor.setPosition(7);
+    QTextBlock block = cursor.block();
+    cursor.setPosition(21, QTextCursor::KeepAnchor);
+
+    cursor.removeSelectedText();
+    QVERIFY(!block.isValid());
+}
+
 QTEST_MAIN(tst_QTextBlock)
 #include "tst_qtextblock.moc"
-- 
cgit v0.12


From f5f4e258a989e05fe89a4294db85c8513b24a04a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 11 Apr 2011 13:44:49 +0200
Subject: Make sure the global listener gets registered even when using drm.

---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index e2bfaa2..a6fdd46 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -120,6 +120,9 @@ QWaylandDisplay::QWaylandDisplay(void)
         qErrnoWarning(errno, "Failed to create display");
         qFatal("No wayland connection available.");
     }
+
+    wl_display_add_global_listener(mDisplay, QWaylandDisplay::displayHandleGlobal, this);
+
 #ifdef QT_WAYLAND_GL_SUPPORT
     mEglIntegration = QWaylandGLIntegration::createGLIntegration(this);
 #endif
@@ -132,7 +135,6 @@ QWaylandDisplay::QWaylandDisplay(void)
 
     connect(QAbstractEventDispatcher::instance(), SIGNAL(aboutToBlock()), this, SLOT(flushRequests()));
 
-    wl_display_add_global_listener(mDisplay, QWaylandDisplay::displayHandleGlobal, this);
     mFd = wl_display_get_fd(mDisplay, sourceUpdate, this);
 
     mReadNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read, this);
-- 
cgit v0.12


From f067aa05c030fd02d46f10ab2023059978b4f816 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 11 Apr 2011 10:41:40 +0200
Subject: Make the xcomposite the default gl integration backend

The others can be opted in with the environment variable:
QT_WAYLAND_GL_CONFIG
---
 .../wayland/gl_integration/gl_integration.pri      | 30 ++++++++++++++++++++++
 src/plugins/platforms/wayland/wayland.pro          | 17 +-----------
 2 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
index 835f880..d9b5fa9 100644
--- a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -1,3 +1,7 @@
+contains(QT_CONFIG, opengl) {
+    DEFINES += QT_WAYLAND_GL_SUPPORT
+    QT += opengl
+
 HEADERS += \
     $$PWD/qwaylandglintegration.h \
     $$PWD/qwaylandglwindowsurface.h
@@ -6,6 +10,32 @@ SOURCES += \
     $$PWD/qwaylandglintegration.cpp \
     $$PWD/qwaylandglwindowsurface.cpp
 
+    QT_WAYLAND_GL_CONFIG = $$(QT_WAYLAND_GL_CONFIG)
+    contains(QT_CONFIG, opengles2) {
+        isEqual(QT_WAYLAND_GL_CONFIG, wayland_egl) {
+            QT_WAYLAND_GL_INTEGRATION = $$QT_WAYLAND_GL_CONFIG
+            CONFIG += wayland_egl
+        } else:isEqual(QT_WAYLAND_GL_CONFIG,readback) {
+            QT_WAYLAND_GL_INTEGRATION = readback_egl
+            CONFIG += readback_egl
+        } else {
+            QT_WAYLAND_GL_INTEGRATION = xcomposite_egl
+            CONFIG += xcomposite_egl
+        }
+    } else {
+        isEqual(QT_WAYLAND_GL_CONFIG, readback) {
+            QT_WAYLAND_GL_INTEGRATION = readback_glx
+            CONFIG += readback_glx
+        } else {
+            QT_WAYLAND_GL_INTEGRATION = xcomposite_glx
+            CONFIG += xcomposite_glx
+        }
+    }
+
+    message("Wayland GL Integration: $$QT_WAYLAND_GL_INTEGRATION")
+}
+
+
 wayland_egl {
     include ($$PWD/wayland_egl/wayland_egl.pri)
 }
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
index ae17a14..5945438 100644
--- a/src/plugins/platforms/wayland/wayland.pro
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -31,22 +31,7 @@ QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_WAYLAND
 
 INCLUDEPATH += $$PWD
 
-contains(QT_CONFIG, opengl) {
-    DEFINES += QT_WAYLAND_GL_SUPPORT
-    QT += opengl
-
-    contains(QT_CONFIG, opengles2) {
-        CONFIG += wayland_egl
-        #CONFIG += readback_egl
-        #CONFIG += xcomposite_egl
-    } else {
-        CONFIG += readback_glx
-        #CONFIG += xcomposite_gl
-
-    }
-
-    include ($$PWD/gl_integration/gl_integration.pri)
-}
+include ($$PWD/gl_integration/gl_integration.pri)
 
 include (../fontdatabases/genericunix/genericunix.pri)
 
-- 
cgit v0.12


From 15d84435d0b41b866da77367e41ebc523409ce95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 11 Apr 2011 12:37:36 +0200
Subject: Wayland: compile fix after making the event handling

single threaded
---
 .../qwaylandxcompositeglxcontext.cpp               | 24 ++++++++++++++--------
 .../xcomposite_glx/qwaylandxcompositeglxcontext.h  |  3 ++-
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
index c108fbd..caf5117 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
@@ -56,6 +56,7 @@ QWaylandXCompositeGLXContext::QWaylandXCompositeGLXContext(QWaylandXCompositeGLX
     , mBuffer(0)
     , mXWindow(0)
     , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+    , mWaitingForSyncCallback(false)
 {
     XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
     mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
@@ -97,7 +98,20 @@ QPlatformWindowFormat QWaylandXCompositeGLXContext::platformWindowFormat() const
 void QWaylandXCompositeGLXContext::sync_function(void *data)
 {
     QWaylandXCompositeGLXContext *that = static_cast<QWaylandXCompositeGLXContext *>(data);
-    that->mWaitCondition.wakeAll();
+    that->mWaitingForSyncCallback = false;
+}
+
+void QWaylandXCompositeGLXContext::waitForSync()
+{
+    wl_display_sync_callback(mGlxIntegration->waylandDisplay()->wl_display(),
+                             QWaylandXCompositeGLXContext::sync_function,
+                             this);
+    mWaitingForSyncCallback = true;
+    wl_display_sync(mGlxIntegration->waylandDisplay()->wl_display(),0);
+    mGlxIntegration->waylandDisplay()->flushRequests();
+    while (mWaitingForSyncCallback) {
+        mGlxIntegration->waylandDisplay()->readEvents();
+    }
 }
 
 void QWaylandXCompositeGLXContext::geometryChanged()
@@ -132,11 +146,5 @@ void QWaylandXCompositeGLXContext::geometryChanged()
                                            size,
                                            mGlxIntegration->waylandDisplay()->argbVisual());
     mWindow->attach(mBuffer);
-    wl_display_sync_callback(mGlxIntegration->waylandDisplay()->wl_display(),
-                             QWaylandXCompositeGLXContext::sync_function,
-                             this);
-    QMutex lock;
-    lock.lock();
-    wl_display_sync(mGlxIntegration->waylandDisplay()->wl_display(),0);
-    mWaitCondition.wait(&lock);
+    waitForSync();
 }
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
index b45ec3f..eb2e5a5 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
@@ -78,7 +78,8 @@ private:
     GLXContext mContext;
 
     static void sync_function(void *data);
-    QWaitCondition mWaitCondition;
+    void waitForSync();
+    bool mWaitingForSyncCallback;
 };
 
 #endif // QWAYLANDXCOMPOSITEGLXCONTEXT_H
-- 
cgit v0.12


From 1ce473ee7e2f76e0e670ed645881282288e5ab29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 11 Apr 2011 13:38:53 +0200
Subject: Wayland: Tell what backend we use for xcomposite glx

---
 .../gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
index da92bc8..2b123cc 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
@@ -56,6 +56,7 @@ QWaylandXCompositeGLXIntegration::QWaylandXCompositeGLXIntegration(QWaylandDispl
     : QWaylandGLIntegration()
     , mWaylandDisplay(waylandDispaly)
 {
+    qDebug() << "Wayland XComposite GLX Integration";
     wl_display_add_global_listener(waylandDispaly->wl_display(), QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal,
                                    this);
 }
@@ -118,7 +119,6 @@ void QWaylandXCompositeGLXIntegration::rootInformation(void *data, wl_xcomposite
     Q_UNUSED(xcomposite);
     QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
 
-    qDebug() << "ROOT INFORMATION" << integration->mDisplay << integration->mRootWindow << integration->mScreen;
     integration->mDisplay = XOpenDisplay(display_name);
     integration->mRootWindow = (Window) root_window;
     integration->mScreen = XDefaultScreen(integration->mDisplay);
-- 
cgit v0.12


From fb297b316b1acfda133ce6d5b46c89eaf8475199 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Mon, 11 Apr 2011 13:53:38 +0200
Subject: Wayland: Show what backend is being used

---
 .../gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp      | 2 +-
 .../gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp      | 2 +-
 .../gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp  | 1 +
 .../gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp  | 2 +-
 4 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
index 9347691..20f7ffb 100644
--- a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
@@ -49,7 +49,7 @@ QWaylandReadbackEglIntegration::QWaylandReadbackEglIntegration(QWaylandDisplay *
     : QWaylandGLIntegration()
     , mWaylandDisplay(display)
 {
-    qDebug() << "Using Wayland Readback-EGL";
+    qDebug() << "Using Readback-EGL";
     char *display_name = getenv("DISPLAY");
     mDisplay = XOpenDisplay(display_name);
     mScreen = XDefaultScreen(mDisplay);
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
index 7e2a74d..4651f0c 100644
--- a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
@@ -49,7 +49,7 @@ QWaylandReadbackGlxIntegration::QWaylandReadbackGlxIntegration(QWaylandDisplay *
     : QWaylandGLIntegration()
     , mWaylandDisplay(waylandDispaly)
 {
-    qDebug() << "Using Wayland Readback-GLX";
+    qDebug() << "Using Readback-GLX";
     char *display_name = getenv("DISPLAY");
     mDisplay = XOpenDisplay(display_name);
     mScreen = XDefaultScreen(mDisplay);
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
index 352e651..95b4112 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
@@ -56,6 +56,7 @@ QWaylandXCompositeEGLIntegration::QWaylandXCompositeEGLIntegration(QWaylandDispl
     : QWaylandGLIntegration()
     , mWaylandDisplay(waylandDispaly)
 {
+    qDebug() << "Using XComposite-EGL";
     wl_display_add_global_listener(mWaylandDisplay->wl_display(), QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal,
                                    this);
 }
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
index 2b123cc..43c0135 100644
--- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
@@ -56,7 +56,7 @@ QWaylandXCompositeGLXIntegration::QWaylandXCompositeGLXIntegration(QWaylandDispl
     : QWaylandGLIntegration()
     , mWaylandDisplay(waylandDispaly)
 {
-    qDebug() << "Wayland XComposite GLX Integration";
+    qDebug() << "Using XComposite-GLX";
     wl_display_add_global_listener(waylandDispaly->wl_display(), QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal,
                                    this);
 }
-- 
cgit v0.12


From 0108e888480e47e65d82d94e10a7c7c910e42d79 Mon Sep 17 00:00:00 2001
From: Paul Olav Tvete <paul.tvete@nokia.com>
Date: Mon, 11 Apr 2011 14:48:47 +0200
Subject: Make readEvents() non-blocking

Another event handler could empty the Wayland socket after the
socket notifier has triggered, but before the signal is delivered.
Since wl_display_iterate is blocking, we have to test whether there
is data available to avoid freezing the whole application.

Reviewed-by: Samuel
---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 26 ++++++++++++++++++++++-
 src/plugins/platforms/wayland/qwaylanddisplay.h   |  1 +
 src/plugins/platforms/wayland/qwaylandwindow.cpp  |  2 +-
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index a6fdd46..eb9e791 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -176,6 +176,30 @@ void QWaylandDisplay::flushRequests()
 
 void QWaylandDisplay::readEvents()
 {
+// verify that there is still data on the socket
+    fd_set fds;
+    FD_ZERO(&fds);
+    FD_SET(mFd, &fds);
+    fd_set nds;
+    FD_ZERO(&nds);
+    fd_set rs = fds;
+    fd_set ws = nds;
+    fd_set es = nds;
+    timeval timeout;
+    timeout.tv_sec = 0;
+    timeout.tv_usec = 0;
+    int ret = ::select(mFd+1, &rs, &ws, &es, &timeout );
+
+    if (ret <= 0) {
+        //qDebug("QWaylandDisplay::readEvents() No data... blocking avoided");
+        return;
+    }
+
+    wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
+}
+
+void QWaylandDisplay::blockingReadEvents()
+{
     wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
 }
 
@@ -208,7 +232,7 @@ void QWaylandDisplay::waitForScreens()
 {
     flushRequests();
     while (mScreens.isEmpty())
-        readEvents();
+        blockingReadEvents();
 }
 
 void QWaylandDisplay::displayHandleGlobal(struct wl_display *display,
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index e02767d..3ddbfb2 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -86,6 +86,7 @@ public:
 public slots:
     void createNewScreen(struct wl_output *output, QRect geometry);
     void readEvents();
+    void blockingReadEvents();
     void flushRequests();
 
 private:
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index d58b39d..7e94fb9 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -154,5 +154,5 @@ void QWaylandWindow::waitForFrameSync()
 {
     mDisplay->flushRequests();
     while (mWaitingForFrameSync)
-        mDisplay->readEvents();
+        mDisplay->blockingReadEvents();
 }
-- 
cgit v0.12


From 6ec7695eaa02c923b90d72e3918b9ab50da63e41 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Fri, 8 Apr 2011 14:20:17 +1000
Subject: ListModel::clear() should not clear roles

Clearing a model and then appending a new object with a subset of the
previous roles was causing a crash since ListModel cleared the roles
and VisualDataModel did not, so VisualDataModel was requesting invalid
roles. This could have been fixed by clearing the meta object and
its property cache in in VisualDataModel but this is less efficient,
and also the general use case is for model data to always have the same
roles.

Task-number: QTBUG-18587
Change-Id: Ib11d2292888ab7a41e772b1e11700cd665e94ae7
Reviewed-by: Michael Brasser
---
 src/declarative/util/qdeclarativelistmodel.cpp     |  3 --
 .../tst_qdeclarativelistmodel.cpp                  | 42 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp
index 9332de4..1d03842 100644
--- a/src/declarative/util/qdeclarativelistmodel.cpp
+++ b/src/declarative/util/qdeclarativelistmodel.cpp
@@ -1301,9 +1301,6 @@ int NestedListModel::count() const
 
 void NestedListModel::clear()
 {
-    _rolesOk = false;
-    roleStrings.clear();
-
     if (_root)
         _root->clear();
 }
diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
index 45072f3..2f7513f 100644
--- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
@@ -106,6 +106,7 @@ private slots:
     void property_changes_data();
     void property_changes_worker();
     void property_changes_worker_data();
+    void clear();
 };
 int tst_qdeclarativelistmodel::roleFromName(const QDeclarativeListModel *model, const QString &roleName)
 {
@@ -1091,6 +1092,47 @@ void tst_qdeclarativelistmodel::property_changes_worker_data()
     property_changes_data();
 }
 
+void tst_qdeclarativelistmodel::clear()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeListModel model;
+    QDeclarativeEngine::setContextForObject(&model, engine.rootContext());
+    engine.rootContext()->setContextObject(&model);
+
+    QScriptEngine *seng = QDeclarativeEnginePrivate::getScriptEngine(&engine);
+    QScriptValue sv = seng->newObject();
+    QVariant result;
+
+    model.clear();
+    QCOMPARE(model.count(), 0);
+
+    sv.setProperty("propertyA", "value a");
+    sv.setProperty("propertyB", "value b");
+    model.append(sv);
+    QCOMPARE(model.count(), 1);
+
+    model.clear();
+    QCOMPARE(model.count(), 0);
+
+    model.append(sv);
+    model.append(sv);
+    QCOMPARE(model.count(), 2);
+
+    model.clear();
+    QCOMPARE(model.count(), 0);
+
+    // clearing does not remove the roles
+    sv.setProperty("propertyC", "value c");
+    model.append(sv);
+    QList<int> roles = model.roles();
+    model.clear();
+    QCOMPARE(model.count(), 0);
+    QCOMPARE(model.roles(), roles);
+    QCOMPARE(model.toString(roles[0]), QString("propertyA"));
+    QCOMPARE(model.toString(roles[1]), QString("propertyB"));
+    QCOMPARE(model.toString(roles[2]), QString("propertyC"));
+}
+
 QTEST_MAIN(tst_qdeclarativelistmodel)
 
 #include "tst_qdeclarativelistmodel.moc"
-- 
cgit v0.12


From f2219ce983098fc14655d8f3bb8a7fee2c9abe4d Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Tue, 5 Apr 2011 16:55:18 +1000
Subject: Allow enum values to be used as signal parameters

The fix does not work for enums declared outside of the class that
emits the signal, since in this case it is not possible to access
the metaobject of the class that declared the enum. However the
fix makes a special case for the Qt namespace to allow enums in this
namespace to be used.

Task-number: QTBUG-15983
Change-Id: I6f72255b07010311a20fe068bd97c7db7b294d9b
Reviewed-by: Aaron Kennedy
---
 doc/src/declarative/qtbinding.qdoc                 | 19 +++++++++
 .../declarative/qtbinding/enums/standalone.qml     | 15 +++++++
 src/declarative/qml/qdeclarativeboundsignal.cpp    | 28 ++++++++++++-
 .../data/signalAssignment.2.qml                    |  2 +-
 .../data/signalParameterTypes.qml                  |  8 ++--
 .../qdeclarativeecmascript/testtypes.cpp           |  2 +
 .../declarative/qdeclarativeecmascript/testtypes.h |  2 +-
 .../tst_qdeclarativeecmascript.cpp                 | 46 +++++++++++-----------
 8 files changed, 94 insertions(+), 28 deletions(-)

diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc
index 03290aa..4b380a4 100644
--- a/doc/src/declarative/qtbinding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -365,6 +365,10 @@ instead to create the signal handler:
 \o \snippet doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml 0
 \endtable
 
+C++ signals can use enum values as parameters provided that the enum is declared in the
+class that is emitting the signal, and that the enum is registered using Q_ENUMS.
+See \l {Using enumerations of a custom type} below for details.
+
 
 \section2 Modifying properties
 
@@ -499,6 +503,21 @@ See the \l {Tutorial: Writing QML extensions with C++}{Writing QML extensions wi
 the \l {Extending QML in C++} reference documentation for more information.
 
 
+\section2 Using enumeration values as signal parameters
+
+C++ signals may pass enumeration values as signal parameters to QML, providing that the enumeration
+and the signal are declared within the same class, or that the enumeration value is one of those declared
+in the \l {Qt}{Qt Namespace}.
+
+Additionally, if a C++ signal with an enum parameter should be connectable to a QML function using the
+\l {Connecting signals to methods and other signals}{connect()} function, the enum type must be
+registered using qRegisterMetaType().
+
+For QML signals, enum values may be used as signal parameters using the \c int type:
+
+\snippet doc/src/snippets/declarative/qtbinding/enums/standalone.qml 1
+
+
 \section2 Automatic type conversion from strings
 
 As a convenience, some basic types can be specified in QML using format strings to make it easier to
diff --git a/doc/src/snippets/declarative/qtbinding/enums/standalone.qml b/doc/src/snippets/declarative/qtbinding/enums/standalone.qml
index 5721870..74e2c9c 100644
--- a/doc/src/snippets/declarative/qtbinding/enums/standalone.qml
+++ b/doc/src/snippets/declarative/qtbinding/enums/standalone.qml
@@ -38,6 +38,9 @@
 **
 ****************************************************************************/
 import MyLibrary 1.0
+import QtQuick 1.0
+
+Item {
 
 //![0]
 ImageViewer {
@@ -47,3 +50,15 @@ ImageViewer {
     }
 }
 //![0]
+
+//![1]
+ImageViewer {
+    signal someOtherSignal(int statusValue)
+
+    Component.onCompleted: {
+        someOtherSignal(ImageViewer.Loading)
+    }
+}
+//![1]
+
+}
diff --git a/src/declarative/qml/qdeclarativeboundsignal.cpp b/src/declarative/qml/qdeclarativeboundsignal.cpp
index 28dfea9..47a15cb 100644
--- a/src/declarative/qml/qdeclarativeboundsignal.cpp
+++ b/src/declarative/qml/qdeclarativeboundsignal.cpp
@@ -225,9 +225,35 @@ QDeclarativeBoundSignalParameters::QDeclarativeBoundSignalParameters(const QMeta
             QMetaPropertyBuilder prop = mob.addProperty(name, "QObject*");
             prop.setWritable(false);
         } else {
+            QByteArray propType = type;
+            if (t >= QVariant::UserType || t == QVariant::Invalid) {
+                //copy of QDeclarativeObjectScriptClass::enumType()
+                QByteArray scope;
+                QByteArray name;
+                int scopeIdx = propType.lastIndexOf("::");
+                if (scopeIdx != -1) {
+                    scope = propType.left(scopeIdx);
+                    name = propType.mid(scopeIdx + 2);
+                } else {
+                    name = propType;
+                }
+                const QMetaObject *meta;
+                if (scope == "Qt")
+                    meta = &QObject::staticQtMetaObject;
+                else
+                    meta = parent->parent()->metaObject();   //### assumes parent->parent()
+                for (int i = meta->enumeratorCount() - 1; i >= 0; --i) {
+                    QMetaEnum m = meta->enumerator(i);
+                    if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope))) {
+                        t = QVariant::Int;
+                        propType = "int";
+                        break;
+                    }
+                }
+            }
             if (QDeclarativeMetaType::canCopy(t)) {
                 types[ii] = t;
-                QMetaPropertyBuilder prop = mob.addProperty(name, type);
+                QMetaPropertyBuilder prop = mob.addProperty(name, propType);
                 prop.setWritable(false);
             } else {
                 types[ii] = 0x80000000 | t;
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml
index 8addcb9..6467c42 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml
@@ -1,5 +1,5 @@
 import Qt.test 1.0
 
 MyQmlObject { 
-    onArgumentSignal: setString('pass ' + a + ' ' + b + ' ' + c) 
+    onArgumentSignal: setString('pass ' + a + ' ' + b + ' ' + c + ' ' + d + ' ' + e)
 }
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml
index ffbe317..4fc2dab 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml
@@ -7,10 +7,12 @@ MyQmlObject
     property real realProperty
     property color colorProperty
     property variant variantProperty
+    property int enumProperty
+    property int qtEnumProperty
 
-    signal mySignal(int a, real b, color c, variant d)
+    signal mySignal(int a, real b, color c, variant d, int e, int f)
 
-    onMySignal: { intProperty = a; realProperty = b; colorProperty = c; variantProperty = d; }
+    onMySignal: { intProperty = a; realProperty = b; colorProperty = c; variantProperty = d; enumProperty = e; qtEnumProperty = f; }
 
-    onBasicSignal: root.mySignal(10, 19.2, Qt.rgba(1, 1, 0, 1), Qt.rgba(1, 0, 1, 1))
+    onBasicSignal: root.mySignal(10, 19.2, Qt.rgba(1, 1, 0, 1), Qt.rgba(1, 0, 1, 1), MyQmlObject.EnumValue3, Qt.LeftButton)
 }
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
index 7e63bd5..1d65b15 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp
@@ -127,6 +127,8 @@ void registerTypes()
     qmlRegisterType<QPlainTextEdit>("Qt.test",1,0,"QPlainTextEdit");
 
     qRegisterMetaType<MyQmlObject::MyType>("MyQmlObject::MyType");
+    qRegisterMetaType<MyQmlObject::MyType>("MyEnum2");
+    qRegisterMetaType<Qt::MouseButtons>("Qt::MouseButtons");
 }
 
 #include "testtypes.moc"
diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
index 081cc4c..94cec3f 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
@@ -159,7 +159,7 @@ public:
     
 signals:
     void basicSignal();
-    void argumentSignal(int a, QString b, qreal c);
+    void argumentSignal(int a, QString b, qreal c, MyEnum2 d, Qt::MouseButtons e);
     void stringChanged();
     void objectChanged();
     void anotherBasicSignal();
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 48466d5..7876671 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -304,8 +304,8 @@ void tst_qdeclarativeecmascript::signalAssignment()
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->string(), QString());
-        emit object->argumentSignal(19, "Hello world!", 10.25);
-        QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25"));
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
+        QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2"));
     }
 }
 
@@ -870,7 +870,7 @@ void tst_qdeclarativeecmascript::scope()
         QCOMPARE(object->property("test").toInt(), 0);
         QCOMPARE(object->property("test2").toString(), QString());
 
-        emit object->argumentSignal(13, "Argument Scope", 9);
+        emit object->argumentSignal(13, "Argument Scope", 9, MyQmlObject::EnumValue4, Qt::RightButton);
 
         QCOMPARE(object->property("test").toInt(), 13);
         QCOMPARE(object->property("test2").toString(), QString("Argument Scope"));
@@ -895,6 +895,8 @@ void tst_qdeclarativeecmascript::signalParameterTypes()
     QCOMPARE(object->property("realProperty").toReal(), 19.2);
     QVERIFY(object->property("colorProperty").value<QColor>() == QColor(255, 255, 0, 255));
     QVERIFY(object->property("variantProperty") == QVariant::fromValue(QColor(255, 0, 255, 255)));
+    QVERIFY(object->property("enumProperty") == MyQmlObject::EnumValue3);
+    QVERIFY(object->property("qtEnumProperty") == Qt::LeftButton);
 }
 
 /*
@@ -1139,7 +1141,7 @@ void tst_qdeclarativeecmascript::signalTriggeredBindings()
     QCOMPARE(object->property("test1").toReal(), 200.);
     QCOMPARE(object->property("test2").toReal(), 200.);
 
-    object->argumentSignal(10, QString(), 10);
+    object->argumentSignal(10, QString(), 10, MyQmlObject::EnumValue4, Qt::RightButton);
 
     QCOMPARE(object->property("base").toReal(), 400.);
     QCOMPARE(object->property("test1").toReal(), 400.);
@@ -1940,7 +1942,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toBool(), false);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toBool(), true);
 
         delete object;
@@ -1953,7 +1955,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toBool(), false);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toBool(), true);
 
         delete object;
@@ -1966,7 +1968,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toBool(), false);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toBool(), true);
 
         delete object;
@@ -1979,7 +1981,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->methodCalled(), false);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->methodCalled(), true);
 
         delete object;
@@ -1992,7 +1994,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->methodCalled(), false);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->methodCalled(), true);
 
         delete object;
@@ -2005,7 +2007,7 @@ void tst_qdeclarativeecmascript::scriptConnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toInt(), 0);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
 
         delete object;
@@ -2021,13 +2023,13 @@ void tst_qdeclarativeecmascript::scriptDisconnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toInt(), 0);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 1);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
         emit object->basicSignal();
         QCOMPARE(object->property("test").toInt(), 2);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
 
         delete object;
@@ -2040,13 +2042,13 @@ void tst_qdeclarativeecmascript::scriptDisconnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toInt(), 0);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 1);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
         emit object->basicSignal();
         QCOMPARE(object->property("test").toInt(), 2);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
 
         delete object;
@@ -2059,13 +2061,13 @@ void tst_qdeclarativeecmascript::scriptDisconnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toInt(), 0);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 1);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
         emit object->basicSignal();
         QCOMPARE(object->property("test").toInt(), 2);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 3);
 
         delete object;
@@ -2077,13 +2079,13 @@ void tst_qdeclarativeecmascript::scriptDisconnect()
         QVERIFY(object != 0);
 
         QCOMPARE(object->property("test").toInt(), 0);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 1);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 2);
         emit object->basicSignal();
         QCOMPARE(object->property("test").toInt(), 2);
-        emit object->argumentSignal(19, "Hello world!", 10.25);
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
         QCOMPARE(object->property("test").toInt(), 3);
 
         delete object;
-- 
cgit v0.12


From 2cafc79ff4b4521a594031cd1db0229aa594f84e Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Tue, 12 Apr 2011 12:51:22 +0200
Subject: Revert "HTTP caching internals: fix logic for PreferNetwork and
 PreferCache"

This reverts commit e5d27e7aeac984e46f3aa8de20160cc00fc63155.

Conflicts:

	tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
---
 src/network/access/qnetworkaccesshttpbackend.cpp   |  7 +----
 .../tst_qabstractnetworkcache.cpp                  | 33 +++++++++-------------
 2 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index b0ca9e0..9de5d84 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -263,11 +263,6 @@ bool QNetworkAccessHttpBackend::loadFromCacheIfAllowed(QHttpNetworkRequest &http
         httpRequest.setHeaderField("If-Modified-Since", QNetworkHeadersPrivate::toHttpDate(lastModified));
 
     if (CacheLoadControlAttribute == QNetworkRequest::PreferNetwork) {
-        // PreferNetwork == send request with "If-None-Match" and "If-Modified-Since" header,
-        // which will return a 304 Not Modifed if resource has not been changed.
-        // We might read from cache later, if receiving a 304.
-        return false;
-    } else if (CacheLoadControlAttribute == QNetworkRequest::PreferCache) {
         it = cacheHeaders.findRawHeader("Cache-Control");
         if (it != cacheHeaders.rawHeaders.constEnd()) {
             QHash<QByteArray, QByteArray> cacheControl = parseHttpOptionHeader(it->second);
@@ -1156,7 +1151,7 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo
         attributes.insert(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
         attributes.insert(QNetworkRequest::HttpReasonPhraseAttribute, reasonPhrase);
     } else {
-        // this is the server telling us the resource has not changed, keep the attributes intact
+        // this is a redirection, keep the attributes intact
         attributes = oldMetaData.attributes();
     }
     metaData.setAttributes(attributes);
diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index 4a66d4d..da57d1b 100644
--- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -156,19 +156,16 @@ void tst_QAbstractNetworkCache::expires_data() // Server sending Expires header,
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
-    // httpcachetest_expires304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << false; // neither Last-Modified nor ETag given
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true; // we know the expiration date, so we can read from cache
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_expires304.cgi" << true;
 
-    // httpcachetest_expires500.cgi will send a 500 upon receiving a If-Modified-Since header
     QTest::newRow("500-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires500.cgi" << AlwaysFalse;
-    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << false; // neither Last-Modified nor ETag given
+    QTest::newRow("500-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires500.cgi" << true;
     QTest::newRow("500-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires500.cgi" << AlwaysTrue;
-    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true; // we know the expiration date, so we can read from cache
+    QTest::newRow("500-3") << QNetworkRequest::PreferCache << "httpcachetest_expires500.cgi" << true;
 
-    // httpcachetest_expires200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_expires200.cgi" << AlwaysFalse;
     QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_expires200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_expires200.cgi" << AlwaysTrue;
@@ -196,17 +193,15 @@ void tst_QAbstractNetworkCache::lastModified_data()
     QTest::addColumn<QString>("url");
     QTest::addColumn<bool>("fetchFromCache");
 
-    // httpcachetest_lastModified304.cgi will send a 304 upon receiving a If-Modified-Since header
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true; // we know the last modified date, so we can send If-Modified-Since and get 304, then we can read from cache
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified304.cgi" << true;
 
-    // httpcachetest_lastModified200.cgi will always send a 200 header
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_lastModified200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_lastModified200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_lastModified200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false; // we won't get a 304 (although sending If-Modified-Since), so we cannot read from cache
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_lastModified200.cgi" << false;
 }
 
 void tst_QAbstractNetworkCache::lastModified()
@@ -231,14 +226,14 @@ void tst_QAbstractNetworkCache::etag_data()
     QTest::addColumn<bool>("fetchFromCache");
 
     QTest::newRow("304-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag304.cgi" << AlwaysFalse;
-    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true; // we will send If-None-Match and get 304
+    QTest::newRow("304-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag304.cgi" << true;
     QTest::newRow("304-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag304.cgi" << AlwaysTrue;
-    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true; // we don't have expiration information, but will get 304, as with PreferNetwork
+    QTest::newRow("304-3") << QNetworkRequest::PreferCache << "httpcachetest_etag304.cgi" << true;
 
     QTest::newRow("200-0") << QNetworkRequest::AlwaysNetwork << "httpcachetest_etag200.cgi" << AlwaysFalse;
-    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false; // we will send If-None-Match and get 200
+    QTest::newRow("200-1") << QNetworkRequest::PreferNetwork << "httpcachetest_etag200.cgi" << false;
     QTest::newRow("200-2") << QNetworkRequest::AlwaysCache << "httpcachetest_etag200.cgi" << AlwaysTrue;
-    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false; // we don't have expiration information, and will get 200, as with PreferNetwork
+    QTest::newRow("200-3") << QNetworkRequest::PreferCache << "httpcachetest_etag200.cgi" << false;
 }
 
 void tst_QAbstractNetworkCache::etag()
@@ -278,8 +273,8 @@ void tst_QAbstractNetworkCache::cacheControl_data()
 
     // see QTBUG-7060
     //QTest::newRow("nokia-boston") << QNetworkRequest::PreferNetwork << "http://waplabdc.nokia-boston.com/browser/users/venkat/cache/Cache_directives/private_1b.asp" << true;
-    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << false; // script always returns 200, so we cannot load from cache
-    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true; // we got expiry information
+    QTest::newRow("304-2b") << QNetworkRequest::PreferNetwork << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
+    QTest::newRow("304-4b") << QNetworkRequest::PreferCache << "httpcachetest_cachecontrol200.cgi?private, max-age=1000" << true;
 }
 
 void tst_QAbstractNetworkCache::cacheControl()
-- 
cgit v0.12


From 61e7617f4afdd5cc1956de9ee2c7172ba95956d0 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 12 Apr 2011 12:14:15 +0100
Subject: Fix regression with Qt::AutoConnection

Change df9491b302f6404ad2ccc6dc2eb3377176d994c6 optimised auto connections
by comparing thread ID rather than comparing TLS addresses.
However it was implemented on a branch that didn't have the native
symbian threads. So merging the two branches caused a regression without
merge conflicts.

Reviewed-by: mread
---
 src/corelib/thread/qthread_symbian.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/corelib/thread/qthread_symbian.cpp b/src/corelib/thread/qthread_symbian.cpp
index 1474b36..15e6898 100644
--- a/src/corelib/thread/qthread_symbian.cpp
+++ b/src/corelib/thread/qthread_symbian.cpp
@@ -113,6 +113,7 @@ QThreadData *QThreadData::current()
             }
             data->deref();
         }
+        data->threadId = QThread::currentThreadId();
         if (!QCoreApplicationPrivate::theMainThread)
             QCoreApplicationPrivate::theMainThread = data->thread;
     }
@@ -312,6 +313,7 @@ void *QThreadPrivate::start(void *arg)
     // attribute of the thread again once the app gains control in run()
     User::SetCritical(User::EProcessCritical);
 
+    data->threadId = QThread::currentThreadId();
     set_thread_data(data);
 
     {
-- 
cgit v0.12


From 46163663e956b988719563eae18773a2dedd424e Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Tue, 12 Apr 2011 14:48:13 +0200
Subject: Added support for libICU for collation and toLower/toUpper.

This patch uses icu to do string collation via QString::localeAwareCompare
function and for QString::toLower/toUpper - which is important e.g. for turkish
locales where uppercased 'i' is not a latin 'I'.

Based on the patch by Harald Fernengel

Reviewed-by: Harald Fernengel
Reviewed-by: Zeno Albisser
---
 config.tests/unix/icu/icu.cpp      |  54 +++++++++
 config.tests/unix/icu/icu.pro      |   4 +
 configure                          |  34 +++++-
 src/corelib/tools/qlocale.cpp      |  14 +++
 src/corelib/tools/qlocale_icu.cpp  | 224 +++++++++++++++++++++++++++++++++++++
 src/corelib/tools/qstring.cpp      |  35 +++++-
 src/corelib/tools/tools.pri        |   5 +
 tests/auto/qstring/qstring.pro     |   2 +
 tests/auto/qstring/tst_qstring.cpp |  55 +++++++++
 9 files changed, 425 insertions(+), 2 deletions(-)
 create mode 100644 config.tests/unix/icu/icu.cpp
 create mode 100644 config.tests/unix/icu/icu.pro
 create mode 100644 src/corelib/tools/qlocale_icu.cpp

diff --git a/config.tests/unix/icu/icu.cpp b/config.tests/unix/icu/icu.cpp
new file mode 100644
index 0000000..f03b160
--- /dev/null
+++ b/config.tests/unix/icu/icu.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <unicode/utypes.h>
+#include <unicode/ucol.h>
+#include <unicode/ustring.h>
+
+int main(int, char **)
+{
+    UErrorCode status = U_ZERO_ERROR;
+    UCollator *collator = ucol_open("ru_RU", &status);
+    if (U_FAILURE(status))
+        return 0;
+    ucol_close(collator);
+    return 0;
+}
diff --git a/config.tests/unix/icu/icu.pro b/config.tests/unix/icu/icu.pro
new file mode 100644
index 0000000..8e58334
--- /dev/null
+++ b/config.tests/unix/icu/icu.pro
@@ -0,0 +1,4 @@
+SOURCES = icu.cpp
+CONFIG -= qt dylib app_bundle
+unix:LIBS += -licuuc -licui18n
+win32:LIBS += -licuin
diff --git a/configure b/configure
index 4d25ec2..bf67205 100755
--- a/configure
+++ b/configure
@@ -832,6 +832,7 @@ CFG_PULSEAUDIO=auto
 CFG_COREWLAN=auto
 CFG_ICD=auto
 CFG_NOPROCESS=no
+CFG_ICU=auto
 
 # initalize variables used for installation
 QT_INSTALL_PREFIX=
@@ -1040,7 +1041,7 @@ while [ "$#" -gt 0 ]; do
         VAL=no
         ;;
     #Qt style yes options
-    -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-declarative-debug|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles)
+    -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-declarative-debug|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles|-icu)
         VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
         VAL=yes
         ;;
@@ -2376,6 +2377,13 @@ while [ "$#" -gt 0 ]; do
           QT_CFLAGS_FPU=$VAL
        fi
        ;;
+    icu)
+        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+            CFG_ICU="$VAL"
+        else
+            UNKNOWN_OPT=yes
+        fi
+        ;;
     *)
         UNKNOWN_OPT=yes
         ;;
@@ -5679,6 +5687,25 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "ye
         CFG_ICD=no
     fi
 
+    # auto-detect libicu support
+    if [ "$CFG_ICU" != "no" ]; then
+        if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/icu "ICU" $L_FLAGS $I_FLAGS $l_FLAGS; then
+            [ "$CFG_ICU" = "auto" ] && CFG_ICU=yes
+        else
+            if [ "$CFG_ICU" = "auto" ]; then
+                CFG_ICU=no
+            elif [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+                # CFG_ICU is "yes"
+
+                echo "The ICU library support cannot be enabled."
+                echo " Turn on verbose messaging (-v) to $0 to see the final report."
+                echo " If you believe this message is in error you may use the continue"
+                echo " switch (-continue) to $0 to continue."
+                exit 101
+            fi
+        fi
+    fi
+
     # Auto-detect PulseAudio support
     if [ "$CFG_PULSEAUDIO" != "no" ]; then
         if [ -n "$PKG_CONFIG" ]; then
@@ -7337,6 +7364,10 @@ if [ "$CFG_ICD" = "yes" ]; then
     QT_CONFIG="$QT_CONFIG icd"
 fi
 
+if [ "$CFG_ICU" = "yes" ]; then
+    QT_CONFIG="$QT_CONFIG icu"
+fi
+
 #
 # Some Qt modules are too advanced in C++ for some old compilers
 # Detect here the platforms where they are known to work.
@@ -8727,6 +8758,7 @@ if [ "$PLATFORM_MAC" = "yes" ]; then
     echo "CoreWlan support ....... $CFG_COREWLAN"
 fi
 echo "ICD support ............ $CFG_ICD"
+echo "libICU support ......... $CFG_ICU"
 echo
 
 [ "$CFG_PTMALLOC" != "no" ] && echo "Use ptmalloc ........... $CFG_PTMALLOC"
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index d986b9b..5c4085a 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -86,6 +86,10 @@ static QLocalePrivate *system_lp = 0;
 Q_GLOBAL_STATIC(QLocalePrivate, globalLocalePrivate)
 #endif
 
+#ifdef QT_USE_ICU
+extern bool qt_initIcu(const QString &localeName);
+#endif
+
 /******************************************************************************
 ** Helpers for accessing Qt locale database
 */
@@ -520,6 +524,12 @@ void QLocalePrivate::updateSystemPrivate()
     res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
     if (!res.isNull())
         system_lp->m_plus = res.toString().at(0).unicode();
+
+#ifdef QT_USE_ICU
+    if (!default_lp)
+        qt_initIcu(system_lp->bcp47Name());
+#endif
+
 }
 #endif
 
@@ -879,6 +889,10 @@ void QLocale::setDefault(const QLocale &locale)
 {
     default_lp = locale.d();
     default_number_options = locale.numberOptions();
+
+#ifdef QT_USE_ICU
+    qt_initIcu(locale.bcp47Name());
+#endif
 }
 
 /*!
diff --git a/src/corelib/tools/qlocale_icu.cpp b/src/corelib/tools/qlocale_icu.cpp
new file mode 100644
index 0000000..0e283dd
--- /dev/null
+++ b/src/corelib/tools/qlocale_icu.cpp
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qglobal.h"
+#include "qlibrary.h"
+#include "qdebug.h"
+
+#include "unicode/uversion.h"
+#include "unicode/ucol.h"
+
+QT_BEGIN_NAMESPACE
+
+typedef UCollator *(*Ptr_ucol_open)(const char *loc, UErrorCode *status);
+typedef void (*Ptr_ucol_close)(UCollator *coll);
+typedef UCollationResult (*Ptr_ucol_strcoll)(const UCollator *coll, const UChar *source, int32_t sourceLength, const UChar *target, int32_t targetLength);
+typedef int32_t (*Ptr_u_strToCase)(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode);
+
+static Ptr_ucol_open ptr_ucol_open = 0;
+static Ptr_ucol_strcoll ptr_ucol_strcoll = 0;
+static Ptr_ucol_close ptr_ucol_close = 0;
+static Ptr_u_strToCase ptr_u_strToUpper = 0;
+static Ptr_u_strToCase ptr_u_strToLower = 0;
+
+enum LibLoadStatus
+{
+    ErrorLoading = -1,
+    NotLoaded = 0,
+    Loaded = 1
+};
+
+static LibLoadStatus status = NotLoaded;
+
+static UCollator *icuCollator = 0;
+
+#define STRINGIFY2(x) #x
+#define STRINGIFY(x) STRINGIFY2(x)
+
+bool qt_initIcu(const QString &localeString)
+{
+    if (status == ErrorLoading)
+        return false;
+
+    if (status == NotLoaded) {
+
+        // resolve libicui18n
+        QLibrary lib(QLatin1String("icui18n"), QLatin1String(U_ICU_VERSION_SHORT));
+        if (!lib.load()) {
+            qWarning() << "Unable to load library icui18n" << lib.errorString();
+            status = ErrorLoading;
+            return false;
+        }
+
+        ptr_ucol_open = (Ptr_ucol_open)lib.resolve("ucol_open");
+        ptr_ucol_close = (Ptr_ucol_close)lib.resolve("ucol_close");
+        ptr_ucol_strcoll = (Ptr_ucol_strcoll)lib.resolve("ucol_strcoll");
+
+        if (!ptr_ucol_open || !ptr_ucol_close || !ptr_ucol_strcoll) {
+            // try again with decorated symbol names
+            ptr_ucol_open = (Ptr_ucol_open)lib.resolve("ucol_open" STRINGIFY(U_ICU_VERSION_SUFFIX));
+            ptr_ucol_close = (Ptr_ucol_close)lib.resolve("ucol_close" STRINGIFY(U_ICU_VERSION_SUFFIX));
+            ptr_ucol_strcoll = (Ptr_ucol_strcoll)lib.resolve("ucol_strcoll" STRINGIFY(U_ICU_VERSION_SUFFIX));
+        }
+
+        if (!ptr_ucol_open || !ptr_ucol_close || !ptr_ucol_strcoll) {
+            ptr_ucol_open = 0;
+            ptr_ucol_close = 0;
+            ptr_ucol_strcoll = 0;
+
+            qWarning("Unable to find symbols in icui18n");
+            status = ErrorLoading;
+            return false;
+        }
+
+        // resolve libicuuc
+        QLibrary ucLib(QLatin1String("icuuc"), QLatin1String(U_ICU_VERSION_SHORT));
+        if (!ucLib.load()) {
+            qWarning() << "Unable to load library icuuc" << ucLib.errorString();
+            status = ErrorLoading;
+            return false;
+        }
+
+        ptr_u_strToUpper = (Ptr_u_strToCase)ucLib.resolve("u_strToUpper");
+        ptr_u_strToLower = (Ptr_u_strToCase)ucLib.resolve("u_strToLower");
+
+        if (!ptr_u_strToUpper || !ptr_u_strToLower) {
+            ptr_u_strToUpper = (Ptr_u_strToCase)ucLib.resolve("u_strToUpper" STRINGIFY(U_ICU_VERSION_SUFFIX));
+            ptr_u_strToLower = (Ptr_u_strToCase)ucLib.resolve("u_strToLower" STRINGIFY(U_ICU_VERSION_SUFFIX));
+        }
+
+        if (!ptr_u_strToUpper || !ptr_u_strToLower) {
+            ptr_u_strToUpper = 0;
+            ptr_u_strToLower = 0;
+
+            qWarning("Unable to find symbols in icuuc");
+            status = ErrorLoading;
+            return false;
+        }
+
+        // success :)
+        status = Loaded;
+    }
+
+    if (icuCollator) {
+        ptr_ucol_close(icuCollator);
+        icuCollator = 0;
+    }
+
+    UErrorCode icuStatus = U_ZERO_ERROR;
+    icuCollator = ptr_ucol_open(localeString.toLatin1().constData(), &icuStatus);
+
+    if (!icuCollator) {
+        qWarning("Unable to open locale %s in ICU, error code %d", qPrintable(localeString), icuStatus);
+        return false;
+    }
+
+    return true;
+}
+
+bool qt_ucol_strcoll(const QChar *source, int sourceLength, const QChar *target, int targetLength, int *result)
+{
+    Q_ASSERT(result);
+    Q_ASSERT(source);
+    Q_ASSERT(target);
+
+    if (!icuCollator)
+        return false;
+
+    *result = ptr_ucol_strcoll(icuCollator, reinterpret_cast<const UChar *>(source), int32_t(sourceLength),
+                               reinterpret_cast<const UChar *>(target), int32_t(targetLength));
+
+    return true;
+}
+
+// caseFunc can either be u_strToUpper or u_strToLower
+static bool qt_u_strToCase(const QString &str, QString *out, const QLocale &locale, Ptr_u_strToCase caseFunc)
+{
+    Q_ASSERT(out);
+
+    if (!icuCollator)
+        return false;
+
+    QString result(str.size(), Qt::Uninitialized);
+
+    UErrorCode status = U_ZERO_ERROR;
+
+    int32_t size = caseFunc(reinterpret_cast<UChar *>(result.data()), result.size(),
+            reinterpret_cast<const UChar *>(str.constData()), str.size(),
+            locale.bcp47Name().toLatin1().constData(), &status);
+
+    if (U_FAILURE(status))
+        return false;
+
+    if (size < result.size()) {
+        result.resize(size);
+    } else if (size > result.size()) {
+        // the resulting string is larger than our source string
+        result.resize(size);
+
+        status = U_ZERO_ERROR;
+        size = caseFunc(reinterpret_cast<UChar *>(result.data()), result.size(),
+            reinterpret_cast<const UChar *>(str.constData()), str.size(),
+            locale.bcp47Name().toLatin1().constData(), &status);
+
+        if (U_FAILURE(status))
+            return false;
+
+        // if the sizes don't match now, we give up.
+        if (size != result.size())
+            return false;
+    }
+
+    *out = result;
+    return true;
+}
+
+bool qt_u_strToUpper(const QString &str, QString *out, const QLocale &locale)
+{
+    return qt_u_strToCase(str, out, locale, ptr_u_strToUpper);
+}
+
+bool qt_u_strToLower(const QString &str, QString *out, const QLocale &locale)
+{
+    return qt_u_strToCase(str, out, locale, ptr_u_strToLower);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index b7272ec..5493ba9 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -106,6 +106,14 @@ QTextCodec *QString::codecForCStrings;
 static QHash<void *, QByteArray> *asciiCache = 0;
 #endif
 
+#ifdef QT_USE_ICU
+// qlocale_icu.cpp
+extern bool qt_ucol_strcoll(const QChar *source, int sourceLength, const QChar *target, int targetLength, int *result);
+extern bool qt_u_strToUpper(const QString &str, QString *out, const QLocale &locale);
+extern bool qt_u_strToLower(const QString &str, QString *out, const QLocale &locale);
+#endif
+
+
 // internal
 int qFindString(const QChar *haystack, int haystackLen, int from,
     const QChar *needle, int needleLen, Qt::CaseSensitivity cs);
@@ -431,7 +439,6 @@ const QString::Null QString::null = { };
     \ingroup shared
     \ingroup string-processing
 
-
     QString stores a string of 16-bit \l{QChar}s, where each QChar
     corresponds one Unicode 4.0 character. (Unicode characters
     with code values above 65535 are stored using surrogate pairs,
@@ -4829,6 +4836,14 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1,
     TPtrC p2 = TPtrC16(reinterpret_cast<const TUint16 *>(data2), length2);
     return p1.CompareC(p2);
 #elif defined(Q_OS_UNIX)
+#  if defined(QT_USE_ICU)
+    int res;
+    if (qt_ucol_strcoll(data1, length1, data2, length2, &res)) {
+        if (res == 0)
+            res = ucstrcmp(data1, length1, data2, length2);
+        return res;
+    } // else fall through
+#  endif
     // declared in <string.h>
     int delta = strcoll(toLocal8Bit_helper(data1, length1), toLocal8Bit_helper(data2, length2));
     if (delta == 0)
@@ -4964,6 +4979,15 @@ QString QString::toLower() const
     if (!d->size)
         return *this;
 
+#ifdef QT_USE_ICU
+    {
+        QString result;
+        if (qt_u_strToLower(*this, &result, QLocale()))
+            return result;
+        // else fall through and use Qt's toUpper
+    }
+#endif
+
     const ushort *e = d->data + d->size;
 
     // this avoids one out of bounds check in the loop
@@ -5055,6 +5079,15 @@ QString QString::toUpper() const
     if (!d->size)
         return *this;
 
+#ifdef QT_USE_ICU
+    {
+        QString result;
+        if (qt_u_strToUpper(*this, &result, QLocale()))
+            return result;
+        // else fall through and use Qt's toUpper
+    }
+#endif
+
     const ushort *e = d->data + d->size;
 
     // this avoids one out of bounds check in the loop
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 849dc63..0c2cf16 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -97,6 +97,11 @@ else:SOURCES += tools/qelapsedtimer_generic.cpp
 contains(QT_CONFIG, zlib):include($$PWD/../../3rdparty/zlib.pri)
 else:include($$PWD/../../3rdparty/zlib_dependency.pri)
 
+contains(QT_CONFIG,icu) {
+    SOURCES += tools/qlocale_icu.cpp
+    DEFINES += QT_USE_ICU
+}
+
 DEFINES += HB_EXPORT=Q_CORE_EXPORT
 INCLUDEPATH += ../3rdparty/harfbuzz/src
 HEADERS += ../3rdparty/harfbuzz/src/harfbuzz.h
diff --git a/tests/auto/qstring/qstring.pro b/tests/auto/qstring/qstring.pro
index e980042..1c123ad 100644
--- a/tests/auto/qstring/qstring.pro
+++ b/tests/auto/qstring/qstring.pro
@@ -7,3 +7,5 @@ QT = core
 
 DEFINES += QT_NO_CAST_TO_ASCII
 CONFIG += parallel_test
+
+contains(QT_CONFIG,icu):DEFINES += QT_USE_ICU
diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp
index 25e16fe..3d80e80 100644
--- a/tests/auto/qstring/tst_qstring.cpp
+++ b/tests/auto/qstring/tst_qstring.cpp
@@ -222,6 +222,8 @@ private slots:
     void task262677remove();
     void QTBUG10404_compareRef();
     void QTBUG9281_arg_locale();
+
+    void toUpperLower_icu();
 };
 
 typedef QList<int> IntList;
@@ -1603,6 +1605,11 @@ void tst_QString::toUpper()
     QCOMPARE( lower.toUpper(), upper);
 
 
+#ifdef QT_USE_ICU
+    // test doesn't work with ICU support, since QChar is unaware of any locale
+    QEXPECT_FAIL("", "test doesn't work with ICU support, since QChar is unaware of any locale", Continue);
+    QVERIFY(false);
+#else
     for (int i = 0; i < 65536; ++i) {
         QString str(1, QChar(i));
         QString upper = str.toUpper();
@@ -1610,6 +1617,7 @@ void tst_QString::toUpper()
         if (upper.length() == 1)
             QVERIFY(upper == QString(1, QChar(i).toUpper()));
     }
+#endif
 }
 
 void tst_QString::toLower()
@@ -1641,6 +1649,11 @@ void tst_QString::toLower()
     upper += QChar(QChar::lowSurrogate(0x10400));
     QCOMPARE( upper.toLower(), lower);
 
+#ifdef QT_USE_ICU
+    // test doesn't work with ICU support, since QChar is unaware of any locale
+    QEXPECT_FAIL("", "test doesn't work with ICU support, since QChar is unaware of any locale", Continue);
+    QVERIFY(false);
+#else
     for (int i = 0; i < 65536; ++i) {
         QString str(1, QChar(i));
         QString lower = str.toLower();
@@ -1648,6 +1661,7 @@ void tst_QString::toLower()
         if (lower.length() == 1)
             QVERIFY(str.toLower() == QString(1, QChar(i).toLower()));
     }
+#endif
 }
 
 void tst_QString::trimmed()
@@ -4352,6 +4366,8 @@ void tst_QString::localeAwareCompare()
 
 #elif defined (Q_WS_MAC)
     QSKIP("Setting the locale is not supported on OS X (you can set the C locale, but that won't affect CFStringCompare which is used to compare strings)", SkipAll);
+#elif defined(QT_USE_ICU)
+    QLocale::setDefault(QLocale(locale));
 #else
     if (!locale.isEmpty()) {
         const char *newLocale = setlocale(LC_ALL, locale.toLatin1());
@@ -4363,6 +4379,11 @@ void tst_QString::localeAwareCompare()
     }
 #endif
 
+#ifdef QT_USE_ICU
+    // ### for c1, ICU disagrees with libc on how to compare
+    QEXPECT_FAIL("c1", "ICU disagrees with test", Abort);
+#endif
+
     int testres = QString::localeAwareCompare(s1, s2);
     if (result < 0) {
         QVERIFY(testres < 0);
@@ -5065,6 +5086,40 @@ void tst_QString::QTBUG9281_arg_locale()
     QLocale::setDefault(QLocale::C);
 }
 
+void tst_QString::toUpperLower_icu()
+{
+#ifndef QT_USE_ICU
+    QSKIP("Qt was built without ICU support", SkipAll);
+#endif
+
+    QString s = QString::fromLatin1("i");
+
+    QCOMPARE(s.toUpper(), QString::fromLatin1("I"));
+    QCOMPARE(s.toLower(), QString::fromLatin1("i"));
+
+    QLocale::setDefault(QLocale(QLocale::Turkish, QLocale::Turkey));
+
+    // turkish locale has a capital I with a dot (U+0130, utf8 c4b0)
+
+    QCOMPARE(s.toUpper(), QString::fromUtf8("\xc4\xb0"));
+    QCOMPARE(QString::fromUtf8("\xc4\xb0").toLower(), s);
+
+    // nothing should happen here
+    QCOMPARE(s.toLower(), s);
+    QCOMPARE(QString::fromLatin1("I").toUpper(), QString::fromLatin1("I"));
+
+    // U+0131, utf8 c4b1 is the lower-case i without a dot
+    QString sup = QString::fromUtf8("\xc4\xb1");
+
+    QCOMPARE(sup.toUpper(), QString::fromLatin1("I"));
+    QCOMPARE(QString::fromLatin1("I").toLower(), sup);
+
+    // nothing should happen here
+    QCOMPARE(sup.toLower(), sup);
+    QCOMPARE(QString::fromLatin1("i").toLower(), QString::fromLatin1("i"));
+
+    // the cleanup function will restore the default locale
+}
 
 
 QTEST_APPLESS_MAIN(tst_QString)
-- 
cgit v0.12


From 6f1efe75dac53377b92d779818b43a34add92f02 Mon Sep 17 00:00:00 2001
From: mread <qt-info@nokia.com>
Date: Tue, 12 Apr 2011 15:07:11 +0100
Subject: Applying the QTBUG-17986 fix to Symbian

This change takes the QTBUG-17986 fix, which deletes QThreadData for
adopted threads that have created QEventLoops, and applies it to
qthread_symbian.cpp, which didn't exist at the time of the original
fix.

One complication is that Symbian uses a separate thread to monitor
adopted thread lifetime, as there is no API to intercept thread exit
to have cleanup code run within the context of the thread. However the
cleanup for the thread involes deleting active objects that were
created in the adopted thread, not the monitor thread. If these active
objects are completed but not run, their cancellation could deadlock.
In particular the wake up active object in the event dispatcher is
typically in this state. We deal with it by detecting the situation
and re-completing/cancelling the active object in the adopted thread
monitor thread, which prevents deadlock and allows correct operation of
the monitor thread. It is possible for this problem to affect other
active objects owned by the event dispatcher. They symptom would be
that finished signals from adopted threads are not sent, or they arrive
much later than they should.

Task-number: QTBUG-18622
Reviewed-by: Shane Kearns
---
 src/corelib/kernel/qeventdispatcher_symbian.cpp | 10 ++++++++++
 src/corelib/kernel/qeventdispatcher_symbian_p.h |  3 +++
 src/corelib/thread/qthread_symbian.cpp          |  8 ++++++++
 3 files changed, 21 insertions(+)

diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index 79f2596..471028e 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -194,6 +194,7 @@ void QActiveObject::reactivateAndComplete()
 QWakeUpActiveObject::QWakeUpActiveObject(QEventDispatcherSymbian *dispatcher)
     : QActiveObject(WAKE_UP_PRIORITY, dispatcher)
 {
+    m_hostThreadId = RThread().Id();
     CActiveScheduler::Add(this);
     iStatus = KRequestPending;
     SetActive();
@@ -209,6 +210,15 @@ void QWakeUpActiveObject::DoCancel()
     if (iStatus.Int() == KRequestPending) {
         TRequestStatus *status = &iStatus;
         QEventDispatcherSymbian::RequestComplete(status, KErrNone);
+    } else if (IsActive() && m_hostThreadId != RThread().Id()) {
+        // This is being cancelled in the adopted monitor thread, which can happen if an adopted thread with
+        // an event loop has exited. The event loop creates an event dispatcher with this active object, which may be complete but not run on exit.
+        // We force a cancellation in this thread, because a) the object cannot be deleted while active and b) without a cancellation
+        // the thread semaphore will be one count down.
+        // It is possible for this problem to affect other active objects. They symptom would be that finished signals
+        // from adopted threads are not sent, or they arrive much later than they should.
+        TRequestStatus *status = &iStatus;
+        User::RequestComplete(status, KErrNone);
     }
 }
 
diff --git a/src/corelib/kernel/qeventdispatcher_symbian_p.h b/src/corelib/kernel/qeventdispatcher_symbian_p.h
index e07d475..6e04bb1 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian_p.h
+++ b/src/corelib/kernel/qeventdispatcher_symbian_p.h
@@ -110,6 +110,9 @@ public:
 protected:
     void DoCancel();
     void RunL();
+
+private:
+    TThreadId m_hostThreadId;
 };
 
 struct SymbianTimerInfo : public QSharedData
diff --git a/src/corelib/thread/qthread_symbian.cpp b/src/corelib/thread/qthread_symbian.cpp
index 15e6898..5d8b5cb 100644
--- a/src/corelib/thread/qthread_symbian.cpp
+++ b/src/corelib/thread/qthread_symbian.cpp
@@ -113,6 +113,7 @@ QThreadData *QThreadData::current()
             }
             data->deref();
         }
+        data->isAdopted = true;
         data->threadId = QThread::currentThreadId();
         if (!QCoreApplicationPrivate::theMainThread)
             QCoreApplicationPrivate::theMainThread = data->thread;
@@ -257,6 +258,13 @@ QCAddAdoptedThread* QCAddAdoptedThread::adoptedThreadAdder = 0;
 
 void QCAdoptedThreadMonitor::RunL()
 {
+    if (data->isAdopted) {
+        QThread *thread = data->thread;
+        Q_ASSERT(thread);
+        QThreadPrivate *thread_p = static_cast<QThreadPrivate *>(QObjectPrivate::get(thread));
+        Q_ASSERT(!thread_p->finished);
+        thread_p->finish(thread);
+    }
     data->deref();
     QCAddAdoptedThread::threadDied();
     delete this;
-- 
cgit v0.12


From 3ba6c3b7a4261147addc1d7fb06060dae7522691 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 13 Apr 2011 08:49:52 +0200
Subject: Remove DefaultSharedContext from Lighthouse API.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

QPlatformWindowFormat::setUseDefaultSharedContext was meant as a
convenience, but it adds complexity in the platform plugin
implementation, and can be implemented by the above layers using
QPlatformWindowFormat::setSharedContext.

Reviewed-by: Jørgen Lind
---
 src/gui/kernel/qplatformglcontext_qpa.cpp          | 18 ---------
 src/gui/kernel/qplatformglcontext_qpa.h            |  5 +--
 src/gui/kernel/qplatformwindowformat_qpa.cpp       | 13 +-----
 src/gui/kernel/qplatformwindowformat_qpa.h         | 11 +-----
 src/opengl/qwindowsurface_gl.cpp                   | 14 -------
 src/opengl/qwindowsurface_gl_p.h                   |  4 --
 .../eglconvenience/qeglplatformcontext.cpp         |  5 ---
 .../platforms/eglconvenience/qeglplatformcontext.h |  2 -
 src/plugins/platforms/eglfs/qeglfsscreen.cpp       |  1 -
 .../platforms/openkode/qopenkodeintegration.cpp    |  4 +-
 .../platforms/openkode/qopenkodeintegration.h      |  4 ++
 src/plugins/platforms/openkode/qopenkodewindow.cpp | 10 ++---
 .../wayland_egl/qwaylandglcontext.cpp              | 31 +--------------
 .../gl_integration/wayland_egl/qwaylandglcontext.h |  1 -
 src/plugins/platforms/xcb/qglxintegration.cpp      | 46 +---------------------
 src/plugins/platforms/xcb/qglxintegration.h        |  2 -
 src/plugins/platforms/xlib/qglxintegration.cpp     | 44 +--------------------
 src/plugins/platforms/xlib/qglxintegration.h       |  2 -
 18 files changed, 18 insertions(+), 199 deletions(-)

diff --git a/src/gui/kernel/qplatformglcontext_qpa.cpp b/src/gui/kernel/qplatformglcontext_qpa.cpp
index 86740e8..1810532 100644
--- a/src/gui/kernel/qplatformglcontext_qpa.cpp
+++ b/src/gui/kernel/qplatformglcontext_qpa.cpp
@@ -125,24 +125,6 @@ QPlatformGLContext::~QPlatformGLContext()
 
 }
 
-
-/*!
-    Makes it possible to set the context which can be the default for making new contexts.
-*/
-void QPlatformGLContext::setDefaultSharedContext(QPlatformGLContext *sharedContext)
-{
-    QPlatformGLContextPrivate::staticSharedContext = sharedContext;
-}
-
-/*!
-    Default shared context is intended to be a globally awailable pointer to a context which can
-    be used for sharing resources when creating new contexts. Its default value is 0;
-*/
-QPlatformGLContext *QPlatformGLContext::defaultSharedContext()
-{
-    return QPlatformGLContextPrivate::staticSharedContext;
-}
-
 /*!
     Reimplement in subclass to do makeCurrent on native GL context
 */
diff --git a/src/gui/kernel/qplatformglcontext_qpa.h b/src/gui/kernel/qplatformglcontext_qpa.h
index a680c85..28923a9 100644
--- a/src/gui/kernel/qplatformglcontext_qpa.h
+++ b/src/gui/kernel/qplatformglcontext_qpa.h
@@ -69,13 +69,10 @@ public:
     virtual QPlatformWindowFormat platformWindowFormat() const = 0;
 
     const static QPlatformGLContext *currentContext();
-    static QPlatformGLContext *defaultSharedContext();
 
 protected:
-
-    static void setDefaultSharedContext(QPlatformGLContext *sharedContext);
-
     QScopedPointer<QPlatformGLContextPrivate> d_ptr;
+
 private:
     //hack to make it work with QGLContext::CurrentContext
     friend class QGLContext;
diff --git a/src/gui/kernel/qplatformwindowformat_qpa.cpp b/src/gui/kernel/qplatformwindowformat_qpa.cpp
index ddc6239..c165c85 100644
--- a/src/gui/kernel/qplatformwindowformat_qpa.cpp
+++ b/src/gui/kernel/qplatformwindowformat_qpa.cpp
@@ -53,7 +53,7 @@ public:
         , opts(QPlatformWindowFormat::DoubleBuffer | QPlatformWindowFormat::DepthBuffer
              | QPlatformWindowFormat::Rgba | QPlatformWindowFormat::DirectRendering
              | QPlatformWindowFormat::StencilBuffer | QPlatformWindowFormat::DeprecatedFunctions
-             | QPlatformWindowFormat::UseDefaultSharedContext | QPlatformWindowFormat::HasWindowSurface)
+             | QPlatformWindowFormat::HasWindowSurface)
         , depthSize(-1)
         , accumSize(-1)
         , stencilSize(-1)
@@ -525,16 +525,6 @@ void QPlatformWindowFormat::setSampleBuffers(bool enable)
     setOption(enable ? QPlatformWindowFormat::SampleBuffers : QPlatformWindowFormat::NoSampleBuffers);
 }
 
-void QPlatformWindowFormat::setUseDefaultSharedContext(bool enable)
-{
-    if (enable) {
-        setOption(QPlatformWindowFormat::UseDefaultSharedContext);
-        d->sharedContext = 0;
-    } else {
-        setOption(QPlatformWindowFormat::NoDefaultSharedContext);
-    }
-}
-
 /*!
     Returns the number of samples per pixel when multisampling is
     enabled. By default, the highest number of samples that is
@@ -613,7 +603,6 @@ QPlatformWindowFormat::WindowApi QPlatformWindowFormat::windowApi() const
 
 void QPlatformWindowFormat::setSharedContext(QPlatformGLContext *context)
 {
-    setUseDefaultSharedContext(false);
     d->sharedContext = context;
 }
 
diff --git a/src/gui/kernel/qplatformwindowformat_qpa.h b/src/gui/kernel/qplatformwindowformat_qpa.h
index fa01a8a..ba21ba4 100644
--- a/src/gui/kernel/qplatformwindowformat_qpa.h
+++ b/src/gui/kernel/qplatformwindowformat_qpa.h
@@ -66,8 +66,7 @@ public:
         HasOverlay              = 0x0100,
         SampleBuffers           = 0x0200,
         DeprecatedFunctions     = 0x0400,
-        UseDefaultSharedContext = 0x0800,
-        HasWindowSurface        = 0x1000,
+        HasWindowSurface        = 0x0800,
         SingleBuffer            = DoubleBuffer    << 16,
         NoDepthBuffer           = DepthBuffer     << 16,
         ColorIndex              = Rgba            << 16,
@@ -79,7 +78,6 @@ public:
         NoOverlay               = HasOverlay      << 16,
         NoSampleBuffers         = SampleBuffers   << 16,
         NoDeprecatedFunctions   = DeprecatedFunctions << 16,
-        NoDefaultSharedContext  = UseDefaultSharedContext << 16,
         NoWindowSurface         = HasWindowSurface << 16
 
     };
@@ -149,8 +147,6 @@ public:
     void setStereo(bool enable);
     bool directRendering() const;
     void setDirectRendering(bool enable);
-    bool useDefaultSharedContext() const;
-    void setUseDefaultSharedContext(bool enable);
     bool hasWindowSurface() const;
     void setWindowSurface(bool enable);
 
@@ -231,11 +227,6 @@ inline bool QPlatformWindowFormat::sampleBuffers() const
     return testOption(QPlatformWindowFormat::SampleBuffers);
 }
 
-inline bool QPlatformWindowFormat::useDefaultSharedContext() const
-{
-    return testOption(QPlatformWindowFormat::UseDefaultSharedContext);
-}
-
 QT_END_NAMESPACE
 
 QT_END_HEADER
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 681ab69..a6489a6 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -181,7 +181,6 @@ QGLGraphicsSystem::QGLGraphicsSystem(bool useX11GL)
 //
 // QGLWindowSurface
 //
-#ifndef Q_WS_QPA
 class QGLGlobalShareWidget
 {
 public:
@@ -257,22 +256,13 @@ void qt_destroy_gl_share_widget()
 {
     _qt_gl_share_widget()->destroy();
 }
-#endif//Q_WS_QPA
 
 const QGLContext *qt_gl_share_context()
 {
-#ifdef Q_WS_QPA
-    //make it possible to have an assesor to defaultSharedGLContext.
-    const QPlatformGLContext *platformContext = QPlatformGLContext::defaultSharedContext();
-    if (!platformContext)
-        qDebug() << "Please implement a defaultSharedContext for your platformplugin";
-    return QGLContext::fromPlatformGLContext(const_cast<QPlatformGLContext *>(platformContext));
-#else
     QGLWidget *widget = qt_gl_share_widget();
     if (widget)
         return widget->context();
     return 0;
-#endif
 }
 
 #ifdef QGL_USE_TEXTURE_POOL
@@ -405,7 +395,6 @@ QGLWindowSurface::~QGLWindowSurface()
     delete d_ptr->fbo;
     delete d_ptr;
 
-#ifndef Q_WS_QPA
     if (QGLGlobalShareWidget::cleanedUp)
         return;
 
@@ -426,7 +415,6 @@ QGLWindowSurface::~QGLWindowSurface()
             qt_destroy_gl_share_widget();
     }
 #endif // QGL_USE_TEXTURE_POOL
-#endif // Q_WS_QPA
 }
 
 void QGLWindowSurface::deleted(QObject *object)
@@ -476,10 +464,8 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
 
     ctx->create(qt_gl_share_context());
 
-#ifndef Q_WS_QPA
     if (widget != qt_gl_share_widget())
         ++(_qt_gl_share_widget()->widgetRefCount);
-#endif
 
 #ifndef QT_NO_EGL
     static bool checkedForNOKSwapRegion = false;
diff --git a/src/opengl/qwindowsurface_gl_p.h b/src/opengl/qwindowsurface_gl_p.h
index 67f9f41..a8d8381 100644
--- a/src/opengl/qwindowsurface_gl_p.h
+++ b/src/opengl/qwindowsurface_gl_p.h
@@ -66,12 +66,8 @@ class QRegion;
 class QWidget;
 struct QGLWindowSurfacePrivate;
 
-#ifdef Q_WS_QPA
-Q_OPENGL_EXPORT const QGLContext* qt_gl_share_context();
-#else
 Q_OPENGL_EXPORT QGLWidget* qt_gl_share_widget();
 Q_OPENGL_EXPORT void qt_destroy_gl_share_widget();
-#endif
 
 class QGLWindowSurfaceGLPaintDevice : public QGLPaintDevice
 {
diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp
index 9a2bc61..ae5215f 100644
--- a/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp
+++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp
@@ -146,11 +146,6 @@ void* QEGLPlatformContext::getProcAddress(const QString& procName)
     return (void *)eglGetProcAddress(qPrintable(procName));
 }
 
-void QEGLPlatformContext::makeDefaultSharedContext()
-{
-    setDefaultSharedContext(this);
-}
-
 QPlatformWindowFormat QEGLPlatformContext::platformWindowFormat() const
 {
     return m_windowFormat;
diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.h b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h
index d688660..69835d7 100644
--- a/src/plugins/platforms/eglconvenience/qeglplatformcontext.h
+++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h
@@ -56,8 +56,6 @@ public:
     void swapBuffers();
     void* getProcAddress(const QString& procName);
 
-    void makeDefaultSharedContext();
-
     QPlatformWindowFormat platformWindowFormat() const;
 
     EGLContext eglContext() const;
diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
index 2200d1d..b6f2805 100644
--- a/src/plugins/platforms/eglfs/qeglfsscreen.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
@@ -203,7 +203,6 @@ void QEglFSScreen::createAndSetPlatformContext()
     attribList[temp++] = EGL_NONE;
 
     QEGLPlatformContext *platformContext = new QEGLPlatformContext(m_dpy,config,attribList,m_surface,EGL_OPENGL_ES_API);
-    platformContext->makeDefaultSharedContext();
     m_platformContext = platformContext;
 
     EGLint w,h;                    // screen size detection
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.cpp b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
index 35e744be..e98f322 100644
--- a/src/plugins/platforms/openkode/qopenkodeintegration.cpp
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
@@ -122,7 +122,9 @@ QOpenKODEScreen::QOpenKODEScreen(KDDisplayNV *kdDisplay,  KDDesktopNV *kdDesktop
 }
 
 QOpenKODEIntegration::QOpenKODEIntegration()
-    : mEventLoopIntegration(0), mFontDb(new QGenericUnixFontDatabase())
+    : mEventLoopIntegration(0)
+    , mFontDb(new QGenericUnixFontDatabase())
+    , mMainGlContext(0)
 {
     if (kdInitializeNV() == KD_ENOTINITIALIZED) {
         qFatal("Did not manage to initialize openkode");
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.h b/src/plugins/platforms/openkode/qopenkodeintegration.h
index 7582e60..a788091 100644
--- a/src/plugins/platforms/openkode/qopenkodeintegration.h
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.h
@@ -106,10 +106,14 @@ public:
 
     static GLuint blitterProgram();
 
+    void setMainGLContext(QEGLPlatformContext *ctx) { mMainGlContext = ctx; }
+    void mainGLContext() const { return mMainGlContext; }
+
 private:
     QList<QPlatformScreen *> mScreens;
     QOpenKODEEventLoopIntegration *mEventLoopIntegration;
     QPlatformFontDatabase *mFontDb;
+    QEGLPlatformContext *mMainGlContext;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodewindow.cpp b/src/plugins/platforms/openkode/qopenkodewindow.cpp
index 66530a5..d34dff8 100644
--- a/src/plugins/platforms/openkode/qopenkodewindow.cpp
+++ b/src/plugins/platforms/openkode/qopenkodewindow.cpp
@@ -147,9 +147,9 @@ QOpenKODEWindow::QOpenKODEWindow(QWidget *tlw)
     }
 
 
+    QOpenKODEIntegration *integration = static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration());
 
-
-    if (!isFullScreen || (isFullScreen && !QPlatformGLContext::defaultSharedContext())) {
+    if (!isFullScreen || (isFullScreen && !integration->mainGLContext())) {
         if (kdRealizeWindow(m_kdWindow, &m_eglWindow)) {
             qErrnoWarning(kdGetError(), "Could not realize native window");
             return;
@@ -158,9 +158,9 @@ QOpenKODEWindow::QOpenKODEWindow(QWidget *tlw)
         EGLSurface surface = eglCreateWindowSurface(screen->eglDisplay(),m_eglConfig,m_eglWindow,m_eglWindowAttrs.constData());
         m_platformGlContext = new QEGLPlatformContext(screen->eglDisplay(), m_eglConfig,
                                                       m_eglContextAttrs.data(), surface, m_eglApi);
-        m_platformGlContext->makeDefaultSharedContext();
+        integration->setMainGLContext(m_platformGLContext);
     } else {
-        m_platformGlContext = const_cast<QEGLPlatformContext *>(static_cast<const QEGLPlatformContext *>(QPlatformGLContext::defaultSharedContext()));
+        m_platformGlContext = integration->mainGLContext();
         kdDestroyWindow(m_kdWindow);
         m_kdWindow = 0;
     }
@@ -169,7 +169,7 @@ QOpenKODEWindow::QOpenKODEWindow(QWidget *tlw)
 
 QOpenKODEWindow::~QOpenKODEWindow()
 {
-    if (m_platformGlContext != QPlatformGLContext::defaultSharedContext()) {
+    if (m_platformGlContext != static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration())) {
         delete m_platformGlContext;
     }
     if (m_kdWindow)
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
index 89ba12b..d293019 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
@@ -50,8 +50,6 @@
 #include <QtGui/QPlatformWindowFormat>
 #include <QtCore/QMutex>
 
-Q_GLOBAL_STATIC(QMutex,qt_defaultSharedContextMutex)
-
 QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindowFormat &format)
     : QPlatformGLContext()
     , mEglDisplay(eglDisplay)
@@ -60,20 +58,7 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindo
     , mFormat(qt_qPlatformWindowFormatFromConfig(mEglDisplay,mConfig))
 {
     QPlatformGLContext *sharePlatformContext = 0;
-    if (format.useDefaultSharedContext()) {
-        if (!QPlatformGLContext::defaultSharedContext()) {
-            if (qt_defaultSharedContextMutex()->tryLock()){
-                createDefaultSharedContext(eglDisplay);
-                qt_defaultSharedContextMutex()->unlock();
-            } else {
-                qt_defaultSharedContextMutex()->lock(); //wait to the the shared context is created
-                qt_defaultSharedContextMutex()->unlock();
-            }
-        }
-        sharePlatformContext = QPlatformGLContext::defaultSharedContext();
-    } else {
-        sharePlatformContext = format.sharedGLContext();
-    }
+    sharePlatformContext = format.sharedGLContext();
     mFormat.setSharedContext(sharePlatformContext);
     EGLContext shareEGLContext = EGL_NO_CONTEXT;
     if (sharePlatformContext)
@@ -128,20 +113,6 @@ void *QWaylandGLContext::getProcAddress(const QString &string)
     return (void *) eglGetProcAddress(string.toLatin1().data());
 }
 
-void QWaylandGLContext::createDefaultSharedContext(EGLDisplay display)
-{
-    QVector<EGLint> eglContextAttrs;
-    eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
-    eglContextAttrs.append(2);
-    eglContextAttrs.append(EGL_NONE);
-
-    QWaylandGLContext *defaultSharedContext = new QWaylandGLContext;
-    defaultSharedContext->mEglDisplay = display;
-    defaultSharedContext->mContext = eglCreateContext(mEglDisplay,mConfig,
-                                                      EGL_NO_CONTEXT, eglContextAttrs.constData());
-    QPlatformGLContext::setDefaultSharedContext(defaultSharedContext);
-}
-
 void QWaylandGLContext::setEglSurface(EGLSurface surface)
 {
     doneCurrent();
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
index a3befdc..76caffa 100644
--- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
@@ -72,7 +72,6 @@ private:
     EGLConfig mConfig;
     QPlatformWindowFormat mFormat;
 
-    void createDefaultSharedContext(EGLDisplay eglDisplay);
     QWaylandGLContext();
 
 };
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index 19a9503..190221c 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -57,8 +57,6 @@
 #include <dlfcn.h>
 #endif
 
-QMutex QGLXContext::m_defaultSharedContextMutex(QMutex::Recursive);
-
 QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindowFormat &format)
     : QPlatformGLContext()
     , m_screen(screen)
@@ -67,20 +65,7 @@ QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindo
 {
     Q_XCB_NOOP(m_screen->connection());
     const QPlatformGLContext *sharePlatformContext;
-    if (format.useDefaultSharedContext()) {
-        if (!QPlatformGLContext::defaultSharedContext()) {
-            if (m_defaultSharedContextMutex.tryLock()){
-                createDefaultSharedContext(screen);
-                m_defaultSharedContextMutex.unlock();
-            } else {
-                m_defaultSharedContextMutex.lock(); //wait to the the shared context is created
-                m_defaultSharedContextMutex.unlock();
-            }
-        }
-        sharePlatformContext = QPlatformGLContext::defaultSharedContext();
-    } else {
-        sharePlatformContext = format.sharedGLContext();
-    }
+    sharePlatformContext = format.sharedGLContext();
     GLXContext shareGlxContext = 0;
     if (sharePlatformContext)
         shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
@@ -105,35 +90,6 @@ QGLXContext::~QGLXContext()
     Q_XCB_NOOP(m_screen->connection());
 }
 
-void QGLXContext::createDefaultSharedContext(QXcbScreen *screen)
-{
-    Q_XCB_NOOP(screen->connection());
-    int x = 0;
-    int y = 0;
-    int w = 3;
-    int h = 3;
-
-    QPlatformWindowFormat format = QPlatformWindowFormat::defaultFormat();
-    GLXContext context;
-    GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
-    if (config) {
-        XVisualInfo *visualInfo = glXGetVisualFromFBConfig(DISPLAY_FROM_XCB(screen), config);
-        Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(screen), screen->root(), visualInfo->visual, AllocNone);
-        XSetWindowAttributes a;
-        a.colormap = cmap;
-        Window sharedWindow = XCreateWindow(DISPLAY_FROM_XCB(screen), screen->root(), x, y, w, h,
-                                  0, visualInfo->depth, InputOutput, visualInfo->visual,
-                                  CWColormap, &a);
-
-        context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, 0, TRUE);
-        QPlatformGLContext *sharedContext = new QGLXContext(screen, sharedWindow, context);
-        QPlatformGLContext::setDefaultSharedContext(sharedContext);
-    } else {
-        qWarning("Warning no shared context created");
-    }
-    Q_XCB_NOOP(screen->connection());
-}
-
 void QGLXContext::makeCurrent()
 {
     Q_XCB_NOOP(m_screen->connection());
diff --git a/src/plugins/platforms/xcb/qglxintegration.h b/src/plugins/platforms/xcb/qglxintegration.h
index 2e19cf2..99b72a0 100644
--- a/src/plugins/platforms/xcb/qglxintegration.h
+++ b/src/plugins/platforms/xcb/qglxintegration.h
@@ -73,8 +73,6 @@ private:
     QPlatformWindowFormat m_windowFormat;
 
     QGLXContext (QXcbScreen *screen, Drawable drawable, GLXContext context);
-    static QMutex m_defaultSharedContextMutex;
-    static void createDefaultSharedContext(QXcbScreen *xd);
 };
 
 #endif
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
index 6746e22..7a0f36d 100644
--- a/src/plugins/platforms/xlib/qglxintegration.cpp
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -61,8 +61,6 @@
 
 QT_BEGIN_NAMESPACE
 
-QMutex QGLXContext::m_defaultSharedContextMutex(QMutex::Recursive);
-
 QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWindowFormat &format)
     : QPlatformGLContext()
     , m_screen(screen)
@@ -71,20 +69,7 @@ QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWind
 {
 
     const QPlatformGLContext *sharePlatformContext;
-    if (format.useDefaultSharedContext()) {
-        if (!QPlatformGLContext::defaultSharedContext()) {
-            if (m_defaultSharedContextMutex.tryLock()){
-                createDefaultSharedContext(screen);
-                m_defaultSharedContextMutex.unlock();
-            } else {
-                m_defaultSharedContextMutex.lock(); //wait to the the shared context is created
-                m_defaultSharedContextMutex.unlock();
-            }
-        }
-        sharePlatformContext = QPlatformGLContext::defaultSharedContext();
-    } else {
-        sharePlatformContext = format.sharedGLContext();
-    }
+    sharePlatformContext = format.sharedGLContext();
     GLXContext shareGlxContext = 0;
     if (sharePlatformContext)
         shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
@@ -112,33 +97,6 @@ QGLXContext::~QGLXContext()
     }
 }
 
-void QGLXContext::createDefaultSharedContext(QXlibScreen *screen)
-{
-    int x = 0;
-    int y = 0;
-    int w = 3;
-    int h = 3;
-
-    QPlatformWindowFormat format = QPlatformWindowFormat::defaultFormat();
-    GLXContext context;
-    GLXFBConfig config = qglx_findConfig(screen->display()->nativeDisplay(),screen->xScreenNumber(),format);
-    if (config) {
-        XVisualInfo *visualInfo = glXGetVisualFromFBConfig(screen->display()->nativeDisplay(),config);
-        Colormap cmap = XCreateColormap(screen->display()->nativeDisplay(),screen->rootWindow(),visualInfo->visual,AllocNone);
-        XSetWindowAttributes a;
-        a.colormap = cmap;
-        Window sharedWindow = XCreateWindow(screen->display()->nativeDisplay(), screen->rootWindow(),x, y, w, h,
-                                  0, visualInfo->depth, InputOutput, visualInfo->visual,
-                                  CWColormap, &a);
-
-        context = glXCreateNewContext(screen->display()->nativeDisplay(),config,GLX_RGBA_TYPE,0,TRUE);
-        QPlatformGLContext *sharedContext = new QGLXContext(screen,sharedWindow,context);
-        QPlatformGLContext::setDefaultSharedContext(sharedContext);
-    } else {
-        qWarning("Warning no shared context created");
-    }
-}
-
 void QGLXContext::makeCurrent()
 {
     QPlatformGLContext::makeCurrent();
diff --git a/src/plugins/platforms/xlib/qglxintegration.h b/src/plugins/platforms/xlib/qglxintegration.h
index cf6b006..57c716b 100644
--- a/src/plugins/platforms/xlib/qglxintegration.h
+++ b/src/plugins/platforms/xlib/qglxintegration.h
@@ -76,8 +76,6 @@ private:
     QPlatformWindowFormat m_windowFormat;
 
     QGLXContext (QXlibScreen *screen, Drawable drawable, GLXContext context);
-    static QMutex m_defaultSharedContextMutex;
-    static void createDefaultSharedContext(QXlibScreen *xd);
 };
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From 2da25f1ab075c8fbaf7b82fb10b4868db30a7c18 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Wed, 13 Apr 2011 11:33:22 +0200
Subject: Compile on Mac.

Move the work around for old gcc from qstring.h to qbytearray.h

Since QByteArray now also use the FAST_OPERATOR_PLUS, it also
need to be undefined there. and since qstring.h includes qbytearray.h,
it should be placed into qbytearray.h
---
 src/corelib/tools/qbytearray.h | 11 +++++++++++
 src/corelib/tools/qstring.h    | 10 ----------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index 6957022..0627b4e 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -52,6 +52,17 @@
 #error qbytearray.h must be included before any header file that defines truncate
 #endif
 
+#if defined(Q_CC_GNU) && (__GNUC__ == 4 && __GNUC_MINOR__ == 0)
+//There is a bug in GCC 4.0 that tries to instantiate template of annonymous enum
+#  ifdef QT_USE_FAST_OPERATOR_PLUS
+#    undef QT_USE_FAST_OPERATOR_PLUS
+#  endif
+#  ifdef QT_USE_FAST_CONCATENATION
+#    undef QT_USE_FAST_CONCATENATION
+#  endif
+#endif
+
+
 QT_BEGIN_HEADER
 
 QT_BEGIN_NAMESPACE
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index 002e516..66cfa74 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -66,16 +66,6 @@ typedef std::basic_string<wchar_t> QStdWString;
 #error qstring.h must be included before any header file that defines truncate
 #endif
 
-#if defined(Q_CC_GNU) && (__GNUC__ == 4 && __GNUC_MINOR__ == 0)
-//There is a bug in GCC 4.0 that tries to instantiate template of annonymous enum
-#  ifdef QT_USE_FAST_OPERATOR_PLUS
-#    undef QT_USE_FAST_OPERATOR_PLUS
-#  endif
-#  ifdef QT_USE_FAST_CONCATENATION
-#    undef QT_USE_FAST_CONCATENATION
-#  endif
-#endif
-
 QT_BEGIN_HEADER
 
 QT_BEGIN_NAMESPACE
-- 
cgit v0.12


From 39aa998e08be078aad5fd45b827c15fc04eb8e51 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Sat, 9 Apr 2011 01:58:18 +0200
Subject: Fix warnings about && inside ||

Reviewed-By: Trust Me
---
 src/gui/painting/qpainterpath.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index 2058040..27aed32 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -1904,7 +1904,7 @@ static bool qt_isect_curve_horizontal(const QBezier &bezier, qreal y, qreal x1,
     if (y >= bounds.top() && y < bounds.bottom()
         && bounds.right() >= x1 && bounds.left() < x2) {
         const qreal lower_bound = qreal(.01);
-        if (depth == 32 || bounds.width() < lower_bound && bounds.height() < lower_bound)
+        if (depth == 32 || (bounds.width() < lower_bound && bounds.height() < lower_bound))
             return true;
 
         QBezier first_half, second_half;
@@ -1923,7 +1923,7 @@ static bool qt_isect_curve_vertical(const QBezier &bezier, qreal x, qreal y1, qr
     if (x >= bounds.left() && x < bounds.right()
         && bounds.bottom() >= y1 && bounds.top() < y2) {
         const qreal lower_bound = qreal(.01);
-        if (depth == 32 || bounds.width() < lower_bound && bounds.height() < lower_bound)
+        if (depth == 32 || (bounds.width() < lower_bound && bounds.height() < lower_bound))
             return true;
 
         QBezier first_half, second_half;
-- 
cgit v0.12


From 4e2d549e8b2e34c5bd4c77a4a6eba99ed0912168 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Thu, 3 Feb 2011 20:40:47 +0100
Subject: Remove a race condition in SIGCHLD handler.

If the SIGCHLD is delivered *just* as we're installing our handler,
there's a race condition in the setting of the old handler. So instead
rely on the OS to set it properly before it calls our handler.

Reviewed-by: Olivier Goffart
---
 src/corelib/io/qprocess_unix.cpp | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index ba61bda..b93fce9 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -120,7 +120,7 @@ static inline char *strdup(const char *data)
 #endif
 
 static int qt_qprocess_deadChild_pipe[2];
-static void (*qt_sa_old_sigchld_handler)(int) = 0;
+static struct sigaction qt_sa_old_sigchld_handler;
 static void qt_sa_sigchld_handler(int signum)
 {
     qt_safe_write(qt_qprocess_deadChild_pipe[1], "", 1);
@@ -128,8 +128,10 @@ static void qt_sa_sigchld_handler(int signum)
     fprintf(stderr, "*** SIGCHLD\n");
 #endif
 
-    if (qt_sa_old_sigchld_handler && qt_sa_old_sigchld_handler != SIG_IGN)
-        qt_sa_old_sigchld_handler(signum);
+    // load it as volatile
+    void (*oldAction)(int) = ((volatile struct sigaction *)&qt_sa_old_sigchld_handler)->sa_handler;
+    if (oldAction && oldAction != SIG_IGN)
+        oldAction(signum);
 }
 
 static inline void add_fd(int &nfds, int fd, fd_set *fdset)
@@ -190,14 +192,11 @@ QProcessManager::QProcessManager()
 
     // set up the SIGCHLD handler, which writes a single byte to the dead
     // child pipe every time a child dies.
-    struct sigaction oldAction;
     struct sigaction action;
     memset(&action, 0, sizeof(action));
     action.sa_handler = qt_sa_sigchld_handler;
     action.sa_flags = SA_NOCLDSTOP;
-    ::sigaction(SIGCHLD, &action, &oldAction);
-    if (oldAction.sa_handler != qt_sa_sigchld_handler)
-	qt_sa_old_sigchld_handler = oldAction.sa_handler;
+    ::sigaction(SIGCHLD, &action, &qt_sa_old_sigchld_handler);
 }
 
 QProcessManager::~QProcessManager()
@@ -217,14 +216,10 @@ QProcessManager::~QProcessManager()
     qDeleteAll(children.values());
     children.clear();
 
-    struct sigaction oldAction;
-    struct sigaction action;
-    memset(&action, 0, sizeof(action));
-    action.sa_handler = qt_sa_old_sigchld_handler;
-    action.sa_flags = SA_NOCLDSTOP;
-    ::sigaction(SIGCHLD, &action, &oldAction);
-    if (oldAction.sa_handler != qt_sa_sigchld_handler) {
-        ::sigaction(SIGCHLD, &oldAction, 0);
+    struct sigaction currentAction;
+    ::sigaction(SIGCHLD, 0, &currentAction);
+    if (currentAction.sa_handler == qt_sa_sigchld_handler) {
+        ::sigaction(SIGCHLD, &qt_sa_old_sigchld_handler, 0);
     }
 }
 
-- 
cgit v0.12


From 171c8b3dd904d3adf26d00ebaa0f372c1a8a5c71 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Tue, 22 Feb 2011 10:45:16 +0100
Subject: Autotest: Use the shadow-build trick in all platforms

---
 tests/auto/qsslkey/tst_qsslkey.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/tests/auto/qsslkey/tst_qsslkey.cpp b/tests/auto/qsslkey/tst_qsslkey.cpp
index e7b4740..86da09e 100644
--- a/tests/auto/qsslkey/tst_qsslkey.cpp
+++ b/tests/auto/qsslkey/tst_qsslkey.cpp
@@ -108,10 +108,8 @@ tst_QSslKey::tst_QSslKey()
 #ifdef Q_WS_MAC
     // applicationDirPath() points to a path inside the app bundle on Mac.
     QDir dir(qApp->applicationDirPath() + QLatin1String("/../../../keys"));
-#elif defined(Q_OS_WIN) || defined (Q_OS_SYMBIAN)
-    QDir dir(SRCDIR + QLatin1String("/keys"));  // prefer this way to avoid ifdeffery and support shadow builds?
 #else
-    QDir dir(qApp->applicationDirPath() + QLatin1String("/keys"));
+    QDir dir(SRCDIR + QLatin1String("/keys"));  // prefer this way to avoid ifdeffery and support shadow builds?
 #endif
     QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::Readable);
     QRegExp rx(QLatin1String("^(rsa|dsa)-(pub|pri)-(\\d+)\\.(pem|der)$"));
-- 
cgit v0.12


From 38d92bd2511ed56d7a7eece20a370e818fb8d05c Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 13 Apr 2011 14:33:55 +0200
Subject: Disable the JavaScriptCore JIT in ICC.

As of ICC 12.0.2, ICC is known to miscompile some "fastcall" code,
which causes runtime crashes. This fault has been reported to Intel
and a fix is being prepared.

Reviewed-by: Olivier Goffart
---
 configure | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/configure b/configure
index 1369b82..30647c8 100755
--- a/configure
+++ b/configure
@@ -6750,8 +6750,15 @@ if [ "$CFG_JAVASCRIPTCORE_JIT" = "yes" ] || [ "$CFG_JAVASCRIPTCORE_JIT" = "auto"
         if [ $? != "0" ]; then
            CFG_JAVASCRIPTCORE_JIT=no
         fi
-    elif [ "$XPLATFORM" = "symbian-gcce" ]; then
-        CFG_JAVASCRIPTCORE_JIT=no
+    else
+	case "$XPLATFORM" in
+	    symbian-gcce)
+		CFG_JAVASCRIPTCORE_JIT=no
+		;;
+	    linux-icc*)
+		CFG_JAVASCRIPTCORE_JIT=no
+		;;
+	esac
     fi
 fi
 
@@ -8585,7 +8592,7 @@ case "$CFG_WEBKIT" in
     debug) echo "WebKit module .......... yes (debug)" ;;
     no)    echo "WebKit module .......... no" ;;
 esac
-if [ "$CFG_WEBKIT" != "no" ]; then
+if [ "$CFG_WEBKIT" != "no" ] || [ "$CFG_SCRIPT" != "no" ]; then
     if [ "$CFG_JAVASCRIPTCORE_JIT" = "auto" ]; then
         echo "JavaScriptCore JIT ..... To be decided by JavaScriptCore"
     else
-- 
cgit v0.12


From 240ef633b827b33e2af63ff605eff5e1e71e623d Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Tue, 15 Feb 2011 09:49:34 +0100
Subject: Add the QDBusUnixFileDescriptor class

This class holds one Unix file descriptor. It's implicitly shared, but
it makes a copy of your file descriptor (via dup(2) or dup2(2)).

This class is supposed to work even outside Unix systems, just that it
will never do anything.

Documentation in a later commit.

Task-number: QTBUG-17477
---
 src/dbus/dbus.pro                    |   6 +-
 src/dbus/qdbusunixfiledescriptor.cpp | 175 +++++++++++++++++++++++++++++++++++
 src/dbus/qdbusunixfiledescriptor.h   | 103 +++++++++++++++++++++
 3 files changed, 282 insertions(+), 2 deletions(-)
 create mode 100644 src/dbus/qdbusunixfiledescriptor.cpp
 create mode 100644 src/dbus/qdbusunixfiledescriptor.h

diff --git a/src/dbus/dbus.pro b/src/dbus/dbus.pro
index 52ed217..08c9ea1 100644
--- a/src/dbus/dbus.pro
+++ b/src/dbus/dbus.pro
@@ -59,7 +59,8 @@ HEADERS += $$PUB_HEADERS \
     qdbusintegrator_p.h \
     qdbuspendingcall_p.h \
     qdbus_symbols_p.h \
-    qdbusservicewatcher.h
+    qdbusservicewatcher.h \
+    qdbusunixfiledescriptor.h
 SOURCES += qdbusconnection.cpp \
     qdbusconnectioninterface.cpp \
     qdbuserror.cpp \
@@ -85,4 +86,5 @@ SOURCES += qdbusconnection.cpp \
     qdbuspendingcall.cpp \
     qdbuspendingreply.cpp \
     qdbus_symbols.cpp \
-    qdbusservicewatcher.cpp
+    qdbusservicewatcher.cpp \
+    qdbusunixfiledescriptor.cpp
diff --git a/src/dbus/qdbusunixfiledescriptor.cpp b/src/dbus/qdbusunixfiledescriptor.cpp
new file mode 100644
index 0000000..368753c
--- /dev/null
+++ b/src/dbus/qdbusunixfiledescriptor.cpp
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qdbusunixfiledescriptor.h"
+#include <QSharedData>
+
+#ifdef Q_OS_UNIX
+# include <private/qcore_unix_p.h>
+#endif
+
+class QDBusUnixFileDescriptorPrivate : public QSharedData {
+public:
+    QDBusUnixFileDescriptorPrivate() : fd(-1) { }
+    QDBusUnixFileDescriptorPrivate(const QDBusUnixFileDescriptorPrivate &other)
+        : QSharedData(other), fd(-1)
+    {  }
+    ~QDBusUnixFileDescriptorPrivate();
+
+    QAtomicInt fd;
+};
+
+template<> inline
+QExplicitlySharedDataPointer<QDBusUnixFileDescriptorPrivate>::~QExplicitlySharedDataPointer()
+{ if (d && !d->ref.deref()) delete d; }
+
+QDBusUnixFileDescriptor::QDBusUnixFileDescriptor()
+    : d(0)
+{
+}
+
+QDBusUnixFileDescriptor::QDBusUnixFileDescriptor(int fileDescriptor)
+    : d(0)
+{
+    if (fileDescriptor != -1)
+        setFileDescriptor(fileDescriptor);
+}
+
+QDBusUnixFileDescriptor::QDBusUnixFileDescriptor(const QDBusUnixFileDescriptor &other)
+    : d(other.d)
+{
+}
+
+QDBusUnixFileDescriptor &QDBusUnixFileDescriptor::operator=(const QDBusUnixFileDescriptor &other)
+{
+    if (this != &other)
+        d.operator=(other.d);
+    return *this;
+}
+
+QDBusUnixFileDescriptor::~QDBusUnixFileDescriptor()
+{
+}
+
+bool QDBusUnixFileDescriptor::isValid() const
+{
+    return d ? d->fd != -1 : false;
+}
+
+bool QDBusUnixFileDescriptor::isShared() const
+{
+    return d && d->ref == 1;
+}
+
+int QDBusUnixFileDescriptor::fileDescriptor() const
+{
+    return d ? d->fd.operator int() : -1;
+}
+
+// actual implementation
+#ifdef Q_OS_UNIX
+
+bool QDBusUnixFileDescriptor::isSupported()
+{
+    return true;
+}
+
+void QDBusUnixFileDescriptor::setFileDescriptor(int fileDescriptor)
+{
+    if (fileDescriptor != -1)
+        giveFileDescriptor(qt_safe_dup(fileDescriptor));
+}
+
+void QDBusUnixFileDescriptor::giveFileDescriptor(int fileDescriptor)
+{
+    // if we are the sole ref, d remains unchanged
+    // if detaching happens, d->fd will be -1
+    if (d)
+        d.detach();
+    else
+        d = new QDBusUnixFileDescriptorPrivate;
+
+    if (d->fd != -1)
+        qt_safe_close(d->fd);
+
+    if (fileDescriptor != -1)
+        d->fd = fileDescriptor;
+}
+
+int QDBusUnixFileDescriptor::takeFileDescriptor()
+{
+    if (!d)
+        return -1;
+
+    return d->fd.fetchAndStoreRelaxed(-1);
+}
+
+QDBusUnixFileDescriptorPrivate::~QDBusUnixFileDescriptorPrivate()
+{
+    if (fd != -1)
+        qt_safe_close(fd);
+}
+
+#else
+bool QDBusUnixFileDescriptor::isSupported()
+{
+    return false;
+}
+
+void QDBusUnixFileDescriptor::setFileDescriptor(int)
+{
+}
+
+void QDBusUnixFileDescriptor::giveFileDescriptor(int)
+{
+}
+
+int QDBusUnixFileDescriptor::takeFileDescriptor()
+{
+    return -1;
+}
+
+QDBusUnixFileDescriptorPrivate::~QDBusUnixFileDescriptorPrivate()
+{
+}
+
+#endif
diff --git a/src/dbus/qdbusunixfiledescriptor.h b/src/dbus/qdbusunixfiledescriptor.h
new file mode 100644
index 0000000..3ac3f9f
--- /dev/null
+++ b/src/dbus/qdbusunixfiledescriptor.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QDBUSUNIXFILEDESCRIPTOR_H
+#define QDBUSUNIXFILEDESCRIPTOR_H
+
+#include <QtCore/QSharedDataPointer>
+#include <QtDBus/qdbusmacros.h>
+
+#ifndef QT_NO_DBUS
+
+#ifdef Q_COMPILER_RVALUE_REFS
+# include <utility>
+#endif
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(DBus)
+
+class QDBusUnixFileDescriptorPrivate;
+template<> QExplicitlySharedDataPointer<QDBusUnixFileDescriptorPrivate>::~QExplicitlySharedDataPointer();
+
+class Q_DBUS_EXPORT QDBusUnixFileDescriptor
+{
+public:
+    QDBusUnixFileDescriptor();
+    explicit QDBusUnixFileDescriptor(int fileDescriptor);
+    QDBusUnixFileDescriptor(const QDBusUnixFileDescriptor &other);
+    QDBusUnixFileDescriptor &operator=(const QDBusUnixFileDescriptor &other);
+    ~QDBusUnixFileDescriptor();
+
+    bool isValid() const;
+    bool isShared() const;
+
+    int fileDescriptor() const;
+    void setFileDescriptor(int fileDescriptor);
+
+    void giveFileDescriptor(int fileDescriptor);
+    int takeFileDescriptor();
+
+    static bool isSupported();
+
+#if defined(Q_COMPILER_RVALUE_REFS)
+    QDBusUnixFileDescriptor(QDBusUnixFileDescriptor &&other) : d(static_cast<Data &&>(other.d))
+    { }
+    inline QDBusUnixFileDescriptor &operator=(QDBusUnixFileDescriptor &&other)
+    { d.swap(other.d); return *this; }
+#endif
+
+protected:
+    typedef QExplicitlySharedDataPointer<QDBusUnixFileDescriptorPrivate>  Data;
+    Data d;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QDBusUnixFileDescriptor)
+
+QT_END_HEADER
+
+#endif // QT_NO_DBUS
+#endif // QDBUSUNIXFILEDESCRIPTOR_H
-- 
cgit v0.12


From 65c2711cadeaa0f543cf56d7172d37b90b15be27 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Tue, 15 Feb 2011 09:53:33 +0100
Subject: Add QDBusUnixFileDescriptor to the QtDBus metatype system

Task-number: QTBUG-17477
---
 src/dbus/qdbusmetatype.cpp | 15 ++++++++++++++-
 src/dbus/qdbusmetatype_p.h |  1 +
 src/dbus/qdbusutil.cpp     |  5 +++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp
index 9f29205..a361762 100644
--- a/src/dbus/qdbusmetatype.cpp
+++ b/src/dbus/qdbusmetatype.cpp
@@ -50,12 +50,18 @@
 #include <qvector.h>
 
 #include "qdbusmessage.h"
+#include "qdbusunixfiledescriptor.h"
 #include "qdbusutil_p.h"
 #include "qdbusmetatype_p.h"
 #include "qdbusargument_p.h"
 
 #ifndef QT_NO_DBUS
 
+#ifndef DBUS_TYPE_UNIX_FD
+# define DBUS_TYPE_UNIX_FD int('h')
+# define DBUS_TYPE_UNIX_FD_AS_STRING "h"
+#endif
+
 Q_DECLARE_METATYPE(QList<bool>)
 Q_DECLARE_METATYPE(QList<short>)
 Q_DECLARE_METATYPE(QList<ushort>)
@@ -96,6 +102,7 @@ int QDBusMetaTypeId::variant;
 int QDBusMetaTypeId::objectpath;
 int QDBusMetaTypeId::signature;
 int QDBusMetaTypeId::error;
+int QDBusMetaTypeId::unixfd;
 
 void QDBusMetaTypeId::init()
 {
@@ -110,7 +117,8 @@ void QDBusMetaTypeId::init()
         variant = qRegisterMetaType<QDBusVariant>("QDBusVariant");
         objectpath = qRegisterMetaType<QDBusObjectPath>("QDBusObjectPath");
         signature = qRegisterMetaType<QDBusSignature>("QDBusSignature");
-	error = qRegisterMetaType<QDBusError>("QDBusError");
+        error = qRegisterMetaType<QDBusError>("QDBusError");
+        unixfd = qRegisterMetaType<QDBusUnixFileDescriptor>("QDBusUnixFileDescriptor");
 
 #ifndef QDBUS_NO_SPECIALTYPES
         // and register QtCore's with us
@@ -343,6 +351,9 @@ int QDBusMetaType::signatureToType(const char *signature)
     case DBUS_TYPE_SIGNATURE:
         return QDBusMetaTypeId::signature;
 
+    case DBUS_TYPE_UNIX_FD:
+        return QDBusMetaTypeId::unixfd;
+
     case DBUS_TYPE_VARIANT:
         return QDBusMetaTypeId::variant;
 
@@ -432,6 +443,8 @@ const char *QDBusMetaType::typeToSignature(int type)
         return DBUS_TYPE_OBJECT_PATH_AS_STRING;
     else if (type == QDBusMetaTypeId::signature)
         return DBUS_TYPE_SIGNATURE_AS_STRING;
+    else if (type == QDBusMetaTypeId::unixfd)
+        return DBUS_TYPE_UNIX_FD_AS_STRING;
 
     // try the database
     QVector<QDBusCustomTypeInfo> *ct = customTypes();
diff --git a/src/dbus/qdbusmetatype_p.h b/src/dbus/qdbusmetatype_p.h
index 2fce133..b931c75 100644
--- a/src/dbus/qdbusmetatype_p.h
+++ b/src/dbus/qdbusmetatype_p.h
@@ -65,6 +65,7 @@ struct QDBusMetaTypeId
     static int objectpath;      // QDBusObjectPath
     static int signature;       // QDBusSignature
     static int error;           // QDBusError
+    static int unixfd;          // QDBusUnixFileDescriptor
 
     static void init();
 };
diff --git a/src/dbus/qdbusutil.cpp b/src/dbus/qdbusutil.cpp
index 9730f54..844af9a 100644
--- a/src/dbus/qdbusutil.cpp
+++ b/src/dbus/qdbusutil.cpp
@@ -46,6 +46,7 @@
 #include <QtCore/qstringlist.h>
 
 #include "qdbusargument.h"
+#include "qdbusunixfiledescriptor.h"
 
 #ifndef QT_NO_DBUS
 
@@ -130,6 +131,10 @@ static bool variantToString(const QVariant &arg, QString &out)
     } else if (argType == qMetaTypeId<QDBusSignature>()) {
         out += QLatin1String("[Signature: ") + qvariant_cast<QDBusSignature>(arg).signature();
         out += QLatin1Char(']');
+    } else if (argType == qMetaTypeId<QDBusUnixFileDescriptor>()) {
+        out += QLatin1String("[Unix FD: ");
+        out += QLatin1String(qvariant_cast<QDBusUnixFileDescriptor>(arg).isValid() ? "valid" : "not valid");
+        out += QLatin1Char(']');
     } else if (argType == qMetaTypeId<QDBusVariant>()) {
         const QVariant v = qvariant_cast<QDBusVariant>(arg).variant();
         out += QLatin1String("[Variant");
-- 
cgit v0.12


From fe5822786526c69fc5566d480d4b37a5365db4e2 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 16 Feb 2011 12:14:03 +0100
Subject: Add support for D-Bus 1.4 features in QtDBus code

Task-number: QTBUG-17477
---
 src/dbus/qdbus_symbols_p.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h
index c5f55af..d0a4b3e 100644
--- a/src/dbus/qdbus_symbols_p.h
+++ b/src/dbus/qdbus_symbols_p.h
@@ -296,6 +296,12 @@ DEFINEFUNC(dbus_bool_t   , dbus_message_set_sender, (DBusMessage   *message,
 DEFINEFUNC(void          , dbus_message_unref, (DBusMessage   *message),
            (message), )
 
+/* dbus-misc.h */
+DEFINEFUNC(void          , dbus_get_version ,     (int *major_version_p,
+                                                   int *minor_version_p,
+                                                   int *micro_version_p),
+           (major_version_p, minor_version_p, micro_version_p), )
+
 /* dbus-pending-call.h */
 DEFINEFUNC(dbus_bool_t  , dbus_pending_call_set_notify, (DBusPendingCall               *pending,
                                                          DBusPendingCallNotifyFunction  function,
@@ -367,6 +373,14 @@ DEFINEFUNC(dbus_bool_t     , dbus_type_is_fixed, (int            typecode),
 /* dbus-thread.h */
 DEFINEFUNC(dbus_bool_t     , dbus_threads_init_default, (), (), return)
 
+
+/* D-Bus 1.4 symbols */
+#if !defined(QT_LINKED_LIBDBUS) || (DBUS_VERSION >= 0x010400)
+DEFINEFUNC(dbus_bool_t    ,  dbus_connection_can_send_type ,               (DBusConnection             *connection,
+                                                                            int                         type),
+           (connection, type), return)
+#endif
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_DBUS
-- 
cgit v0.12


From 8334e79a0340c9fcd5ccedeb867a84044d4d83dd Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 16 Feb 2011 12:25:09 +0100
Subject: Retrieve the connection capabilities in QDBusConnection

Task-number: QTBUG-17477
---
 src/dbus/qdbusintegrator.cpp | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index ee917a5..aaf19cf 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -1667,6 +1667,28 @@ void QDBusConnectionPrivate::setPeer(DBusConnection *c, const QDBusErrorInternal
     QMetaObject::invokeMethod(this, "doDispatch", Qt::QueuedConnection);
 }
 
+static QDBusConnection::ConnectionCapabilities connectionCapabilies(DBusConnection *connection)
+{
+    QDBusConnection::ConnectionCapabilities result = 0;
+
+#if defined(QT_LINKED_LIBDBUS) && DBUS_VERSION < 0x010400
+    // no capabilities are possible
+#else
+# if !defined(QT_LINKED_LIBDBUS)
+    // run-time check if the next functions are available
+    int major, minor, micro;
+    q_dbus_get_version(&major, &minor, &micro);
+    if (major == 1 && minor < 4)
+        return result;
+# endif
+
+    if (q_dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD))
+        result |= QDBusConnection::UnixFileDescriptorPassing;
+#endif
+
+    return result;
+}
+
 void QDBusConnectionPrivate::setConnection(DBusConnection *dbc, const QDBusErrorInternal &error)
 {
     if (!dbc) {
@@ -1680,6 +1702,7 @@ void QDBusConnectionPrivate::setConnection(DBusConnection *dbc, const QDBusError
     const char *service = q_dbus_bus_get_unique_name(connection);
     Q_ASSERT(service);
     baseService = QString::fromUtf8(service);
+    capabilities = connectionCapabilies(connection);
 
     q_dbus_connection_set_exit_on_disconnect(connection, false);
     q_dbus_connection_set_watch_functions(connection, qDBusAddWatch, qDBusRemoveWatch,
-- 
cgit v0.12


From 6d325d6f70c419d1fee49da1738633a3e03b46d4 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 16 Feb 2011 15:04:57 +0100
Subject: Add support for Unix file-descriptor passing to QtDBus

Task-number: QTBUG-17477
---
 src/dbus/qdbusargument.cpp                     | 28 ++++++++++++++++++++++++++
 src/dbus/qdbusargument.h                       |  4 ++++
 src/dbus/qdbusargument_p.h                     |  8 ++++++++
 src/dbus/qdbusdemarshaller.cpp                 | 17 ++++++++++++++++
 src/dbus/qdbusmarshaller.cpp                   | 20 +++++++++++++++++-
 src/dbus/qdbusmetatype.cpp                     |  1 +
 src/dbus/qdbusunixfiledescriptor.h             |  1 +
 tests/auto/qdbusmarshall/common.h              | 11 ++++++++++
 tests/auto/qdbusmarshall/qdbusmarshall.pro     |  2 ++
 tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp | 23 +++++++++++++++++++++
 10 files changed, 114 insertions(+), 1 deletion(-)

diff --git a/src/dbus/qdbusargument.cpp b/src/dbus/qdbusargument.cpp
index 09f0e82..806b7fe 100644
--- a/src/dbus/qdbusargument.cpp
+++ b/src/dbus/qdbusargument.cpp
@@ -487,6 +487,20 @@ QDBusArgument &QDBusArgument::operator<<(const QDBusSignature &arg)
 
 /*!
     \overload
+    \since 4.8
+    \internal
+    Appends the primitive value \a arg of type \c{UNIX_FILE_DESCRIPTOR} (Unix
+    File Descriptor) to the D-Bus stream.
+*/
+QDBusArgument &QDBusArgument::operator<<(const QDBusUnixFileDescriptor &arg)
+{
+    if (QDBusArgumentPrivate::checkWrite(d))
+        d->marshaller()->append(arg);
+    return *this;
+}
+
+/*!
+    \overload
     Appends the primitive value \a arg of type \c{VARIANT} to the D-Bus stream.
 
     A D-Bus variant type can contain any type, including other
@@ -729,6 +743,20 @@ const QDBusArgument &QDBusArgument::operator>>(QDBusSignature &arg) const
 
 /*!
     \overload
+    \since 4.8
+    \internal
+    Extracts one D-Bus primitive argument of type \c{UNIX_FILE_DESCRIPTOR}
+    (Unix file descriptor) from the D-Bus stream.
+*/
+const QDBusArgument &QDBusArgument::operator>>(QDBusUnixFileDescriptor &arg) const
+{
+    if (QDBusArgumentPrivate::checkReadAndDetach(d))
+        arg = d->demarshaller()->toUnixFileDescriptor();
+    return *this;
+}
+
+/*!
+    \overload
     Extracts one D-Bus primitive argument of type \c{VARIANT} from the
     D-Bus stream.
 
diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h
index e331d8f..f80723e 100644
--- a/src/dbus/qdbusargument.h
+++ b/src/dbus/qdbusargument.h
@@ -61,6 +61,8 @@ QT_BEGIN_NAMESPACE
 
 QT_MODULE(DBus)
 
+class QDBusUnixFileDescriptor;
+
 class QDBusArgumentPrivate;
 class QDBusDemarshaller;
 class QDBusMarshaller;
@@ -96,6 +98,7 @@ public:
     QDBusArgument &operator<<(const QDBusVariant &arg);
     QDBusArgument &operator<<(const QDBusObjectPath &arg);
     QDBusArgument &operator<<(const QDBusSignature &arg);
+    QDBusArgument &operator<<(const QDBusUnixFileDescriptor &arg);
     QDBusArgument &operator<<(const QStringList &arg);
     QDBusArgument &operator<<(const QByteArray &arg);
 
@@ -127,6 +130,7 @@ public:
     const QDBusArgument &operator>>(QDBusVariant &arg) const;
     const QDBusArgument &operator>>(QDBusObjectPath &arg) const;
     const QDBusArgument &operator>>(QDBusSignature &arg) const;
+    const QDBusArgument &operator>>(QDBusUnixFileDescriptor &arg) const;
     const QDBusArgument &operator>>(QStringList &arg) const;
     const QDBusArgument &operator>>(QByteArray &arg) const;
 
diff --git a/src/dbus/qdbusargument_p.h b/src/dbus/qdbusargument_p.h
index 89a383f..1c713a3 100644
--- a/src/dbus/qdbusargument_p.h
+++ b/src/dbus/qdbusargument_p.h
@@ -54,10 +54,16 @@
 //
 
 #include <qdbusargument.h>
+#include "qdbusunixfiledescriptor.h"
 #include "qdbus_symbols_p.h"
 
 #ifndef QT_NO_DBUS
 
+#ifndef DBUS_TYPE_UNIX_FD
+# define DBUS_TYPE_UNIX_FD int('h')
+# define DBUS_TYPE_UNIX_FD_AS_STRING "h"
+#endif
+
 QT_BEGIN_NAMESPACE
 
 class QDBusMarshaller;
@@ -117,6 +123,7 @@ public:
     void append(const QString &arg);
     void append(const QDBusObjectPath &arg);
     void append(const QDBusSignature &arg);
+    void append(const QDBusUnixFileDescriptor &arg);
     void append(const QStringList &arg);
     void append(const QByteArray &arg);
     bool append(const QDBusVariant &arg); // this one can fail
@@ -172,6 +179,7 @@ public:
     QString toString();
     QDBusObjectPath toObjectPath();
     QDBusSignature toSignature();
+    QDBusUnixFileDescriptor toUnixFileDescriptor();
     QDBusVariant toVariant();
     QStringList toStringList();
     QByteArray toByteArray();
diff --git a/src/dbus/qdbusdemarshaller.cpp b/src/dbus/qdbusdemarshaller.cpp
index 111122e..3910381 100644
--- a/src/dbus/qdbusdemarshaller.cpp
+++ b/src/dbus/qdbusdemarshaller.cpp
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include "qdbusargument_p.h"
+#include "qdbusconnection.h"
 #include <stdlib.h>
 
 QT_BEGIN_NAMESPACE
@@ -126,6 +127,13 @@ inline QDBusSignature QDBusDemarshaller::toSignature()
     return QDBusSignature(QString::fromUtf8(qIterGet<char *>(&iterator)));
 }
 
+inline QDBusUnixFileDescriptor QDBusDemarshaller::toUnixFileDescriptor()
+{
+    QDBusUnixFileDescriptor fd;
+    fd.giveFileDescriptor(qIterGet<dbus_int32_t>(&iterator));
+    return fd;
+}
+
 inline QDBusVariant QDBusDemarshaller::toVariant()
 {
     QDBusDemarshaller sub(capabilities);
@@ -173,6 +181,10 @@ QDBusArgument::ElementType QDBusDemarshaller::currentType()
     case DBUS_TYPE_DICT_ENTRY:
         return QDBusArgument::MapEntryType;
 
+    case DBUS_TYPE_UNIX_FD:
+        return capabilities & QDBusConnection::UnixFileDescriptorPassing ?
+                    QDBusArgument::BasicType : QDBusArgument::UnknownType;
+
     case DBUS_TYPE_INVALID:
         return QDBusArgument::UnknownType;
 
@@ -231,6 +243,11 @@ QVariant QDBusDemarshaller::toVariantInternal()
     case DBUS_TYPE_STRUCT:
         return QVariant::fromValue(duplicate());
 
+    case DBUS_TYPE_UNIX_FD:
+        if (capabilities & QDBusConnection::UnixFileDescriptorPassing)
+            return qVariantFromValue(toUnixFileDescriptor());
+        // fall through
+
     default:
 //        qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
 //                 q_dbus_message_iter_get_arg_type(&iterator),
diff --git a/src/dbus/qdbusmarshaller.cpp b/src/dbus/qdbusmarshaller.cpp
index 76d76cc..edf743e 100644
--- a/src/dbus/qdbusmarshaller.cpp
+++ b/src/dbus/qdbusmarshaller.cpp
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include "qdbusargument_p.h"
+#include "qdbusconnection.h"
 #include "qdbusmetatype_p.h"
 #include "qdbusutil_p.h"
 
@@ -138,6 +139,16 @@ inline void QDBusMarshaller::append(const QDBusSignature &arg)
     qIterAppend(&iterator, ba, DBUS_TYPE_SIGNATURE, &cdata);
 }
 
+inline void QDBusMarshaller::append(const QDBusUnixFileDescriptor &arg)
+{
+    int fd = arg.fileDescriptor();
+    if (!ba && fd == -1) {
+        error(QLatin1String("Invalid file descriptor passed in arguments"));
+    } else {
+        qIterAppend(&iterator, ba, DBUS_TYPE_UNIX_FD, &fd);
+    }
+}
+
 inline void QDBusMarshaller::append(const QByteArray &arg)
 {
     if (ba) {
@@ -474,6 +485,13 @@ bool QDBusMarshaller::appendVariantInternal(const QVariant &arg)
         qFatal("QDBusMarshaller::appendVariantInternal got a DICT_ENTRY!");
         return false;
 
+    case DBUS_TYPE_UNIX_FD:
+        if (capabilities & QDBusConnection::UnixFileDescriptorPassing || ba) {
+            append(qvariant_cast<QDBusUnixFileDescriptor>(arg));
+            return true;
+        }
+        // fall through
+
     default:
         qWarning("QDBusMarshaller::appendVariantInternal: Found unknown D-BUS type '%s'",
                  signature);
@@ -507,7 +525,7 @@ bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller)
 
     if (code == DBUS_TYPE_ARRAY) {
         int element = q_dbus_message_iter_get_element_type(&demarshaller->iterator);
-        if (q_dbus_type_is_fixed(element)) {
+        if (q_dbus_type_is_fixed(element) && element != DBUS_TYPE_UNIX_FD) {
             // another optimization: fixed size arrays
             // code is exactly like QDBusDemarshaller::toByteArray
             DBusMessageIter sub;
diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp
index a361762..9d9112c 100644
--- a/src/dbus/qdbusmetatype.cpp
+++ b/src/dbus/qdbusmetatype.cpp
@@ -147,6 +147,7 @@ void QDBusMetaTypeId::init()
         qDBusRegisterMetaType<QList<double> >();
         qDBusRegisterMetaType<QList<QDBusObjectPath> >();
         qDBusRegisterMetaType<QList<QDBusSignature> >();
+        qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >();
 #endif
 
         initialized = true;
diff --git a/src/dbus/qdbusunixfiledescriptor.h b/src/dbus/qdbusunixfiledescriptor.h
index 3ac3f9f..92a770c 100644
--- a/src/dbus/qdbusunixfiledescriptor.h
+++ b/src/dbus/qdbusunixfiledescriptor.h
@@ -96,6 +96,7 @@ protected:
 QT_END_NAMESPACE
 
 Q_DECLARE_METATYPE(QDBusUnixFileDescriptor)
+Q_DECLARE_METATYPE(QList<QDBusUnixFileDescriptor>)
 
 QT_END_HEADER
 
diff --git a/tests/auto/qdbusmarshall/common.h b/tests/auto/qdbusmarshall/common.h
index 532394a..b32b581 100644
--- a/tests/auto/qdbusmarshall/common.h
+++ b/tests/auto/qdbusmarshall/common.h
@@ -377,6 +377,14 @@ bool compare(const QHash<Key, T> &m1, const QHash<Key, T> &m2)
     return true;
 }
 
+bool compare(const QDBusUnixFileDescriptor &t1, const QDBusUnixFileDescriptor &t2)
+{
+    int fd1 = t1.fileDescriptor();
+    int fd2 = t2.fileDescriptor();
+
+    return (fd1 == -1) == (fd2 == -1);
+}
+
 template<typename T>
 inline bool compare(const QDBusArgument &arg, const QVariant &v2, T * = 0)
 {
@@ -563,6 +571,9 @@ template<> bool compare(const QVariant &v1, const QVariant &v2)
     else if (id == qMetaTypeId<QDBusSignature>())
         return qvariant_cast<QDBusSignature>(v1).signature() == qvariant_cast<QDBusSignature>(v2).signature();
 
+    else if (id == qMetaTypeId<QDBusUnixFileDescriptor>())
+        return compare(qvariant_cast<QDBusUnixFileDescriptor>(v1), qvariant_cast<QDBusUnixFileDescriptor>(v2));
+
     else if (id == qMetaTypeId<QDBusVariant>())
         return compare(qvariant_cast<QDBusVariant>(v1).variant(), qvariant_cast<QDBusVariant>(v2).variant());
 
diff --git a/tests/auto/qdbusmarshall/qdbusmarshall.pro b/tests/auto/qdbusmarshall/qdbusmarshall.pro
index f8e0875..ad40c0d 100644
--- a/tests/auto/qdbusmarshall/qdbusmarshall.pro
+++ b/tests/auto/qdbusmarshall/qdbusmarshall.pro
@@ -3,6 +3,8 @@ contains(QT_CONFIG,dbus): {
 	TEMPLATE = subdirs
 	CONFIG += ordered
 	SUBDIRS = qpong test
+
+        requires(contains(QT_CONFIG,private_tests))
 } else {
 	SOURCES += dummy.cpp
 }
diff --git a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
index 9bae6af..828a807 100644
--- a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -42,6 +42,7 @@
 #include <QtTest/QtTest>
 #include <QtDBus/QtDBus>
 #include <QtDBus/private/qdbusutil_p.h>
+#include <QtDBus/private/qdbusconnection_p.h>
 
 #include "common.h"
 #include <limits>
@@ -167,6 +168,9 @@ void tst_QDBusMarshall::sendBasic_data()
     QTest::newRow("signature") << qVariantFromValue(QDBusSignature("g")) << "g" << "[Signature: g]";
     QTest::newRow("emptystring") << QVariant("") << "s" << "\"\"";
     QTest::newRow("nullstring") << QVariant(QString()) << "s" << "\"\"";
+
+    if (QDBusConnection::sessionBus().connectionCapabilities() & QDBusConnection::UnixFileDescriptorPassing)
+        QTest::newRow("file-descriptor") << qVariantFromValue(QDBusUnixFileDescriptor(0)) << "h" << "[Unix FD: valid]";
 #endif
 }
 
@@ -967,6 +971,21 @@ typedef QScopedPointer<DBusConnection, DisconnectRawDBus> ScopedDBusConnection;
 typedef QScopedPointer<DBusMessage, GenericUnref<DBusMessage, dbus_message_unref> > ScopedDBusMessage;
 typedef QScopedPointer<DBusPendingCall, GenericUnref<DBusPendingCall, dbus_pending_call_unref> > ScopedDBusPendingCall;
 
+template <typename T> struct SetResetValue
+{
+    const T oldValue;
+    T &value;
+public:
+    SetResetValue(T &v, T newValue) : oldValue(v), value(v)
+    {
+        value = newValue;
+    }
+    ~SetResetValue()
+    {
+        value = oldValue;
+    }
+};
+
 void tst_QDBusMarshall::receiveUnknownType()
 {
 #ifndef DBUS_TYPE_UNIX_FD
@@ -986,6 +1005,10 @@ void tst_QDBusMarshall::receiveUnknownType()
     if (!dbus_connection_can_send_type(rawcon.data(), DBUS_TYPE_UNIX_FD))
         QSKIP("Your session bus does not allow sending Unix file descriptors", SkipAll);
 
+    // make sure this QDBusConnection won't handle Unix file descriptors
+    QDBusConnection::ConnectionCapabilities &capabRef = QDBusConnectionPrivate::d(con)->capabilities;
+    SetResetValue<QDBusConnection::ConnectionCapabilities> resetter(capabRef, capabRef & ~QDBusConnection::UnixFileDescriptorPassing);
+
     if (qstrcmp(QTest::currentDataTag(), "in-call") == 0) {
         // create a call back to us containing a file descriptor
         QDBusMessageSpy spy;
-- 
cgit v0.12


From 376239da147f7954f49e1c18dd53afcd57c3f771 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 16 Feb 2011 15:30:49 +0100
Subject: Autotest: Test QDBusUnixFileDescriptor support in arrays

Task-number: QTBUG-17477
---
 tests/auto/qdbusmarshall/common.h              |  2 ++
 tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qdbusmarshall/common.h b/tests/auto/qdbusmarshall/common.h
index b32b581..dfa5206 100644
--- a/tests/auto/qdbusmarshall/common.h
+++ b/tests/auto/qdbusmarshall/common.h
@@ -475,6 +475,8 @@ bool compareToArgument(const QDBusArgument &arg, const QVariant &v2)
             return compare<QList<QDBusObjectPath> >(arg, v2);
         else if (id == qMetaTypeId<QList<QDBusSignature> >())
             return compare<QList<QDBusSignature> >(arg, v2);
+        else if (id == qMetaTypeId<QList<QDBusUnixFileDescriptor> >())
+            return compare<QList<QDBusUnixFileDescriptor> >(arg, v2);
         else if (id == qMetaTypeId<QList<QDateTime> >())
             return compare<QList<QDateTime> >(arg, v2);
 
diff --git a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
index 828a807..df31ca2 100644
--- a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -95,6 +95,7 @@ private slots:
 
 private:
     QProcess proc;
+    bool fileDescriptorPassing;
 };
 
 class QDBusMessageSpy: public QObject
@@ -117,6 +118,7 @@ void tst_QDBusMarshall::initTestCase()
 {
     commonInit();
     QDBusConnection con = QDBusConnection::sessionBus();
+    fileDescriptorPassing = con.connectionCapabilities() & QDBusConnection::UnixFileDescriptorPassing;
 #ifdef Q_OS_WIN
     proc.start("qpong");
 #else
@@ -169,7 +171,7 @@ void tst_QDBusMarshall::sendBasic_data()
     QTest::newRow("emptystring") << QVariant("") << "s" << "\"\"";
     QTest::newRow("nullstring") << QVariant(QString()) << "s" << "\"\"";
 
-    if (QDBusConnection::sessionBus().connectionCapabilities() & QDBusConnection::UnixFileDescriptorPassing)
+    if (fileDescriptorPassing)
         QTest::newRow("file-descriptor") << qVariantFromValue(QDBusUnixFileDescriptor(0)) << "h" << "[Unix FD: valid]";
 #endif
 }
@@ -259,6 +261,18 @@ void tst_QDBusMarshall::sendArrays_data()
             << std::numeric_limits<double>::quiet_NaN();
     QTest::newRow("doublelist") << qVariantFromValue(doubles) << "ad" << "[Argument: ad {1.2, 2.2, 4.4, -inf, inf, nan}]";
 
+    QList<QDBusObjectPath> objectPaths;
+    QTest::newRow("emptyobjectpathlist") << qVariantFromValue(objectPaths) << "ao" << "[Argument: ao {}]";
+    objectPaths << QDBusObjectPath("/") << QDBusObjectPath("/foo");
+    QTest::newRow("objectpathlist") << qVariantFromValue(objectPaths) << "ao" << "[Argument: ao {[ObjectPath: /], [ObjectPath: /foo]}]";
+
+    if (fileDescriptorPassing) {
+        QList<QDBusUnixFileDescriptor> fileDescriptors;
+        QTest::newRow("emptyfiledescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {}]";
+        fileDescriptors << QDBusUnixFileDescriptor(0) << QDBusUnixFileDescriptor(1);
+        QTest::newRow("filedescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {[Unix FD: valid], [Unix FD: valid]}]";
+    }
+
     QVariantList variants;
     QTest::newRow("emptyvariantlist") << QVariant(variants) << "av" << "[Argument: av {}]";
     variants << QString("Hello") << QByteArray("World") << 42 << -43.0 << 44U << Q_INT64_C(-45)
-- 
cgit v0.12


From f60b8f84332fcf5cb8be94ba8143595285baf134 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 16 Feb 2011 16:57:10 +0100
Subject: Autotest: more file-descriptor passing tests

Task-number: QTBUG-17477
---
 tests/auto/qdbusmarshall/common.h              | 48 +++++++++++++++++++++-----
 tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp | 45 ++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/tests/auto/qdbusmarshall/common.h b/tests/auto/qdbusmarshall/common.h
index dfa5206..53bd0e5 100644
--- a/tests/auto/qdbusmarshall/common.h
+++ b/tests/auto/qdbusmarshall/common.h
@@ -77,6 +77,14 @@ Q_DECLARE_METATYPE(ObjectPathStringMap)
 Q_DECLARE_METATYPE(LLDateTimeMap)
 Q_DECLARE_METATYPE(SignatureStringMap)
 
+static bool compare(const QDBusUnixFileDescriptor &t1, const QDBusUnixFileDescriptor &t2)
+{
+    int fd1 = t1.fileDescriptor();
+    int fd2 = t2.fileDescriptor();
+
+    return (fd1 == -1) == (fd2 == -1);
+}
+
 struct MyStruct
 {
     int i;
@@ -130,6 +138,32 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, MyVariantMapStruct &ms
     return arg;
 }
 
+struct MyFileDescriptorStruct
+{
+    QDBusUnixFileDescriptor fd;
+
+    inline bool operator==(const MyFileDescriptorStruct &other) const
+    { return compare(fd, other.fd); }
+};
+Q_DECLARE_METATYPE(MyFileDescriptorStruct)
+Q_DECLARE_METATYPE(QList<MyFileDescriptorStruct>)
+
+QDBusArgument &operator<<(QDBusArgument &arg, const MyFileDescriptorStruct &ms)
+{
+    arg.beginStructure();
+    arg << ms.fd;
+    arg.endStructure();
+    return arg;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &arg, MyFileDescriptorStruct &ms)
+{
+    arg.beginStructure();
+    arg >> ms.fd;
+    arg.endStructure();
+    return arg;
+}
+
 
 void commonInit()
 {
@@ -157,6 +191,8 @@ void commonInit()
     qDBusRegisterMetaType<MyStruct>();
     qDBusRegisterMetaType<MyVariantMapStruct>();
     qDBusRegisterMetaType<QList<MyVariantMapStruct> >();
+    qDBusRegisterMetaType<MyFileDescriptorStruct>();
+    qDBusRegisterMetaType<QList<MyFileDescriptorStruct> >();
 }
 #ifdef USE_PRIVATE_CODE
 #include "private/qdbusintrospection_p.h"
@@ -377,14 +413,6 @@ bool compare(const QHash<Key, T> &m1, const QHash<Key, T> &m2)
     return true;
 }
 
-bool compare(const QDBusUnixFileDescriptor &t1, const QDBusUnixFileDescriptor &t2)
-{
-    int fd1 = t1.fileDescriptor();
-    int fd2 = t2.fileDescriptor();
-
-    return (fd1 == -1) == (fd2 == -1);
-}
-
 template<typename T>
 inline bool compare(const QDBusArgument &arg, const QVariant &v2, T * = 0)
 {
@@ -521,6 +549,10 @@ bool compareToArgument(const QDBusArgument &arg, const QVariant &v2)
             return compare<MyVariantMapStruct>(arg, v2);
         else if (id == qMetaTypeId<QList<MyVariantMapStruct> >())
             return compare<QList<MyVariantMapStruct> >(arg, v2);
+        else if (id == qMetaTypeId<MyFileDescriptorStruct>())
+            return compare<MyFileDescriptorStruct>(arg, v2);
+        else if (id == qMetaTypeId<QList<MyFileDescriptorStruct> >())
+            return compare<QList<MyFileDescriptorStruct> >(arg, v2);
     }
 
     qWarning() << "Unexpected QVariant type" << v2.userType()
diff --git a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
index df31ca2..b7cec3e 100644
--- a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -474,6 +474,12 @@ void tst_QDBusMarshall::sendMaps_data()
     QTest::newRow("gs-map") << qVariantFromValue(gsmap) << "a{gs}"
             << "[Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]";
 
+    if (fileDescriptorPassing) {
+        svmap["zzfiledescriptor"] = qVariantFromValue(QDBusUnixFileDescriptor(0));
+        QTest::newRow("sv-map1-fd") << qVariantFromValue(svmap) << "a{sv}"
+                                    << "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]], \"zzfiledescriptor\" = [Variant(QDBusUnixFileDescriptor): [Unix FD: valid]]}]";
+    }
+
     svmap.clear();
     svmap["ismap"] = qVariantFromValue(ismap);
     svmap["ssmap"] = qVariantFromValue(ssmap);
@@ -527,6 +533,18 @@ void tst_QDBusMarshall::sendStructs_data()
     QTest::newRow("empty-list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {}]";
     list << mvms;
     QTest::newRow("list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]}]";
+
+    if (fileDescriptorPassing) {
+        MyFileDescriptorStruct fds;
+        fds.fd = QDBusUnixFileDescriptor(0);
+        QTest::newRow("fdstruct") << qVariantFromValue(fds) << "(h)" << "[Argument: (h) [Unix FD: valid]]";
+
+        QList<MyFileDescriptorStruct> fdlist;
+        QTest::newRow("empty-list-of-fdstruct") << qVariantFromValue(fdlist) << "a(h)" << "[Argument: a(h) {}]";
+
+        fdlist << fds;
+        QTest::newRow("list-of-fdstruct") << qVariantFromValue(fdlist) << "a(h)" << "[Argument: a(h) {[Argument: (h) [Unix FD: valid]]}]";
+    }
 }
 
 void tst_QDBusMarshall::sendComplex_data()
@@ -660,6 +678,12 @@ void tst_QDBusMarshall::sendArgument_data()
     arg << QString();
     QTest::newRow("nullstring") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
 
+    if (fileDescriptorPassing) {
+        arg = QDBusArgument();
+        arg << QDBusUnixFileDescriptor(0);
+        QTest::newRow("filedescriptor") << qVariantFromValue(arg) << "h" << int(QDBusArgument::BasicType);
+    }
+
     arg = QDBusArgument();
     arg << QDBusVariant(1);
     QTest::newRow("variant") << qVariantFromValue(arg) << "v" << int(QDBusArgument::VariantType);
@@ -920,6 +944,27 @@ void tst_QDBusMarshall::sendCallErrors_data()
             << "Marshalling failed: Unregistered type UnregisteredType passed in arguments"
             << QString("QDBusMarshaller: type `UnregisteredType' (%1) is not registered with D-BUS. Use qDBusRegisterMetaType to register it")
             .arg(qMetaTypeId<UnregisteredType>());
+
+    QTest::newRow("invalid-object-path-arg") << serviceName << objectPath << interfaceName << "ping"
+            << (QVariantList() << qVariantFromValue(QDBusObjectPath()))
+            << "org.freedesktop.DBus.Error.Failed"
+            << "Marshalling failed: Invalid object path passed in arguments"
+            << "";
+
+    QTest::newRow("invalid-signature-arg") << serviceName << objectPath << interfaceName << "ping"
+            << (QVariantList() << qVariantFromValue(QDBusSignature()))
+            << "org.freedesktop.DBus.Error.Failed"
+            << "Marshalling failed: Invalid signature passed in arguments"
+            << "";
+
+    // invalid file descriptor
+    if (fileDescriptorPassing) {
+        QTest::newRow("invalid-file-descriptor") << serviceName << objectPath << interfaceName << "ping"
+                << (QVariantList() << qVariantFromValue(QDBusUnixFileDescriptor(-1)))
+                << "org.freedesktop.DBus.Error.Failed"
+                << "Marshalling failed: Invalid file descriptor passed in arguments"
+                << "";
+    }
 }
 
 void tst_QDBusMarshall::sendCallErrors()
-- 
cgit v0.12


From 7647521500b0d1c1e382fff0d1a0f497f1fac70c Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Thu, 17 Feb 2011 17:01:14 +0100
Subject: Autotest: really ensure that two fds are equal

Instead of checking that they are both valid or both invalid, test
that they point to the same file on the filesystem. So we create a
QTemporaryFile and pass its file descriptor to the remote side and
back. If the two fds point to the same file on disk later (same st_dev
and st_ino), they are equal.

This probably works on non-Unix too, but I can't test and there's no
point anyway.

Task-number: QTBUG-17477
---
 tests/auto/qdbusmarshall/common.h              | 26 +++++++++++++++++++++++++-
 tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp | 22 +++++++++++++++++-----
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/tests/auto/qdbusmarshall/common.h b/tests/auto/qdbusmarshall/common.h
index 53bd0e5..8f7f3c3 100644
--- a/tests/auto/qdbusmarshall/common.h
+++ b/tests/auto/qdbusmarshall/common.h
@@ -39,6 +39,22 @@
 **
 ****************************************************************************/
 #include <math.h>               // isnan
+#include <qvariant.h>
+
+#ifdef Q_OS_UNIX
+# include <private/qcore_unix_p.h>
+
+static bool compareFileDescriptors(int fd1, int fd2)
+{
+    QT_STATBUF st1, st2;
+    if (QT_FSTAT(fd1, &st1) == -1 || QT_FSTAT(fd2, &st2) == -1) {
+        perror("fstat");
+        return false;
+    }
+
+    return (st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino);
+}
+#endif
 
 Q_DECLARE_METATYPE(QVariant)
 Q_DECLARE_METATYPE(QList<bool>)
@@ -81,8 +97,16 @@ static bool compare(const QDBusUnixFileDescriptor &t1, const QDBusUnixFileDescri
 {
     int fd1 = t1.fileDescriptor();
     int fd2 = t2.fileDescriptor();
+    if ((fd1 == -1 || fd2 == -1) && fd1 != fd2) {
+        // one is valid, the other isn't
+        return false;
+    }
 
-    return (fd1 == -1) == (fd2 == -1);
+#ifdef Q_OS_UNIX
+    return compareFileDescriptors(fd1, fd2);
+#else
+    return true;
+#endif
 }
 
 struct MyStruct
diff --git a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
index b7cec3e..737f0cf 100644
--- a/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
+++ b/tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
@@ -94,7 +94,10 @@ private slots:
     void receiveUnknownType();
 
 private:
+    int fileDescriptorForTest();
+
     QProcess proc;
+    QTemporaryFile tempFile;
     bool fileDescriptorPassing;
 };
 
@@ -147,6 +150,15 @@ void tst_QDBusMarshall::cleanupTestCase()
     proc.waitForFinished(200);
 }
 
+int tst_QDBusMarshall::fileDescriptorForTest()
+{
+    if (!tempFile.isOpen()) {
+        tempFile.setFileTemplate(QDir::tempPath() + "/qdbusmarshalltestXXXXXX.tmp");
+        tempFile.open();
+    }
+    return tempFile.handle();
+}
+
 void tst_QDBusMarshall::sendBasic_data()
 {
     QTest::addColumn<QVariant>("value");
@@ -172,7 +184,7 @@ void tst_QDBusMarshall::sendBasic_data()
     QTest::newRow("nullstring") << QVariant(QString()) << "s" << "\"\"";
 
     if (fileDescriptorPassing)
-        QTest::newRow("file-descriptor") << qVariantFromValue(QDBusUnixFileDescriptor(0)) << "h" << "[Unix FD: valid]";
+        QTest::newRow("file-descriptor") << qVariantFromValue(QDBusUnixFileDescriptor(fileDescriptorForTest())) << "h" << "[Unix FD: valid]";
 #endif
 }
 
@@ -269,7 +281,7 @@ void tst_QDBusMarshall::sendArrays_data()
     if (fileDescriptorPassing) {
         QList<QDBusUnixFileDescriptor> fileDescriptors;
         QTest::newRow("emptyfiledescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {}]";
-        fileDescriptors << QDBusUnixFileDescriptor(0) << QDBusUnixFileDescriptor(1);
+        fileDescriptors << QDBusUnixFileDescriptor(fileDescriptorForTest()) << QDBusUnixFileDescriptor(1);
         QTest::newRow("filedescriptorlist") << qVariantFromValue(fileDescriptors) << "ah" << "[Argument: ah {[Unix FD: valid], [Unix FD: valid]}]";
     }
 
@@ -475,7 +487,7 @@ void tst_QDBusMarshall::sendMaps_data()
             << "[Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]";
 
     if (fileDescriptorPassing) {
-        svmap["zzfiledescriptor"] = qVariantFromValue(QDBusUnixFileDescriptor(0));
+        svmap["zzfiledescriptor"] = qVariantFromValue(QDBusUnixFileDescriptor(fileDescriptorForTest()));
         QTest::newRow("sv-map1-fd") << qVariantFromValue(svmap) << "a{sv}"
                                     << "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]], \"zzfiledescriptor\" = [Variant(QDBusUnixFileDescriptor): [Unix FD: valid]]}]";
     }
@@ -536,7 +548,7 @@ void tst_QDBusMarshall::sendStructs_data()
 
     if (fileDescriptorPassing) {
         MyFileDescriptorStruct fds;
-        fds.fd = QDBusUnixFileDescriptor(0);
+        fds.fd = QDBusUnixFileDescriptor(fileDescriptorForTest());
         QTest::newRow("fdstruct") << qVariantFromValue(fds) << "(h)" << "[Argument: (h) [Unix FD: valid]]";
 
         QList<MyFileDescriptorStruct> fdlist;
@@ -680,7 +692,7 @@ void tst_QDBusMarshall::sendArgument_data()
 
     if (fileDescriptorPassing) {
         arg = QDBusArgument();
-        arg << QDBusUnixFileDescriptor(0);
+        arg << QDBusUnixFileDescriptor(fileDescriptorForTest());
         QTest::newRow("filedescriptor") << qVariantFromValue(arg) << "h" << int(QDBusArgument::BasicType);
     }
 
-- 
cgit v0.12


From 0c8fa16ef1964c3d102413b44e18964f6b4793ec Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 13 Apr 2011 14:50:03 +0200
Subject: Doc: document the QDBusUnixFileDescriptor class

---
 src/dbus/qdbusunixfiledescriptor.cpp | 145 +++++++++++++++++++++++++++++++++++
 1 file changed, 145 insertions(+)

diff --git a/src/dbus/qdbusunixfiledescriptor.cpp b/src/dbus/qdbusunixfiledescriptor.cpp
index 368753c..9cbaa8f 100644
--- a/src/dbus/qdbusunixfiledescriptor.cpp
+++ b/src/dbus/qdbusunixfiledescriptor.cpp
@@ -47,6 +47,59 @@
 # include <private/qcore_unix_p.h>
 #endif
 
+/*!
+    \class QDBusUnixFileDescriptor
+    \inmodule QtDBus
+    \since 4.8
+
+    \brief The QDBusUnixFileDescriptor class holds one Unix file descriptor.
+
+    The QDBusUnixFileDescriptor class is used to hold one Unix file
+    descriptor for use with the QtDBus module. This allows applications to
+    send and receive Unix file descriptors over the D-Bus connection, mapping
+    automatically to the D-Bus type 'h'.
+
+    Objects of type QDBusUnixFileDescriptors can be used also as parameters
+    in signals and slots that get exported to D-Bus by registering with
+    QDBusConnection::registerObject.
+
+    QDBusUnixFileDescriptor does not take ownership of the file descriptor.
+    Instead, it will use the Unix system call \c dup(2) to make a copy of the
+    file descriptor. This file descriptor belongs to the
+    QDBusUnixFileDescriptor object and should not be stored or closed by the
+    user. Instead, you should make your own copy if you need that.
+
+    \section2 Availability
+
+    Unix file descriptor passing is not available in all D-Bus connections.
+    This feature is present with D-Bus library and bus daemon version 1.4 and
+    upwards on Unix systems. QtDBus automatically enables the feature if such
+    a version was found at compile-time and run-time.
+
+    To verify that your connection does support passing file descriptors,
+    check if the QDBusConnection::UnixFileDescriptorPassing capability is set
+    with QDBusConnection::connectionCapabilities(). If the flag is not
+    active, then you will not be able to make calls to methods that have
+    QDBusUnixFileDescriptor as arguments or even embed such a type in a
+    variant. You will also not receive calls containing that type.
+
+    Note also that remote applications may not have support for Unix file
+    descriptor passing. If you make a D-Bus to a remote application that
+    cannot receive such a type, you will receive an error reply. If you try
+    to send a signal containing a D-Bus file descriptor or return one from a
+    method call, the message will be silently dropped.
+
+    Even if the feature is not available, QDBusUnixFileDescriptor will
+    continue to operate, so code need not have compile-time checks for the
+    availability of this feature.
+
+    On non-Unix systems, QDBusUnixFileDescriptor will always report an
+    invalid state and QDBusUnixFileDescriptor::isSupported() will return
+    false.
+
+    \sa QDBusConnection::ConnectionCapabilities, QDBusConnection::connectionCapabilities
+*/
+
 class QDBusUnixFileDescriptorPrivate : public QSharedData {
 public:
     QDBusUnixFileDescriptorPrivate() : fd(-1) { }
@@ -62,11 +115,31 @@ template<> inline
 QExplicitlySharedDataPointer<QDBusUnixFileDescriptorPrivate>::~QExplicitlySharedDataPointer()
 { if (d && !d->ref.deref()) delete d; }
 
+/*!
+    Constructs a QDBusUnixFileDescriptor without a wrapped file descriptor.
+    This is equivalent to constructing the object with an invalid file
+    descriptor (like -1).
+
+    \sa fileDescriptor, isValid
+*/
 QDBusUnixFileDescriptor::QDBusUnixFileDescriptor()
     : d(0)
 {
 }
 
+/*!
+    Constructs a QDBusUnixFileDescriptor object by copying the \a
+    fileDescriptor parameter. The original file descriptor is not touched and
+    must be closed by the user.
+
+    Note that the value returned by fileDescriptor() will be different from
+    the \a fileDescriptor parameter passed.
+
+    If the \a fileDescriptor parameter is not valid, isValid() will return
+    false and fileDescriptor() will return -1.
+
+    \sa setFileDescriptor, fileDescriptor
+*/
 QDBusUnixFileDescriptor::QDBusUnixFileDescriptor(int fileDescriptor)
     : d(0)
 {
@@ -74,11 +147,19 @@ QDBusUnixFileDescriptor::QDBusUnixFileDescriptor(int fileDescriptor)
         setFileDescriptor(fileDescriptor);
 }
 
+/*!
+    Constructs a QDBusUnixFileDescriptor object by copying \a other.
+*/
 QDBusUnixFileDescriptor::QDBusUnixFileDescriptor(const QDBusUnixFileDescriptor &other)
     : d(other.d)
 {
 }
 
+/*!
+    Copies the Unix file descriptor from the \a other QDBusUnixFileDescriptor
+    object. If the current object contained a file descriptor, it will be
+    properly disposed of before.
+*/
 QDBusUnixFileDescriptor &QDBusUnixFileDescriptor::operator=(const QDBusUnixFileDescriptor &other)
 {
     if (this != &other)
@@ -86,20 +167,45 @@ QDBusUnixFileDescriptor &QDBusUnixFileDescriptor::operator=(const QDBusUnixFileD
     return *this;
 }
 
+/*!
+    Destroys this QDBusUnixFileDescriptor object and disposes of the Unix file descriptor that it contained.
+*/
 QDBusUnixFileDescriptor::~QDBusUnixFileDescriptor()
 {
 }
 
+/*!
+    Returns true if this Unix file descriptor is valid. A valid Unix file
+    descriptor is not -1.
+
+    \sa fileDescriptor()
+*/
 bool QDBusUnixFileDescriptor::isValid() const
 {
     return d ? d->fd != -1 : false;
 }
 
+/*!
+    \internal
+*/
 bool QDBusUnixFileDescriptor::isShared() const
 {
     return d && d->ref == 1;
 }
 
+/*!
+    Returns the Unix file descriptor contained by this
+    QDBusUnixFileDescriptor object. An invalid file descriptor is represented
+    by the value -1.
+
+    Note that the file descriptor returned by this function is owned by the
+    QDBusUnixFileDescriptor object and must not be stored past the lifetime
+    of this object. It is ok to use it while this object is valid, but if one
+    wants to store it for longer use, the file descriptor should be cloned
+    using the Unix \c dup(2), \c dup2(2) or \c dup3(2) functions.
+
+    \sa isValid()
+*/
 int QDBusUnixFileDescriptor::fileDescriptor() const
 {
     return d ? d->fd.operator int() : -1;
@@ -108,17 +214,48 @@ int QDBusUnixFileDescriptor::fileDescriptor() const
 // actual implementation
 #ifdef Q_OS_UNIX
 
+// qdoc documentation is generated on Unix
+
+/*!
+    Returns true if Unix file descriptors are supported on this platform. In
+    other words, this function returns true if this is a Unix platform.
+
+    Note that QDBusUnixFileDescriptor continues to operate even if this
+    function returns false. The only difference is that the
+    QDBusUnixFileDescriptor objects will always be in the isValid() == false
+    state and fileDescriptor() will always return -1. The class will not
+    consume any operating system resources.
+*/
 bool QDBusUnixFileDescriptor::isSupported()
 {
     return true;
 }
 
+/*!
+    Sets the file descriptor that this QDBusUnixFileDescriptor object holds
+    to a copy of \a fileDescriptor.T he original file descriptor is not
+    touched and must be closed by the user.
+
+    Note that the value returned by fileDescriptor() will be different from
+    the \a fileDescriptor parameter passed.
+
+    If the \a fileDescriptor parameter is not valid, isValid() will return
+    false and fileDescriptor() will return -1.
+
+    \sa isValid(), fileDescriptor()
+*/
 void QDBusUnixFileDescriptor::setFileDescriptor(int fileDescriptor)
 {
     if (fileDescriptor != -1)
         giveFileDescriptor(qt_safe_dup(fileDescriptor));
 }
 
+/*!
+    \internal
+    Sets the Unix file descriptor to \a fileDescriptor without copying.
+
+    \sa setFileDescriptor()
+*/
 void QDBusUnixFileDescriptor::giveFileDescriptor(int fileDescriptor)
 {
     // if we are the sole ref, d remains unchanged
@@ -135,6 +272,14 @@ void QDBusUnixFileDescriptor::giveFileDescriptor(int fileDescriptor)
         d->fd = fileDescriptor;
 }
 
+/*!
+    \internal
+    Extracts the Unix file descriptor from the QDBusUnixFileDescriptor object
+    and transfers ownership.
+
+    Note: since QDBusUnixFileDescriptor is implicitly shared, this function
+    is inherently racy and should be avoided.
+*/
 int QDBusUnixFileDescriptor::takeFileDescriptor()
 {
     if (!d)
-- 
cgit v0.12


From 0ee167c7d47c28d747e9ca73aa35fef21171b97f Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 13 Apr 2011 14:52:49 +0200
Subject: Remove the unused QDBusUnixFileDescriptor::isShared function

---
 src/dbus/qdbusunixfiledescriptor.cpp | 8 --------
 src/dbus/qdbusunixfiledescriptor.h   | 1 -
 2 files changed, 9 deletions(-)

diff --git a/src/dbus/qdbusunixfiledescriptor.cpp b/src/dbus/qdbusunixfiledescriptor.cpp
index 9cbaa8f..4817d95 100644
--- a/src/dbus/qdbusunixfiledescriptor.cpp
+++ b/src/dbus/qdbusunixfiledescriptor.cpp
@@ -186,14 +186,6 @@ bool QDBusUnixFileDescriptor::isValid() const
 }
 
 /*!
-    \internal
-*/
-bool QDBusUnixFileDescriptor::isShared() const
-{
-    return d && d->ref == 1;
-}
-
-/*!
     Returns the Unix file descriptor contained by this
     QDBusUnixFileDescriptor object. An invalid file descriptor is represented
     by the value -1.
diff --git a/src/dbus/qdbusunixfiledescriptor.h b/src/dbus/qdbusunixfiledescriptor.h
index 92a770c..d0a2f3c 100644
--- a/src/dbus/qdbusunixfiledescriptor.h
+++ b/src/dbus/qdbusunixfiledescriptor.h
@@ -71,7 +71,6 @@ public:
     ~QDBusUnixFileDescriptor();
 
     bool isValid() const;
-    bool isShared() const;
 
     int fileDescriptor() const;
     void setFileDescriptor(int fileDescriptor);
-- 
cgit v0.12


From b53a80ff1e1a1a5e8c66eaa20076be2745ffb88f Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 21 Feb 2011 20:01:03 +0100
Subject: Add routines to validate D-Bus signature in QtDBus

---
 src/dbus/qdbusutil.cpp                 |  95 +++++++++++-
 src/dbus/qdbusutil_p.h                 |   4 +
 tests/auto/dbus.pro                    |   1 +
 tests/auto/qdbustype/qdbustype.pro     |  10 ++
 tests/auto/qdbustype/tst_qdbustype.cpp | 271 +++++++++++++++++++++++++++++++++
 5 files changed, 379 insertions(+), 2 deletions(-)
 create mode 100644 tests/auto/qdbustype/qdbustype.pro
 create mode 100644 tests/auto/qdbustype/tst_qdbustype.cpp

diff --git a/src/dbus/qdbusutil.cpp b/src/dbus/qdbusutil.cpp
index 844af9a..a4bd168 100644
--- a/src/dbus/qdbusutil.cpp
+++ b/src/dbus/qdbusutil.cpp
@@ -238,6 +238,68 @@ bool argToString(const QDBusArgument &busArg, QString &out)
     return true;
 }
 
+//------- D-Bus Types --------
+static const char oneLetterTypes[] = "vsogybnqiuxtdh";
+static const char basicTypes[] =      "sogybnqiuxtdh";
+static const char fixedTypes[] =         "ybnqiuxtdh";
+
+static bool isBasicType(int c)
+{
+    return c != DBUS_TYPE_INVALID && strchr(basicTypes, c) != NULL;
+}
+
+static bool isFixedType(int c)
+{
+    return c != DBUS_TYPE_INVALID && strchr(fixedTypes, c) != NULL;
+}
+
+// Returns a pointer to one-past-end of this type if it's valid;
+// returns NULL if it isn't valid.
+static const char *validateSingleType(const char *signature)
+{
+    register char c = *signature;
+    if (c == DBUS_TYPE_INVALID)
+        return false;
+
+    // is it one of the one-letter types?
+    if (strchr(oneLetterTypes, c) != NULL)
+        return signature + 1;
+
+    // is it an array?
+    if (c == DBUS_TYPE_ARRAY) {
+        // then it's valid if the next type is valid
+        // or if it's a dict-entry
+        c = *++signature;
+        if (c == DBUS_DICT_ENTRY_BEGIN_CHAR) {
+            // beginning of a dictionary entry
+            // a dictionary entry has a key which is of basic types
+            // and a free value
+            c = *++signature;
+            if (!isBasicType(c))
+                return 0;
+            signature = validateSingleType(signature + 1);
+            return signature && *signature == DBUS_DICT_ENTRY_END_CHAR ? signature + 1 : 0;
+        }
+
+        return validateSingleType(signature);
+    }
+
+    if (c == DBUS_STRUCT_BEGIN_CHAR) {
+        // beginning of a struct
+        ++signature;
+        while (true) {
+            signature = validateSingleType(signature);
+            if (!signature)
+                return 0;
+            if (*signature == DBUS_STRUCT_END_CHAR)
+                return signature + 1;
+        }
+    }
+
+    // invalid/unknown type
+    return 0;
+}
+
 /*!
     \namespace QDBusUtil
     \inmodule QtDBus
@@ -447,6 +509,25 @@ namespace QDBusUtil
     }
 
     /*!
+        \fn bool QDBusUtil::isValidBasicType(int type)
+        Returns true if \a c is a valid, basic D-Bus type.
+     */
+    bool isValidBasicType(int c)
+    {
+        return isBasicType(c);
+    }
+
+    /*!
+        \fn bool QDBusUtil::isValidFixedType(int type)
+        Returns true if \a c is a valid, fixed D-Bus type.
+     */
+    bool isValidFixedType(int c)
+    {
+        return isFixedType(c);
+    }
+
+
+    /*!
         \fn bool QDBusUtil::isValidSignature(const QString &signature)
         Returns true if \a signature is a valid D-Bus type signature for one or more types.
         This function returns true if it can all of \a signature into valid, individual types and no
@@ -456,7 +537,15 @@ namespace QDBusUtil
     */
     bool isValidSignature(const QString &signature)
     {
-        return q_dbus_signature_validate(signature.toUtf8(), 0);
+        QByteArray ba = signature.toLatin1();
+        const char *data = ba.constData();
+        while (true) {
+            data = validateSingleType(data);
+            if (!data)
+                return false;
+            if (*data == '\0')
+                return true;
+        }
     }
 
     /*!
@@ -467,7 +556,9 @@ namespace QDBusUtil
     */
     bool isValidSingleSignature(const QString &signature)
     {
-        return q_dbus_signature_validate_single(signature.toUtf8(), 0);
+        QByteArray ba = signature.toLatin1();
+        const char *data = validateSingleType(ba.constData());
+        return data && *data == '\0';
     }
 
 } // namespace QDBusUtil
diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h
index 3721e98..24b5cea 100644
--- a/src/dbus/qdbusutil_p.h
+++ b/src/dbus/qdbusutil_p.h
@@ -81,6 +81,10 @@ namespace QDBusUtil
 
     Q_DBUS_EXPORT bool isValidObjectPath(const QString &path);
 
+    Q_DBUS_EXPORT bool isValidFixedType(int c);
+
+    Q_DBUS_EXPORT bool isValidBasicType(int c);
+
     Q_DBUS_EXPORT bool isValidSignature(const QString &signature);
 
     Q_DBUS_EXPORT bool isValidSingleSignature(const QString &signature);
diff --git a/tests/auto/dbus.pro b/tests/auto/dbus.pro
index e5f87e3..fe21475 100644
--- a/tests/auto/dbus.pro
+++ b/tests/auto/dbus.pro
@@ -14,6 +14,7 @@ SUBDIRS=\
            qdbusperformance \
            qdbusreply \
            qdbusservicewatcher \
+           qdbustype \
            qdbusthreading \
            qdbusxmlparser \
 
diff --git a/tests/auto/qdbustype/qdbustype.pro b/tests/auto/qdbustype/qdbustype.pro
new file mode 100644
index 0000000..e2f0c90
--- /dev/null
+++ b/tests/auto/qdbustype/qdbustype.pro
@@ -0,0 +1,10 @@
+load(qttest_p4)
+QT = core
+contains(QT_CONFIG,dbus): {
+        SOURCES += tst_qdbustype.cpp
+        QT += dbus
+        QMAKE_CXXFLAGS += $$QT_CFLAGS_DBUS
+        LIBS_PRIVATE += $$QT_LIBS_DBUS
+} else {
+        SOURCES += ../qdbusmarshall/dummy.cpp
+}
diff --git a/tests/auto/qdbustype/tst_qdbustype.cpp b/tests/auto/qdbustype/tst_qdbustype.cpp
new file mode 100644
index 0000000..0469719
--- /dev/null
+++ b/tests/auto/qdbustype/tst_qdbustype.cpp
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtCore/QCoreApplication>
+
+#include <QtDBus/private/qdbusutil_p.h>
+
+#include <dbus/dbus.h>
+
+class tst_QDBusType : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void isValidFixedType_data();
+    void isValidFixedType();
+    void isValidBasicType_data();
+    void isValidBasicType();
+    void isValidSingleSignature_data();
+    void isValidSingleSignature();
+    void isValidArray_data();
+    void isValidArray();
+    void isValidSignature_data();
+    void isValidSignature();
+};
+
+enum { Invalid = false, Valid = true };
+
+static void addColumns()
+{
+    // All tests use these two columns only
+    QTest::addColumn<QString>("data");
+    QTest::addColumn<bool>("result");
+    QTest::addColumn<bool>("isValid");
+}
+
+// ---- type adds ---
+static void addFixedTypes()
+{
+    QTest::newRow("bool") << DBUS_TYPE_BOOLEAN_AS_STRING << true << true;
+    QTest::newRow("byte") << DBUS_TYPE_BYTE_AS_STRING << true << true;
+    QTest::newRow("int16") << DBUS_TYPE_INT16_AS_STRING << true << true;
+    QTest::newRow("uint16") << DBUS_TYPE_UINT16_AS_STRING << true << true;
+    QTest::newRow("int32") << DBUS_TYPE_INT32_AS_STRING << true << true;
+    QTest::newRow("uint32") << DBUS_TYPE_UINT32_AS_STRING << true << true;
+    QTest::newRow("int64") << DBUS_TYPE_INT64_AS_STRING << true << true;
+    QTest::newRow("uint64") << DBUS_TYPE_UINT64_AS_STRING << true << true;
+    QTest::newRow("double") << DBUS_TYPE_DOUBLE_AS_STRING << true << true;
+    QTest::newRow("unixfd") << "h" << true << true;
+}
+
+static void addInvalidSingleLetterTypes()
+{
+    QChar nulString[] = { 0 };
+    QTest::newRow("nul") << QString(nulString, 1) << false << false;
+    QTest::newRow("tilde") << "~" << false << false;
+    QTest::newRow("struct-begin") << "(" << false << false;
+    QTest::newRow("struct-end") << ")" << false << false;
+    QTest::newRow("dict-entry-begin") << "{" << false << false;
+    QTest::newRow("dict-entry-end") << "}" << false << false;
+    QTest::newRow("array-no-element") << "a" << false << false;
+}
+
+static void addBasicTypes(bool basicsAreValid)
+{
+    addFixedTypes();
+    QTest::newRow("string") << DBUS_TYPE_STRING_AS_STRING << basicsAreValid << true;
+    QTest::newRow("object-path") << DBUS_TYPE_OBJECT_PATH_AS_STRING << basicsAreValid << true;
+    QTest::newRow("signature") << DBUS_TYPE_SIGNATURE_AS_STRING << basicsAreValid << true;
+}
+
+static void addVariant(bool variantIsValid)
+{
+    QTest::newRow("variant") << "v" << variantIsValid << true;
+}
+
+static void addSingleSignatures()
+{
+    addBasicTypes(Valid);
+    addVariant(Valid);
+    QTest::newRow("struct-1") << "(y)" << true;
+    QTest::newRow("struct-2") << "(yy)" << true;
+    QTest::newRow("struct-3") << "(yyv)" << true;
+
+    QTest::newRow("struct-nested-1") << "((y))" << true;
+    QTest::newRow("struct-nested-2") << "((yy))" << true;
+    QTest::newRow("struct-nested-3") << "(y(y))" << true;
+    QTest::newRow("struct-nested-4") << "((y)y)" << true;
+    QTest::newRow("struct-nested-5") << "(y(y)y)" << true;
+    QTest::newRow("struct-nested-6") << "((y)(y))" << true;
+
+    QTest::newRow("array-1") << "as" << true;
+    QTest::newRow("struct-array-1") << "(as)" << true;
+    QTest::newRow("struct-array-2") << "(yas)" << true;
+    QTest::newRow("struct-array-3") << "(asy)" << true;
+    QTest::newRow("struct-array-4") << "(yasy)" << true;
+
+    QTest::newRow("dict-1") << "a{sy}" << true;
+    QTest::newRow("dict-2") << "a{sv}" << true;
+    QTest::newRow("dict-struct-1") << "a{s(y)}" << true;
+    QTest::newRow("dict-struct-2") << "a{s(yyyy)}" << true;
+    QTest::newRow("dict-struct-array") << "a{s(ay)}" << true;
+    QTest::newRow("dict-array") << "a{sas}" << true;
+    QTest::newRow("dict-array-struct") << "a{sa(y)}" << true;
+
+    addInvalidSingleLetterTypes();
+    QTest::newRow("naked-dict-empty") << "{}" << false;
+    QTest::newRow("naked-dict-missing-value") << "{i}" << false;
+
+    QTest::newRow("dict-empty") << "a{}" << false;
+    QTest::newRow("dict-missing-value") << "a{i}" << false;
+    QTest::newRow("dict-non-basic-key") << "a{vi}" << false;
+    QTest::newRow("dict-struct-key") << "a{(y)y}" << false;
+    QTest::newRow("dict-missing-close") << "a{sv" << false;
+    QTest::newRow("dict-mismatched-close") << "a{sv)" << false;
+    QTest::newRow("dict-missing-value-close") << "a{s" << false;
+
+    QTest::newRow("empty-struct") << "()" << false;
+    QTest::newRow("struct-missing-close") << "(s" << false;
+    QTest::newRow("struct-nested-missing-close-1") << "((s)" << false;
+    QTest::newRow("struct-nested-missing-close-2") << "((s" << false;
+
+    QTest::newRow("struct-ending-array-no-element") << "(a)" << false;
+}
+
+static void addNakedDictEntry()
+{
+    QTest::newRow("naked-dict-entry") << "{sv}" << false;
+}
+
+// ---- tests ----
+
+void tst_QDBusType::isValidFixedType_data()
+{
+    addColumns();
+    addFixedTypes();
+    addBasicTypes(Invalid);
+    addVariant(Invalid);
+    addInvalidSingleLetterTypes();
+}
+
+void tst_QDBusType::isValidFixedType()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, result);
+    QFETCH(bool, isValid);
+    Q_ASSERT_X(data.length() == 1, "tst_QDBusType", "Test is malformed, this function must test only one-letter types");
+    Q_ASSERT(isValid || (!isValid && !result));
+
+    int type = data.at(0).unicode();
+    if (isValid)
+        QCOMPARE(bool(dbus_type_is_fixed(type)), result);
+    QCOMPARE(QDBusUtil::isValidFixedType(type), result);
+}
+
+void tst_QDBusType::isValidBasicType_data()
+{
+    addColumns();
+    addBasicTypes(Valid);
+    addVariant(Invalid);
+    addInvalidSingleLetterTypes();
+}
+
+void tst_QDBusType::isValidBasicType()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, result);
+    QFETCH(bool, isValid);
+    Q_ASSERT_X(data.length() == 1, "tst_QDBusType", "Test is malformed, this function must test only one-letter types");
+    Q_ASSERT(isValid || (!isValid && !result));
+
+    int type = data.at(0).unicode();
+    if (isValid)
+        QCOMPARE(bool(dbus_type_is_basic(type)), result);
+    QCOMPARE(QDBusUtil::isValidBasicType(type), result);
+}
+
+void tst_QDBusType::isValidSingleSignature_data()
+{
+    addColumns();
+    addSingleSignatures();
+    addNakedDictEntry();
+}
+
+void tst_QDBusType::isValidSingleSignature()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, result);
+
+    QCOMPARE(bool(dbus_signature_validate_single(data.toLatin1(), 0)), result);
+    QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
+}
+
+void tst_QDBusType::isValidArray_data()
+{
+    addColumns();
+    addSingleSignatures();
+}
+
+void tst_QDBusType::isValidArray()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, result);
+
+    data.prepend("a");
+    QCOMPARE(bool(dbus_signature_validate_single(data.toLatin1(), 0)), result);
+    QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
+
+    data.prepend("a");
+    QCOMPARE(bool(dbus_signature_validate_single(data.toLatin1(), 0)), result);
+    QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
+}
+
+void tst_QDBusType::isValidSignature_data()
+{
+    isValidSingleSignature_data();
+}
+
+void tst_QDBusType::isValidSignature()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, result);
+
+    data.append(data);
+    if (data.at(0).unicode())
+        QCOMPARE(bool(dbus_signature_validate(data.toLatin1(), 0)), result);
+    QCOMPARE(QDBusUtil::isValidSignature(data), result);
+}
+
+QTEST_MAIN(tst_QDBusType)
+
+#include "tst_qdbustype.moc"
-- 
cgit v0.12


From 08cecc882bf23253b3e447cde037e10529f56cdf Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 21 Feb 2011 20:15:31 +0100
Subject: Use the Qt code for validating types in QtDBus

---
 src/dbus/qdbus_symbols_p.h   | 12 ------------
 src/dbus/qdbusmarshaller.cpp |  6 +++---
 2 files changed, 3 insertions(+), 15 deletions(-)

diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h
index d0a4b3e..039657e 100644
--- a/src/dbus/qdbus_symbols_p.h
+++ b/src/dbus/qdbus_symbols_p.h
@@ -358,18 +358,6 @@ DEFINEFUNC(dbus_bool_t , dbus_server_set_watch_functions, (DBusServer
 DEFINEFUNC(void        , dbus_server_unref, (DBusServer     *server),
            (server), )
 
-/* dbus-signature.h */
-DEFINEFUNC(dbus_bool_t     , dbus_signature_validate, (const char       *signature,
-                                                       DBusError        *error),
-           (signature, error), return)
-DEFINEFUNC(dbus_bool_t     , dbus_signature_validate_single, (const char       *signature,
-                                                              DBusError        *error),
-           (signature, error), return)
-DEFINEFUNC(dbus_bool_t     , dbus_type_is_basic, (int            typecode),
-           (typecode), return)
-DEFINEFUNC(dbus_bool_t     , dbus_type_is_fixed, (int            typecode),
-           (typecode), return)
-
 /* dbus-thread.h */
 DEFINEFUNC(dbus_bool_t     , dbus_threads_init_default, (), (), return)
 
diff --git a/src/dbus/qdbusmarshaller.cpp b/src/dbus/qdbusmarshaller.cpp
index edf743e..6dec359 100644
--- a/src/dbus/qdbusmarshaller.cpp
+++ b/src/dbus/qdbusmarshaller.cpp
@@ -254,7 +254,7 @@ inline QDBusMarshaller *QDBusMarshaller::beginMap(int kid, int vid)
               .arg(QLatin1String(QVariant::typeToName(QVariant::Type(kid)))));
         return this;
     }
-    if (ksignature[1] != 0 || !q_dbus_type_is_basic(*ksignature)) {
+    if (ksignature[1] != 0 || !QDBusUtil::isValidBasicType(*ksignature)) {
         qWarning("QDBusMarshaller: type '%s' (%d) cannot be used as the key type in a D-BUS map.",
                  QVariant::typeToName( QVariant::Type(kid) ), kid);
         error(QString::fromLatin1("Type %1 passed in arguments cannot be used as a key in a map")
@@ -511,7 +511,7 @@ bool QDBusMarshaller::appendRegisteredType(const QVariant &arg)
 bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller)
 {
     int code = q_dbus_message_iter_get_arg_type(&demarshaller->iterator);
-    if (q_dbus_type_is_basic(code)) {
+    if (QDBusUtil::isValidBasicType(code)) {
         // easy: just append
         // do exactly like the D-BUS docs suggest
         // (see apidocs for q_dbus_message_iter_get_basic)
@@ -525,7 +525,7 @@ bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller)
 
     if (code == DBUS_TYPE_ARRAY) {
         int element = q_dbus_message_iter_get_element_type(&demarshaller->iterator);
-        if (q_dbus_type_is_fixed(element) && element != DBUS_TYPE_UNIX_FD) {
+        if (QDBusUtil::isValidFixedType(element) && element != DBUS_TYPE_UNIX_FD) {
             // another optimization: fixed size arrays
             // code is exactly like QDBusDemarshaller::toByteArray
             DBusMessageIter sub;
-- 
cgit v0.12


From c22f52ce22f998d35ccc6ee0caa60d4e0af3b783 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 23 Feb 2011 16:59:54 +0100
Subject: Move the QDBusPerformance test to the tests/benchmark dir

---
 tests/auto/dbus.pro                                |   1 -
 tests/auto/qdbusperformance/.gitignore             |   2 -
 tests/auto/qdbusperformance/qdbusperformance.pro   |   8 -
 tests/auto/qdbusperformance/server/server.cpp      |  64 ------
 tests/auto/qdbusperformance/server/server.pro      |   5 -
 tests/auto/qdbusperformance/serverobject.h         | 115 -----------
 tests/auto/qdbusperformance/test/test.pro          |   7 -
 .../auto/qdbusperformance/tst_qdbusperformance.cpp | 230 ---------------------
 tests/benchmarks/benchmarks.pro                    |   1 +
 tests/benchmarks/dbus/dbus.pro                     |   3 +
 tests/benchmarks/dbus/qdbusperformance/.gitignore  |   2 +
 .../dbus/qdbusperformance/qdbusperformance.pro     |   4 +
 .../dbus/qdbusperformance/server/server.cpp        |  64 ++++++
 .../dbus/qdbusperformance/server/server.pro        |   5 +
 .../dbus/qdbusperformance/serverobject.h           | 115 +++++++++++
 .../benchmarks/dbus/qdbusperformance/test/test.pro |   7 +
 .../dbus/qdbusperformance/tst_qdbusperformance.cpp | 230 +++++++++++++++++++++
 17 files changed, 431 insertions(+), 432 deletions(-)
 delete mode 100644 tests/auto/qdbusperformance/.gitignore
 delete mode 100644 tests/auto/qdbusperformance/qdbusperformance.pro
 delete mode 100644 tests/auto/qdbusperformance/server/server.cpp
 delete mode 100644 tests/auto/qdbusperformance/server/server.pro
 delete mode 100644 tests/auto/qdbusperformance/serverobject.h
 delete mode 100644 tests/auto/qdbusperformance/test/test.pro
 delete mode 100644 tests/auto/qdbusperformance/tst_qdbusperformance.cpp
 create mode 100644 tests/benchmarks/dbus/dbus.pro
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/.gitignore
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/qdbusperformance.pro
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/server/server.cpp
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/server/server.pro
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/serverobject.h
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/test/test.pro
 create mode 100644 tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp

diff --git a/tests/auto/dbus.pro b/tests/auto/dbus.pro
index fe21475..31b46a3 100644
--- a/tests/auto/dbus.pro
+++ b/tests/auto/dbus.pro
@@ -11,7 +11,6 @@ SUBDIRS=\
            qdbusmetatype \
            qdbuspendingcall \
            qdbuspendingreply \
-           qdbusperformance \
            qdbusreply \
            qdbusservicewatcher \
            qdbustype \
diff --git a/tests/auto/qdbusperformance/.gitignore b/tests/auto/qdbusperformance/.gitignore
deleted file mode 100644
index 4cd8399..0000000
--- a/tests/auto/qdbusperformance/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-tst_qdbusperformance
-server/server
diff --git a/tests/auto/qdbusperformance/qdbusperformance.pro b/tests/auto/qdbusperformance/qdbusperformance.pro
deleted file mode 100644
index 6880518..0000000
--- a/tests/auto/qdbusperformance/qdbusperformance.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-load(qttest_p4)
-contains(QT_CONFIG,dbus): {
-	TEMPLATE = subdirs
-	CONFIG += ordered
-	SUBDIRS = server test
-} else {
-	SOURCES += ../qdbusmarshall/dummy.cpp
-}
diff --git a/tests/auto/qdbusperformance/server/server.cpp b/tests/auto/qdbusperformance/server/server.cpp
deleted file mode 100644
index 3bd5efc..0000000
--- a/tests/auto/qdbusperformance/server/server.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/QtCore>
-#include <QtDBus/QtDBus>
-
-#include "../serverobject.h"
-
-static const char serviceName[] = "com.trolltech.autotests.performance";
-static const char objectPath[] = "/";
-
-int main(int argc, char *argv[])
-{
-    QCoreApplication app(argc, argv);
-
-    QDBusConnection con = QDBusConnection::sessionBus();
-    if (!con.isConnected())
-        exit(1);
-
-    if (!con.registerService(serviceName))
-        exit(2);
-
-    ServerObject obj(objectPath, con);
-    printf("ready.\n");
-    return app.exec();
-}
-
diff --git a/tests/auto/qdbusperformance/server/server.pro b/tests/auto/qdbusperformance/server/server.pro
deleted file mode 100644
index 30f81dd..0000000
--- a/tests/auto/qdbusperformance/server/server.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES = server.cpp
-HEADERS = ../serverobject.h
-TARGET = server
-CONFIG += qdbus
-QT -= gui
diff --git a/tests/auto/qdbusperformance/serverobject.h b/tests/auto/qdbusperformance/serverobject.h
deleted file mode 100644
index 6f85bb4..0000000
--- a/tests/auto/qdbusperformance/serverobject.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef SERVEROBJECT_H
-#define SERVEROBJECT_H
-
-#include <QObject>
-#include <QtDBus/QtDBus>
-
-class ServerObject: public QObject
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.Performance")
-public:
-    ServerObject(const QString &objectPath, QDBusConnection conn, QObject *parent = 0)
-        : QObject(parent)
-    {
-        conn.registerObject(objectPath, this, QDBusConnection::ExportAllSlots);
-    }
-
-public slots:
-    Q_NOREPLY void noReply(const QByteArray &)
-    {
-        // black hole
-    }
-    Q_NOREPLY void noReply(const QString &)
-    {
-        // black hole
-    }
-    Q_NOREPLY void noReply(const QDBusVariant &)
-    {
-        // black hole
-    }
-
-    int size(const QByteArray &data)
-    {
-        return data.size();
-    }
-    int size(const QString &data)
-    {
-        return data.size();
-    }
-    int size(const QDBusVariant &data)
-    {
-        QVariant v = data.variant();
-        switch (v.type())
-        {
-        case QVariant::ByteArray:
-            return v.toByteArray().size();
-        case QVariant::StringList:
-            return v.toStringList().size();
-        case QVariant::String:
-        default:
-            return v.toString().size();
-        }
-    }
-
-    QByteArray echo(const QByteArray &data)
-    {
-        return data;
-    }
-    QString echo(const QString &data)
-    {
-        return data;
-    }
-    QDBusVariant echo(const QDBusVariant &data)
-    {
-        return data;
-    }
-
-    void nothing()
-    {
-    }
-};
-
-#endif
diff --git a/tests/auto/qdbusperformance/test/test.pro b/tests/auto/qdbusperformance/test/test.pro
deleted file mode 100644
index 9f5712e..0000000
--- a/tests/auto/qdbusperformance/test/test.pro
+++ /dev/null
@@ -1,7 +0,0 @@
-load(qttest_p4)
-SOURCES += ../tst_qdbusperformance.cpp
-HEADERS += ../serverobject.h
-TARGET = ../tst_qdbusperformance
-
-QT = core
-CONFIG += qdbus
diff --git a/tests/auto/qdbusperformance/tst_qdbusperformance.cpp b/tests/auto/qdbusperformance/tst_qdbusperformance.cpp
deleted file mode 100644
index a5b4b98..0000000
--- a/tests/auto/qdbusperformance/tst_qdbusperformance.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/QtCore>
-#include <QtTest/QtTest>
-#include <QtDBus/QtDBus>
-
-#include "./serverobject.h"
-
-static const char serviceName[] = "com.trolltech.autotests.performance";
-static const int runTime = 500;
-
-class tst_QDBusPerformance: public QObject
-{
-    Q_OBJECT
-    QProcess proc;
-    QDBusInterface *target;
-
-    QDBusInterface *remote;
-    QDBusInterface *local;
-
-    bool executeTest(const char *funcname, int size, const QVariant &data);
-
-public slots:
-    void initTestCase_data();
-    void initTestCase();
-    void init();
-
-private slots:
-    void callSpeed();
-
-    void oneWay_data();
-    void oneWay();
-    void oneWayVariant_data();
-    void oneWayVariant();
-
-    void roundTrip_data();
-    void roundTrip();
-    void roundTripVariant_data();
-    void roundTripVariant();
-};
-Q_DECLARE_METATYPE(QVariant)
-
-void tst_QDBusPerformance::initTestCase()
-{
-    QDBusConnection con = QDBusConnection::sessionBus();
-    QVERIFY(con.isConnected());
-
-    QDBusServiceWatcher watcher(serviceName, con,
-                                QDBusServiceWatcher::WatchForRegistration);
-    connect(&watcher, SIGNAL(serviceRegistered(QString)),
-            &QTestEventLoop::instance(), SLOT(exitLoop()));
-
-#ifdef Q_OS_WIN
-    proc.start("server");
-#else
-    proc.start("./server/server");
-#endif
-    QVERIFY(proc.waitForStarted());
-
-    QTestEventLoop::instance().enterLoop(5);
-    QVERIFY(con.interface()->isServiceRegistered(serviceName));
-
-    remote = new QDBusInterface(serviceName, "/", "com.trolltech.autotests.Performance", con, this);
-    QVERIFY(remote->isValid());
-
-    new ServerObject("/", con, this);
-    local = new QDBusInterface(con.baseService(), "/", "com.trolltech.autotests.Performance", con, this);
-    QVERIFY(local->isValid());
-}
-
-void tst_QDBusPerformance::initTestCase_data()
-{
-    QTest::addColumn<bool>("loopback");
-
-    QTest::newRow("normal") << false;
-    QTest::newRow("loopback") << true;
-}
-
-void tst_QDBusPerformance::init()
-{
-    QFETCH_GLOBAL(bool, loopback);
-    if (loopback)
-        target = local;
-    else
-        target = remote;
-}
-
-void tst_QDBusPerformance::callSpeed()
-{
-    QElapsedTimer timer;
-
-    int callCount = 0;
-    timer.start();
-    while (timer.elapsed() < runTime) {
-        QDBusReply<void> reply = target->call("nothing");
-        QVERIFY(reply.isValid());
-
-        ++callCount;
-    }
-    qDebug() << callCount << "calls in" << timer.elapsed() << "ms:"
-             << (callCount * 1000.0 / timer.elapsed()) << "calls/sec";
-}
-
-bool tst_QDBusPerformance::executeTest(const char *funcname, int size, const QVariant &data)
-{
-    QElapsedTimer timer;
-
-    int callCount = 0;
-    qint64 transferred = 0;
-    timer.start();
-    while (timer.elapsed() < runTime) {
-        QDBusMessage reply = target->call(funcname, data);
-        if (reply.type() != QDBusMessage::ReplyMessage)
-            return false;
-
-        transferred += size;
-        ++callCount;
-    }
-    qDebug() << transferred << "bytes in" << timer.elapsed() << "ms"
-             << "(in" << callCount << "calls):"
-             << (transferred * 1000.0 / timer.elapsed() / 1024 / 1024) << "MB/s";
-
-    return true;
-}
-
-void tst_QDBusPerformance::oneWay_data()
-{
-    QTest::addColumn<QVariant>("data");
-    QTest::addColumn<int>("size");
-
-    QByteArray ba(256, 'a');
-    while (ba.size() < 8193) {
-        QTest::newRow(QString("%1-byteArray").arg(ba.size()).toAscii()) << qVariantFromValue(ba) << ba.size();
-        ba += ba;
-    }
-
-    QString s(256, QLatin1Char('a'));
-    while (s.size() < 8193) {
-        QTest::newRow(QString("%1-string").arg(s.size()).toAscii()) << qVariantFromValue(s) << s.size();
-        s += s;
-    }
-}
-
-void tst_QDBusPerformance::oneWay()
-{
-    QFETCH(QVariant, data);
-    QFETCH(int, size);
-
-    QVERIFY(executeTest("size", size, data));
-}
-
-void tst_QDBusPerformance::oneWayVariant_data()
-{
-    oneWay_data();
-}
-
-void tst_QDBusPerformance::oneWayVariant()
-{
-    QFETCH(QVariant, data);
-    QFETCH(int, size);
-
-    QVERIFY(executeTest("size", size, qVariantFromValue(QDBusVariant(data))));
-}
-
-void tst_QDBusPerformance::roundTrip_data()
-{
-    oneWay_data();
-}
-
-void tst_QDBusPerformance::roundTrip()
-{
-    QFETCH(QVariant, data);
-    QFETCH(int, size);
-
-    QVERIFY(executeTest("echo", size, data));
-}
-
-void tst_QDBusPerformance::roundTripVariant_data()
-{
-    oneWay_data();
-}
-
-void tst_QDBusPerformance::roundTripVariant()
-{
-    QFETCH(QVariant, data);
-    QFETCH(int, size);
-
-    QVERIFY(executeTest("echo", size, qVariantFromValue(QDBusVariant(data))));
-}
-
-QTEST_MAIN(tst_QDBusPerformance)
-#include "tst_qdbusperformance.moc"
diff --git a/tests/benchmarks/benchmarks.pro b/tests/benchmarks/benchmarks.pro
index 00a1b37..b5e3a4b 100644
--- a/tests/benchmarks/benchmarks.pro
+++ b/tests/benchmarks/benchmarks.pro
@@ -7,6 +7,7 @@ SUBDIRS = \
         svg
 contains(QT_CONFIG, opengl): SUBDIRS += opengl
 contains(QT_CONFIG, declarative): SUBDIRS += declarative
+contains(QT_CONFIG, dbus): SUBDIRS += dbus
 
 check-trusted.CONFIG += recursive
 QMAKE_EXTRA_TARGETS += check-trusted
diff --git a/tests/benchmarks/dbus/dbus.pro b/tests/benchmarks/dbus/dbus.pro
new file mode 100644
index 0000000..b02d070
--- /dev/null
+++ b/tests/benchmarks/dbus/dbus.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+        qdbusperformance
diff --git a/tests/benchmarks/dbus/qdbusperformance/.gitignore b/tests/benchmarks/dbus/qdbusperformance/.gitignore
new file mode 100644
index 0000000..4cd8399
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/.gitignore
@@ -0,0 +1,2 @@
+tst_qdbusperformance
+server/server
diff --git a/tests/benchmarks/dbus/qdbusperformance/qdbusperformance.pro b/tests/benchmarks/dbus/qdbusperformance/qdbusperformance.pro
new file mode 100644
index 0000000..90f88a7
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/qdbusperformance.pro
@@ -0,0 +1,4 @@
+load(qttest_p4)
+TEMPLATE = subdirs
+CONFIG += ordered
+SUBDIRS = server test
diff --git a/tests/benchmarks/dbus/qdbusperformance/server/server.cpp b/tests/benchmarks/dbus/qdbusperformance/server/server.cpp
new file mode 100644
index 0000000..3bd5efc
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/server/server.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/QtCore>
+#include <QtDBus/QtDBus>
+
+#include "../serverobject.h"
+
+static const char serviceName[] = "com.trolltech.autotests.performance";
+static const char objectPath[] = "/";
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication app(argc, argv);
+
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!con.isConnected())
+        exit(1);
+
+    if (!con.registerService(serviceName))
+        exit(2);
+
+    ServerObject obj(objectPath, con);
+    printf("ready.\n");
+    return app.exec();
+}
+
diff --git a/tests/benchmarks/dbus/qdbusperformance/server/server.pro b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
new file mode 100644
index 0000000..30f81dd
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
@@ -0,0 +1,5 @@
+SOURCES = server.cpp
+HEADERS = ../serverobject.h
+TARGET = server
+CONFIG += qdbus
+QT -= gui
diff --git a/tests/benchmarks/dbus/qdbusperformance/serverobject.h b/tests/benchmarks/dbus/qdbusperformance/serverobject.h
new file mode 100644
index 0000000..6f85bb4
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/serverobject.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef SERVEROBJECT_H
+#define SERVEROBJECT_H
+
+#include <QObject>
+#include <QtDBus/QtDBus>
+
+class ServerObject: public QObject
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.Performance")
+public:
+    ServerObject(const QString &objectPath, QDBusConnection conn, QObject *parent = 0)
+        : QObject(parent)
+    {
+        conn.registerObject(objectPath, this, QDBusConnection::ExportAllSlots);
+    }
+
+public slots:
+    Q_NOREPLY void noReply(const QByteArray &)
+    {
+        // black hole
+    }
+    Q_NOREPLY void noReply(const QString &)
+    {
+        // black hole
+    }
+    Q_NOREPLY void noReply(const QDBusVariant &)
+    {
+        // black hole
+    }
+
+    int size(const QByteArray &data)
+    {
+        return data.size();
+    }
+    int size(const QString &data)
+    {
+        return data.size();
+    }
+    int size(const QDBusVariant &data)
+    {
+        QVariant v = data.variant();
+        switch (v.type())
+        {
+        case QVariant::ByteArray:
+            return v.toByteArray().size();
+        case QVariant::StringList:
+            return v.toStringList().size();
+        case QVariant::String:
+        default:
+            return v.toString().size();
+        }
+    }
+
+    QByteArray echo(const QByteArray &data)
+    {
+        return data;
+    }
+    QString echo(const QString &data)
+    {
+        return data;
+    }
+    QDBusVariant echo(const QDBusVariant &data)
+    {
+        return data;
+    }
+
+    void nothing()
+    {
+    }
+};
+
+#endif
diff --git a/tests/benchmarks/dbus/qdbusperformance/test/test.pro b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
new file mode 100644
index 0000000..9f5712e
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+SOURCES += ../tst_qdbusperformance.cpp
+HEADERS += ../serverobject.h
+TARGET = ../tst_qdbusperformance
+
+QT = core
+CONFIG += qdbus
diff --git a/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp
new file mode 100644
index 0000000..a5b4b98
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbusperformance/tst_qdbusperformance.cpp
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/QtCore>
+#include <QtTest/QtTest>
+#include <QtDBus/QtDBus>
+
+#include "./serverobject.h"
+
+static const char serviceName[] = "com.trolltech.autotests.performance";
+static const int runTime = 500;
+
+class tst_QDBusPerformance: public QObject
+{
+    Q_OBJECT
+    QProcess proc;
+    QDBusInterface *target;
+
+    QDBusInterface *remote;
+    QDBusInterface *local;
+
+    bool executeTest(const char *funcname, int size, const QVariant &data);
+
+public slots:
+    void initTestCase_data();
+    void initTestCase();
+    void init();
+
+private slots:
+    void callSpeed();
+
+    void oneWay_data();
+    void oneWay();
+    void oneWayVariant_data();
+    void oneWayVariant();
+
+    void roundTrip_data();
+    void roundTrip();
+    void roundTripVariant_data();
+    void roundTripVariant();
+};
+Q_DECLARE_METATYPE(QVariant)
+
+void tst_QDBusPerformance::initTestCase()
+{
+    QDBusConnection con = QDBusConnection::sessionBus();
+    QVERIFY(con.isConnected());
+
+    QDBusServiceWatcher watcher(serviceName, con,
+                                QDBusServiceWatcher::WatchForRegistration);
+    connect(&watcher, SIGNAL(serviceRegistered(QString)),
+            &QTestEventLoop::instance(), SLOT(exitLoop()));
+
+#ifdef Q_OS_WIN
+    proc.start("server");
+#else
+    proc.start("./server/server");
+#endif
+    QVERIFY(proc.waitForStarted());
+
+    QTestEventLoop::instance().enterLoop(5);
+    QVERIFY(con.interface()->isServiceRegistered(serviceName));
+
+    remote = new QDBusInterface(serviceName, "/", "com.trolltech.autotests.Performance", con, this);
+    QVERIFY(remote->isValid());
+
+    new ServerObject("/", con, this);
+    local = new QDBusInterface(con.baseService(), "/", "com.trolltech.autotests.Performance", con, this);
+    QVERIFY(local->isValid());
+}
+
+void tst_QDBusPerformance::initTestCase_data()
+{
+    QTest::addColumn<bool>("loopback");
+
+    QTest::newRow("normal") << false;
+    QTest::newRow("loopback") << true;
+}
+
+void tst_QDBusPerformance::init()
+{
+    QFETCH_GLOBAL(bool, loopback);
+    if (loopback)
+        target = local;
+    else
+        target = remote;
+}
+
+void tst_QDBusPerformance::callSpeed()
+{
+    QElapsedTimer timer;
+
+    int callCount = 0;
+    timer.start();
+    while (timer.elapsed() < runTime) {
+        QDBusReply<void> reply = target->call("nothing");
+        QVERIFY(reply.isValid());
+
+        ++callCount;
+    }
+    qDebug() << callCount << "calls in" << timer.elapsed() << "ms:"
+             << (callCount * 1000.0 / timer.elapsed()) << "calls/sec";
+}
+
+bool tst_QDBusPerformance::executeTest(const char *funcname, int size, const QVariant &data)
+{
+    QElapsedTimer timer;
+
+    int callCount = 0;
+    qint64 transferred = 0;
+    timer.start();
+    while (timer.elapsed() < runTime) {
+        QDBusMessage reply = target->call(funcname, data);
+        if (reply.type() != QDBusMessage::ReplyMessage)
+            return false;
+
+        transferred += size;
+        ++callCount;
+    }
+    qDebug() << transferred << "bytes in" << timer.elapsed() << "ms"
+             << "(in" << callCount << "calls):"
+             << (transferred * 1000.0 / timer.elapsed() / 1024 / 1024) << "MB/s";
+
+    return true;
+}
+
+void tst_QDBusPerformance::oneWay_data()
+{
+    QTest::addColumn<QVariant>("data");
+    QTest::addColumn<int>("size");
+
+    QByteArray ba(256, 'a');
+    while (ba.size() < 8193) {
+        QTest::newRow(QString("%1-byteArray").arg(ba.size()).toAscii()) << qVariantFromValue(ba) << ba.size();
+        ba += ba;
+    }
+
+    QString s(256, QLatin1Char('a'));
+    while (s.size() < 8193) {
+        QTest::newRow(QString("%1-string").arg(s.size()).toAscii()) << qVariantFromValue(s) << s.size();
+        s += s;
+    }
+}
+
+void tst_QDBusPerformance::oneWay()
+{
+    QFETCH(QVariant, data);
+    QFETCH(int, size);
+
+    QVERIFY(executeTest("size", size, data));
+}
+
+void tst_QDBusPerformance::oneWayVariant_data()
+{
+    oneWay_data();
+}
+
+void tst_QDBusPerformance::oneWayVariant()
+{
+    QFETCH(QVariant, data);
+    QFETCH(int, size);
+
+    QVERIFY(executeTest("size", size, qVariantFromValue(QDBusVariant(data))));
+}
+
+void tst_QDBusPerformance::roundTrip_data()
+{
+    oneWay_data();
+}
+
+void tst_QDBusPerformance::roundTrip()
+{
+    QFETCH(QVariant, data);
+    QFETCH(int, size);
+
+    QVERIFY(executeTest("echo", size, data));
+}
+
+void tst_QDBusPerformance::roundTripVariant_data()
+{
+    oneWay_data();
+}
+
+void tst_QDBusPerformance::roundTripVariant()
+{
+    QFETCH(QVariant, data);
+    QFETCH(int, size);
+
+    QVERIFY(executeTest("echo", size, qVariantFromValue(QDBusVariant(data))));
+}
+
+QTEST_MAIN(tst_QDBusPerformance)
+#include "tst_qdbusperformance.moc"
-- 
cgit v0.12


From eb0262ae71d4a8576cd8ba5885d8218c9f566371 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 23 Feb 2011 17:02:23 +0100
Subject: Add a benchmark for testing our QtDBus type-validation

Our code is much faster than libdbus-1, even when built in debug mode.
---
 tests/benchmarks/dbus/dbus.pro                |   3 +-
 tests/benchmarks/dbus/qdbustype/main.cpp      | 115 ++++++++++++++++++++++++++
 tests/benchmarks/dbus/qdbustype/qdbustype.pro |   8 ++
 3 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100644 tests/benchmarks/dbus/qdbustype/main.cpp
 create mode 100644 tests/benchmarks/dbus/qdbustype/qdbustype.pro

diff --git a/tests/benchmarks/dbus/dbus.pro b/tests/benchmarks/dbus/dbus.pro
index b02d070..989a0db 100644
--- a/tests/benchmarks/dbus/dbus.pro
+++ b/tests/benchmarks/dbus/dbus.pro
@@ -1,3 +1,4 @@
 TEMPLATE = subdirs
 SUBDIRS = \
-        qdbusperformance
+        qdbusperformance \
+        qdbustype
diff --git a/tests/benchmarks/dbus/qdbustype/main.cpp b/tests/benchmarks/dbus/qdbustype/main.cpp
new file mode 100644
index 0000000..abaae7e
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbustype/main.cpp
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtCore/QCoreApplication>
+
+#include <QtDBus/private/qdbusutil_p.h>
+
+#include <dbus/dbus.h>
+
+class tst_QDBusType: public QObject
+{
+    Q_OBJECT
+private Q_SLOTS:
+    void benchmarkSignature_data();
+    void benchmarkSignature();
+};
+
+static inline void benchmarkAddRow(const char *name, const char *data)
+{
+    QTest::newRow(QByteArray("native-") + name) << data << true;
+    QTest::newRow(name) << data << false;
+}
+
+void tst_QDBusType::benchmarkSignature_data()
+{
+    QTest::addColumn<QString>("data");
+    QTest::addColumn<bool>("useNative");
+
+    for (int loopCount = 0; loopCount < 2; ++loopCount) {
+        bool useNative = loopCount;
+        QByteArray prefix = useNative ? "native-" : "";
+
+        benchmarkAddRow("single-invalid", "~");
+        benchmarkAddRow("single-invalid-array", "a~");
+        benchmarkAddRow("single-invalid-struct", "(.)");
+
+        benchmarkAddRow("single-char", "b");
+        benchmarkAddRow("single-array", "as");
+        benchmarkAddRow("single-simplestruct", "(y)");
+        benchmarkAddRow("single-simpledict", "a{sv}");
+        benchmarkAddRow("single-complexdict", "a{s(aya{io})}");
+
+        benchmarkAddRow("multiple-char", "ssg");
+        benchmarkAddRow("multiple-arrays", "asasay");
+
+        benchmarkAddRow("struct-missingclose", "(ayyyy");
+        benchmarkAddRow("longstruct", "(yyyyyyayasy)");
+        benchmarkAddRow("invalid-longstruct", "(yyyyyyayas.y)");
+        benchmarkAddRow("complexstruct", "(y(aasay)oga{sv})");
+        benchmarkAddRow("multiple-simple-structs", "(y)(y)(y)");
+    }
+}
+
+void tst_QDBusType::benchmarkSignature()
+{
+    QFETCH(QString, data);
+    QFETCH(bool, useNative);
+
+    bool result;
+    if (useNative) {
+        dbus_signature_validate(data.toLatin1(), 0);
+        QBENCHMARK {
+            result = dbus_signature_validate(data.toLatin1(), 0);
+        }
+    } else {
+        QDBusUtil::isValidSignature(data);
+        QBENCHMARK {
+            result = QDBusUtil::isValidSignature(data);
+        }
+    }
+    Q_UNUSED(result);
+}
+
+QTEST_MAIN(tst_QDBusType)
+
+#include "main.moc"
diff --git a/tests/benchmarks/dbus/qdbustype/qdbustype.pro b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
new file mode 100644
index 0000000..d480a05
--- /dev/null
+++ b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
@@ -0,0 +1,8 @@
+load(qttest_p4)
+TARGET = tst_bench_qdbustype
+QT -= gui
+QT += dbus
+QMAKE_CXXFLAGS += $$QT_CFLAGS_DBUS
+LIBS_PRIVATE += $$QT_LIBS_DBUS
+
+SOURCES += main.cpp
-- 
cgit v0.12


From 162ee8d83c72990c33952a99bd959f18842dde10 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Fri, 28 Jan 2011 11:14:46 +0100
Subject: Change the error message in the timer ID deallocator.

This is really an internal error since the upper layers of the
event dispatcher should have already caught a timer ID that
isn't valid.

Reviewed-By: Olivier Goffart
---
 src/corelib/kernel/qabstracteventdispatcher.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index e79f87a..07f04b2 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -187,7 +187,8 @@ void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId)
     int at = bucketIndex(bucket, which);
     int *b = timerIds[bucket];
 
-    Q_ASSERT(b[at] == -timerId);
+    Q_ASSERT_X(timerId == -b[at], "QAbstractEventDispatcher::releaseTimerId",
+               "Internal error: timer ID not found");
 
     int freeId, newTimerId;
     do {
-- 
cgit v0.12


From 8f08be2bd372c581d578ed81c2f57cf1adc0ae79 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 13 Dec 2010 17:22:33 +0100
Subject: Change the number of entries in the first timer bucket.

8 timers are too few for common applications. 32 is more likely
to reach >90% of the applications. This way, we avoid a memory
allocation.

Reviewed-by: Olivier Goffart
---
 src/corelib/kernel/qabstracteventdispatcher.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index 07f04b2..b1b1380 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -49,14 +49,18 @@
 QT_BEGIN_NAMESPACE
 
 // we allow for 2^24 = 8^8 = 16777216 simultaneously running timers
-enum { NumberOfBuckets = 8, FirstBucketSize = 8 };
+enum { NumberOfBuckets = 8, FirstBucketSize = 32 };
 
 static const int BucketSize[NumberOfBuckets] =
-    { 8, 64, 512, 4096, 32768, 262144, 2097152, 16777216 - 2396744 };
+    { 32, 64, 512, 4096, 32768, 262144, 2097152, 16777216 - 2364000 };
 static const int BucketOffset[NumberOfBuckets] =
-    { 0,  8,  72,  584,  4680,  37448,  299592,  2396744 };
+    { 0,  32,  96,  608,  4704,  37448,  266848,  2364000 };
+
+static int FirstBucket[] = {
+     1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
+    17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
+};
 
-static int FirstBucket[FirstBucketSize] = { 1, 2, 3, 4, 5, 6, 7, 8 };
 static QBasicAtomicPointer<int> timerIds[NumberOfBuckets] =
     { Q_BASIC_ATOMIC_INITIALIZER(FirstBucket),
       Q_BASIC_ATOMIC_INITIALIZER(0),
-- 
cgit v0.12


From 5cca700ee5ecc5b5c06851137703455fcce9c24b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 13 Apr 2011 14:02:01 +0200
Subject: Fix configure for Lighthouse

Dont assume that we are QWS :)
---
 configure | 76 ++++++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 43 insertions(+), 33 deletions(-)

diff --git a/configure b/configure
index 167ae1b..43615a1 100755
--- a/configure
+++ b/configure
@@ -3701,6 +3701,9 @@ Usage:  $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir
 
 Installation options:
 
+    -qpa ................ This will enable the QPA build.
+                          QPA is a window system agnostic implementation of Qt.
+
  These are optional, but you may specify install directories.
 
     -prefix <dir> ...... This will install everything relative to <dir>
@@ -3870,7 +3873,8 @@ fi
                          See the README file for a list of supported
                          operating systems and compilers.
 EOF
-if [ "${PLATFORM_QWS}" != "yes" ]; then
+
+if [ "${PLATFORM_QWS}" != "yes" -a "${PLATFORM_QPA}" != "yes" ]; then
 cat << EOF
     -graphicssystem <sys> Sets an alternate graphics system. Available options are:
                            raster - Software rasterizer
@@ -3879,6 +3883,7 @@ cat << EOF
 
 EOF
 fi
+
 cat << EOF
 
     -no-mmx ............ Do not compile with use of MMX instructions.
@@ -4233,10 +4238,24 @@ Qt/Mac only:
 EOF
 fi
 
-if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
+    cat << EOF
+Qt for Embedded Linux:
+
+    -embedded <arch> .... This will enable the embedded build, you must have a
+                          proper license for this switch to work.
+                          Example values for <arch>: arm mips x86 generic
+EOF
+fi
+
+if [ "$PLATFORM_QPA" = "yes" ]; then
     cat << EOF
+Qt for QPA only:
+EOF
+fi
 
-Qt for Embedded Linux only:
+if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+    cat << EOF
 
     -xplatform target ... The target platform when cross-compiling.
 
@@ -4244,14 +4263,6 @@ Qt for Embedded Linux only:
     -feature-<feature> .. Compile in <feature>. The available features
                           are described in src/corelib/global/qfeatures.txt
 
-    -embedded <arch> .... This will enable the embedded build, you must have a
-                          proper license for this switch to work.
-                          Example values for <arch>: arm mips x86 generic
-
-    -qpa <arch> ......... This will enable the QPA build.
-                          Example values for <arch>: arm mips x86 generic
-                          QPA is a window system agnostic implementation of Qt.
-
     -armfpa ............. Target platform uses the ARM-FPA floating point format.
     -no-armfpa .......... Target platform does not use the ARM-FPA floating point format.
 
@@ -4276,6 +4287,17 @@ Qt for Embedded Linux only:
     -qconfig local ...... Use src/corelib/global/qconfig-local.h rather than the
                           default ($CFG_QCONFIG).
 
+    -no-opengl .......... Do not support OpenGL.
+    -opengl <api> ....... Enable OpenGL ES support
+                          With no parameter, this will attempt to auto-detect OpenGL ES 1.x
+                          or 2.x, or regular desktop OpenGL.
+                          Use es1 or es2 for <api> to override auto-detection.
+EOF
+fi
+
+if [ "$PLATFORM_QWS" = "yes" ]; then
+    cat << EOF
+
     -depths <list> ...... Comma-separated list of supported bit-per-pixel
                           depths, from: 1, 4, 8, 12, 15, 16, 18, 24, 32 and 'all'.
 
@@ -4288,14 +4310,6 @@ Qt for Embedded Linux only:
     -no-decoration-<style> ....Disable decoration <style> entirely.
                                Possible values for <style>: [ $CFG_DECORATION_AVAILABLE ]
 
-    -no-opengl .......... Do not support OpenGL.
-    -opengl <api> ....... Enable OpenGL ES support
-                          With no parameter, this will attempt to auto-detect OpenGL ES 1.x
-                          or 2.x. Use es1 or es2 for <api> to override auto-detection.
-
-                          NOTE: A QGLScreen driver for the hardware is required to support
-                                OpenGL ES on Qt for Embedded Linux.
-
     -qt-gfx-<driver> ... Enable a graphics <driver> in the QtGui library.
                          Possible values for <driver>: [ $CFG_GFX_AVAILABLE ]
     -plugin-gfx-<driver> Enable graphics <driver> as a plugin to be
@@ -4327,7 +4341,6 @@ Qt for Embedded Linux only:
 EOF
 fi
 
-
 if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" -o "$PLATFORM_X11" = "yes" ]; then
     if [ "$CFG_GLIB" = "no" ]; then
         GBY=" "
@@ -4365,8 +4378,10 @@ fi # Help
 # LICENSING, INTERACTIVE PART
 # -----------------------------------------------------------------------------
 
-if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
     Platform="Qt for Embedded Linux"
+elif [ "$PLATFORM_QPA" = "yes" ]; then
+    Platform="Qt Lighthouse"
 elif [ "$XPLATFORM_SYMBIAN" = "yes" ]; then
     Platform="Qt for Symbian"
 elif [ "$PLATFORM_MAC" = "yes" ]; then
@@ -6276,7 +6291,7 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
     fi
 fi
 
-if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
 
     # screen drivers
     for screen in ${CFG_GFX_ON} ${CFG_GFX_PLUGIN}; do
@@ -6775,7 +6790,7 @@ fi
 #-------------------------------------------------------------------------------
 
 ### fix this: user input should be validated in a loop
-if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
     PROMPT_FOR_DEPTHS="yes"
 else
     PROMPT_FOR_DEPTHS="no"
@@ -6976,13 +6991,8 @@ else
 fi
 
 if [ "$CFG_OPENGL" = "es1" ] || [ "$CFG_OPENGL" = "es2" ]; then
-    if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
-	if [ "$PLATFORM_QWS" = "yes" ]; then
-	    QCONFIG_FLAGS="$QCONFIG_FLAGS Q_BACKINGSTORE_SUBSURFACES"
-	else
-	    echo "### Q_BACKINGSTORE_SUBSURFACES disabled, re-enable once it compiles again"
-	fi
-	QCONFIG_FLAGS="$QCONFIG_FLAGS Q_USE_EGLWINDOWSURFACE"
+    if [ "$PLATFORM_QWS" = "yes" ]; then
+        QCONFIG_FLAGS="$QCONFIG_FLAGS Q_BACKINGSTORE_SUBSURFACES"
     fi
     QCONFIG_FLAGS="$QCONFIG_FLAGS QT_OPENGL_ES"
 fi
@@ -8110,7 +8120,7 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
 [ "$CFG_SXE" = "no" ]        && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SXE"
 [ "$CFG_DBUS" = "no" ]      && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_DBUS"
 
-if [ "$PLATFORM_QWS" != "yes" ]; then
+if [ "$PLATFORM_QWS" != "yes" -a "$PLATFORM_QPA" != "yes" ]; then
     [ "$CFG_GRAPHICS_SYSTEM" = "raster" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_RASTER"
     [ "$CFG_GRAPHICS_SYSTEM" = "opengl" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_OPENGL"
     [ "$CFG_GRAPHICS_SYSTEM" = "openvg" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_OPENVG"
@@ -8598,7 +8608,7 @@ if [ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ]; then
     echo "iWMMXt support ......... ${CFG_IWMMXT}"
     echo "NEON support ........... ${CFG_NEON}"
 fi
-[ "${PLATFORM_QWS}" != "yes" ] && echo "Graphics System ........ $CFG_GRAPHICS_SYSTEM"
+[ "${PLATFORM_QWS}" != "yes" -a "${PLATFORM_QPA}" != "yes" ] && echo "Graphics System ........ $CFG_GRAPHICS_SYSTEM"
 echo "IPv6 support ........... $CFG_IPV6"
 echo "IPv6 ifname support .... $CFG_IPV6IFNAME"
 echo "getaddrinfo support .... $CFG_GETADDRINFO"
@@ -8634,7 +8644,7 @@ else
 fi
 echo "zlib support ........... $CFG_ZLIB"
 echo "Session management ..... $CFG_SM"
-if [ "$PLATFORM_QWS" = "yes"  -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
     echo "Embedded support ....... $CFG_EMBEDDED"
     if [ "$CFG_QWS_FREETYPE" = "auto" ]; then
 	echo "Freetype2 support ...... $CFG_QWS_FREETYPE ($CFG_LIBFREETYPE)"
-- 
cgit v0.12


From 08b80d666ab4e6f06b30228ac14fd9f98716b5ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Wed, 13 Apr 2011 15:04:53 +0200
Subject: Wayland: Conform with the api change in the frame callback

---
 src/plugins/platforms/wayland/qwaylanddisplay.cpp | 4 ++--
 src/plugins/platforms/wayland/qwaylanddisplay.h   | 2 +-
 src/plugins/platforms/wayland/qwaylandwindow.cpp  | 4 ++--
 src/plugins/platforms/wayland/qwaylandwindow.h    | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
index eb9e791..1c56561 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -163,9 +163,9 @@ void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data)
     wl_display_sync_callback(mDisplay, func, data);
 }
 
-void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, void *data)
+void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, struct wl_surface *surface, void *data)
 {
-    wl_display_frame_callback(mDisplay, func, data);
+    wl_display_frame_callback(mDisplay, surface, func, data);
 }
 
 void QWaylandDisplay::flushRequests()
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
index 3ddbfb2..a2cb1b2 100644
--- a/src/plugins/platforms/wayland/qwaylanddisplay.h
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -77,7 +77,7 @@ public:
     void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
 
     void syncCallback(wl_display_sync_func_t func, void *data);
-    void frameCallback(wl_display_frame_func_t func, void *data);
+    void frameCallback(wl_display_frame_func_t func, struct wl_surface *surface, void *data);
 
     struct wl_display *wl_display() const { return mDisplay; }
 
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index 7e94fb9..6f52291 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -125,7 +125,7 @@ void QWaylandWindow::damage(const QRegion &region)
 {
     //We have to do sync stuff before calling damage, or we might
     //get a frame callback before we get the timestamp
-    mDisplay->frameCallback(QWaylandWindow::frameCallback, this);
+    mDisplay->frameCallback(QWaylandWindow::frameCallback, mSurface, this);
     mWaitingForFrameSync = true;
 
     QVector<QRect> rects = region.rects();
@@ -143,7 +143,7 @@ void QWaylandWindow::newSurfaceCreated()
     }
 }
 
-void QWaylandWindow::frameCallback(void *data, uint32_t time)
+void QWaylandWindow::frameCallback(struct wl_surface *surface, void *data, uint32_t time)
 {
     Q_UNUSED(time);
     QWaylandWindow *self = static_cast<QWaylandWindow*>(data);
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
index 35b82bd..1e60508 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -84,7 +84,7 @@ protected:
     QWaitCondition mFrameSyncWait;
 
 private:
-    static void frameCallback(void *data, uint32_t time);
+    static void frameCallback(struct wl_surface *surface, void *data, uint32_t time);
 
 
 };
-- 
cgit v0.12


From 8ca6c8d7728a3ab1982b6fd416aec97a369fabeb Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 14 Apr 2011 10:34:43 +0200
Subject: Some virtual keyboard text input for uikit.

It is very limited as is. But it handles Qt's RequestSoftwareInputPanel
and CloseSoftwareInputPanel events.
---
 src/plugins/platforms/uikit/quikiteventloop.h      |  4 ++
 src/plugins/platforms/uikit/quikiteventloop.mm     | 23 ++++++++
 .../platforms/uikit/quikitsoftwareinputhandler.h   | 18 ++++++
 src/plugins/platforms/uikit/quikitwindow.h         | 24 +++++++-
 src/plugins/platforms/uikit/quikitwindow.mm        | 69 +++++++++++++++++++++-
 src/plugins/platforms/uikit/uikit.pro              |  2 +
 6 files changed, 136 insertions(+), 4 deletions(-)
 create mode 100644 src/plugins/platforms/uikit/quikitsoftwareinputhandler.h

diff --git a/src/plugins/platforms/uikit/quikiteventloop.h b/src/plugins/platforms/uikit/quikiteventloop.h
index cf5c682..b81e0fd 100644
--- a/src/plugins/platforms/uikit/quikiteventloop.h
+++ b/src/plugins/platforms/uikit/quikiteventloop.h
@@ -42,6 +42,9 @@
 #ifndef QUIKITEVENTLOOP_H
 #define QUIKITEVENTLOOP_H
 
+#include "quikitsoftwareinputhandler.h"
+
+#include <QtCore/QEvent>
 #include <QtGui/QPlatformEventLoopIntegration>
 
 @class EventLoopHelper;
@@ -61,6 +64,7 @@ public:
 
     EventLoopHelper *mHelper;
     NSTimer *mTimer;
+    QUIKitSoftwareInputHandler *mInputHandler;
 };
 
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikiteventloop.mm b/src/plugins/platforms/uikit/quikiteventloop.mm
index d3afd86..8d2603c 100644
--- a/src/plugins/platforms/uikit/quikiteventloop.mm
+++ b/src/plugins/platforms/uikit/quikiteventloop.mm
@@ -124,6 +124,7 @@ QT_BEGIN_NAMESPACE
 QUIKitEventLoop::QUIKitEventLoop()
 {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    mInputHandler = new QUIKitSoftwareInputHandler;
     mHelper = [[EventLoopHelper alloc] initWithEventLoopIntegration:this];
     mTimer = [[NSTimer timerWithTimeInterval:0.030 target:mHelper selector:@selector(processEventsAndSchedule) userInfo:nil repeats:YES] retain];
     [pool release];
@@ -133,10 +134,12 @@ QUIKitEventLoop::~QUIKitEventLoop()
 {
     [mTimer release];
     [mHelper release];
+    delete mInputHandler;
 }
 
 void QUIKitEventLoop::startEventLoop()
 {
+    qApp->installEventFilter(mInputHandler);
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     [[NSRunLoop currentRunLoop] addTimer:[mTimer autorelease] forMode:NSDefaultRunLoopMode];
     UIApplicationMain(qApp->argc(), qApp->argv(), nil, @"QUIKitAppDelegate");
@@ -153,4 +156,24 @@ void QUIKitEventLoop::qtNeedsToProcessEvents()
     [mHelper performSelectorOnMainThread:@selector(processEvents) withObject:nil waitUntilDone:NO];
 }
 
+bool QUIKitSoftwareInputHandler::eventFilter(QObject *obj, QEvent *event)
+{
+    if (event->type() == QEvent::RequestSoftwareInputPanel) {
+        QWidget *widget = qobject_cast<QWidget *>(obj);
+        if (widget) {
+            QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
+            [platformWindow->nativeView() becomeFirstResponder];
+            return true;
+        }
+    } else if (event->type() == QEvent::CloseSoftwareInputPanel) {
+        QWidget *widget = qobject_cast<QWidget *>(obj);
+        if (widget) {
+            QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
+            [platformWindow->nativeView() resignFirstResponder];
+            return true;
+        }
+    }
+    return false;
+}
+
 QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
new file mode 100644
index 0000000..c0a5c25
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
@@ -0,0 +1,18 @@
+#ifndef QUIKITSOFTWAREINPUTHANDLER_H
+#define QUIKITSOFTWAREINPUTHANDLER_H
+
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitSoftwareInputHandler : public QObject
+{
+    Q_OBJECT
+
+public:
+    bool eventFilter(QObject *obj, QEvent *event);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/uikit/quikitwindow.h b/src/plugins/platforms/uikit/quikitwindow.h
index f6d2c27..9e73754 100644
--- a/src/plugins/platforms/uikit/quikitwindow.h
+++ b/src/plugins/platforms/uikit/quikitwindow.h
@@ -49,7 +49,7 @@
 #import <OpenGLES/ES1/glext.h>
 #import <OpenGLES/EAGL.h>
 
-@interface EAGLView : UIView
+@interface EAGLView : UIView <UIKeyInput>
 {
     QPlatformWindow *mWindow;
     EAGLContext *mContext;
@@ -58,6 +58,15 @@
     GLint mFramebufferHeight;
 
     GLuint mFramebuffer, mColorRenderbuffer, mDepthRenderbuffer;
+
+    // ------- Text Input ----------
+    UITextAutocapitalizationType autocapitalizationType;
+    UITextAutocorrectionType autocorrectionType;
+    BOOL enablesReturnKeyAutomatically;
+    UIKeyboardAppearance keyboardAppearance;
+    UIKeyboardType keyboardType;
+    UIReturnKeyType returnKeyType;
+    BOOL secureTextEntry;
 }
 
 - (void)setContext:(EAGLContext *)newContext;
@@ -67,6 +76,18 @@
 - (void)makeCurrent;
 - (void)setWindow:(QPlatformWindow *)window;
 - (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons;
+
+
+// ------- Text Input ----------
+
+@property(nonatomic) UITextAutocapitalizationType autocapitalizationType;
+@property(nonatomic) UITextAutocorrectionType autocorrectionType;
+@property(nonatomic) BOOL enablesReturnKeyAutomatically;
+@property(nonatomic) UIKeyboardAppearance keyboardAppearance;
+@property(nonatomic) UIKeyboardType keyboardType;
+@property(nonatomic) UIReturnKeyType returnKeyType;
+@property(nonatomic, getter=isSecureTextEntry) BOOL secureTextEntry;
+
 @end
 
 class EAGLPlatformContext;
@@ -82,6 +103,7 @@ public:
     ~QUIKitWindow();
 
     UIWindow *nativeWindow() const { return mWindow; }
+    UIView *nativeView() const { return mView; }
     void setGeometry(const QRect &rect);
 
     UIWindow *ensureNativeWindow();
diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
index aafbfa1..ff60de7 100644
--- a/src/plugins/platforms/uikit/quikitwindow.mm
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -46,6 +46,8 @@
 #include "quikitscreen.h"
 
 #include <QtDebug>
+#include <QtGui/QApplication>
+#include <QtGui/QKeyEvent>
 #include <QtGui/QPlatformGLContext>
 #include <QtGui/QWindowSystemInterface>
 
@@ -120,15 +122,22 @@ private:
     return [CAEAGLLayer class];
 }
 
-- (id)init
+- (id)initWithFrame:(CGRect)frame
 {
-    if ((self = [super init])) {
+    if ((self = [super initWithFrame:frame])) {
         CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
         eaglLayer.opaque = TRUE;
         eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                         [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
                                         kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
                                         nil];
+        autocapitalizationType = UITextAutocapitalizationTypeNone;
+        autocorrectionType = UITextAutocorrectionTypeNo;
+        enablesReturnKeyAutomatically = NO;
+        keyboardAppearance = UIKeyboardAppearanceDefault;
+        keyboardType = UIKeyboardTypeDefault;
+        returnKeyType = UIReturnKeyDone;
+        secureTextEntry = NO;
     }
     return self;
 }
@@ -246,6 +255,61 @@ private:
     [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
 }
 
+// ------- Text Input ----------
+
+@synthesize autocapitalizationType;
+@synthesize autocorrectionType;
+@synthesize enablesReturnKeyAutomatically;
+@synthesize keyboardAppearance;
+@synthesize keyboardType;
+@synthesize returnKeyType;
+@synthesize secureTextEntry;
+
+- (BOOL)canBecomeFirstResponder
+{
+    return YES;
+}
+
+- (BOOL)hasText
+{
+    return YES;
+}
+
+- (void)insertText:(NSString *)text
+{
+    QKeyEvent *ev;
+    int key = 0;
+    if ([text isEqualToString:@"\n"])
+        key = (int)Qt::Key_Return;
+    ev = new QKeyEvent(QEvent::KeyPress,
+                       key,
+                       Qt::NoModifier,
+                       QString::fromUtf8([text UTF8String])
+                       );
+    qApp->postEvent(qApp->focusWidget(), ev);
+    ev = new QKeyEvent(QEvent::KeyRelease,
+                       key,
+                       Qt::NoModifier,
+                       QString::fromUtf8([text UTF8String])
+                       );
+    qApp->postEvent(qApp->focusWidget(), ev);
+}
+
+- (void)deleteBackward
+{
+    QKeyEvent *ev;
+    ev = new QKeyEvent(QEvent::KeyPress,
+                       (int)Qt::Key_Backspace,
+                       Qt::NoModifier
+                       );
+    qApp->postEvent(qApp->focusWidget(), ev);
+    ev = new QKeyEvent(QEvent::KeyRelease,
+                       (int)Qt::Key_Backspace,
+                       Qt::NoModifier
+                       );
+    qApp->postEvent(qApp->focusWidget(), ev);
+}
+
 @end
 
 QT_BEGIN_NAMESPACE
@@ -284,7 +348,6 @@ UIWindow *QUIKitWindow::ensureNativeWindow()
 {
     if (!mWindow) {
         // window
-        CGRect screenBounds = [mScreen->uiScreen() bounds];
         QRect geom = geometry();
         CGRect frame = CGRectMake(geom.x(), geom.y(), geom.width(), geom.height());
         mWindow = [[UIWindow alloc] initWithFrame:frame];
diff --git a/src/plugins/platforms/uikit/uikit.pro b/src/plugins/platforms/uikit/uikit.pro
index 1589ee9..6f5947f 100644
--- a/src/plugins/platforms/uikit/uikit.pro
+++ b/src/plugins/platforms/uikit/uikit.pro
@@ -17,6 +17,8 @@ OBJECTIVE_HEADERS = quikitintegration.h \
     quikiteventloop.h \
     quikitwindowsurface.h
 
+HEADERS = quikitsoftwareinputhandler.h
+
 #add libz for freetype.
 LIBS += -lz
 
-- 
cgit v0.12


From 25fe0f83759649af218ea7eecd849dc0a311afbc Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Thu, 14 Apr 2011 10:51:09 +0200
Subject: Fix compilation if D-Bus 1.4 isn't present.

---
 src/dbus/qdbusintegrator.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index aaf19cf..d6fbe80 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -1682,6 +1682,9 @@ static QDBusConnection::ConnectionCapabilities connectionCapabilies(DBusConnecti
         return result;
 # endif
 
+#ifndef DBUS_TYPE_UNIX_FD
+# define DBUS_TYPE_UNIX_FD int('h')
+#endif
     if (q_dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD))
         result |= QDBusConnection::UnixFileDescriptorPassing;
 #endif
-- 
cgit v0.12


From 0d3044b547614cbd313d90021606af1f81fb10de Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Thu, 25 Nov 2010 22:40:34 +0100
Subject: Fix strict-alias breaking warnings with GCC.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

GCC doesn't like any kind of reinterpret_cast or C-style cast with
pointers. So instead do the work with static_cast<>, which it seems to
like.

Also took the opportunity to change the generic payload type to void*,
so the alignment works as expected. I wonder how we haven't had
serious crashes so far on ARM...

Reviewed-by: Samuel Rødal
---
 .../qml/qdeclarativeobjectscriptclass.cpp          | 115 +++++++++++++--------
 1 file changed, 72 insertions(+), 43 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index dc3ecca..a2411b9 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -632,7 +632,6 @@ QDeclarativeObjectMethodScriptClass::property(Object *, const Identifier &name)
 
 namespace {
 struct MetaCallArgument {
-    inline MetaCallArgument();
     inline ~MetaCallArgument();
     inline void *dataPtr();
 
@@ -640,15 +639,45 @@ struct MetaCallArgument {
     void fromScriptValue(int type, QDeclarativeEngine *, const QScriptValue &);
     inline QScriptDeclarativeClass::Value toValue(QDeclarativeEngine *);
 
+protected:
+    inline MetaCallArgument();
+
 private:
     MetaCallArgument(const MetaCallArgument &);
+    template <typename T> T &as();
 
     inline void cleanup();
 
-    char data[4 * sizeof(void *)];
     int type;
     bool isObjectType;
+    char padding[6]; // ensure sizeof(MetaCallArgument) == 8
+};
+
+template <typename T> struct TypedMetaCallArgument: public MetaCallArgument
+{
+    T data;
+protected:
+    TypedMetaCallArgument() {}
+    ~TypedMetaCallArgument() {}
+private:
+    TypedMetaCallArgument(const TypedMetaCallArgument &);
 };
+
+struct GenericPayload { void *data[4]; };
+struct GenericMetaCallArgument: public TypedMetaCallArgument<GenericPayload>
+{
+};
+
+template <typename T> T &MetaCallArgument::as()
+{
+#ifdef Q_ALIGNOF
+    // static assert
+    char dummy_array[Q_ALIGNOF(T) <= sizeof(*this) ? 1 : -1]; Q_UNUSED(dummy_array);
+#endif
+    TypedMetaCallArgument<T> &typed = static_cast<TypedMetaCallArgument<T> &>(*this);
+    return typed.data;
+}
+
 }
 
 MetaCallArgument::MetaCallArgument()
@@ -664,22 +693,22 @@ MetaCallArgument::~MetaCallArgument()
 void MetaCallArgument::cleanup()
 {
     if (type == QMetaType::QString) {
-        ((QString *)&data)->~QString();
+        as<QString>().~QString();
     } else if (type == -1 || type == qMetaTypeId<QVariant>()) {
-        ((QVariant *)&data)->~QVariant();
+        as<QVariant>().~QVariant();
     } else if (type == qMetaTypeId<QScriptValue>()) {
-        ((QScriptValue *)&data)->~QScriptValue();
+        as<QScriptValue>().~QScriptValue();
     } else if (type == qMetaTypeId<QList<QObject *> >()) {
-        ((QList<QObject *> *)&data)->~QList<QObject *>();
+        as<QList<QObject *> >().~QList<QObject *>();
     }
 }
 
 void *MetaCallArgument::dataPtr()
 {
     if (type == -1)
-        return ((QVariant *)data)->data();
+        return as<QVariant>().data();
     else
-        return (void *)&data;
+        return &as<GenericPayload>();
 }
 
 void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
@@ -690,7 +719,7 @@ void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
     QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e);
 
     if (callType == qMetaTypeId<QScriptValue>()) {
-        new (&data) QScriptValue(engine->undefinedValue());
+        new (&as<QScriptValue>()) QScriptValue(engine->undefinedValue());
         type = callType;
     } else if (callType == QMetaType::Int ||
                callType == QMetaType::UInt ||
@@ -699,20 +728,20 @@ void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
                callType == QMetaType::Float) {
         type = callType;
     } else if (callType == QMetaType::QObjectStar) {
-        *((QObject **)&data) = 0;
+        as<QObject *>() = 0;
         type = callType;
     } else if (callType == QMetaType::QString) {
-        new (&data) QString();
+        new (&as<QString>()) QString();
         type = callType;
     } else if (callType == qMetaTypeId<QVariant>()) {
         type = callType;
-        new (&data) QVariant();
+        new (&as<QVariant>()) QVariant();
     } else if (callType == qMetaTypeId<QList<QObject *> >()) {
         type = callType;
-        new (&data) QList<QObject *>();
+        new (&as<QList<QObject *> >()) QList<QObject *>();
     } else {
         type = -1;
-        new (&data) QVariant(callType, (void *)0);
+        new (&as<QVariant>()) QVariant(callType, (void *)0);
     }
 }
 
@@ -721,37 +750,37 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
     if (type != 0) { cleanup(); type = 0; }
 
     if (callType == qMetaTypeId<QScriptValue>()) {
-        new (&data) QScriptValue(value);
+        new (&as<QScriptValue>()) QScriptValue(value);
         type = qMetaTypeId<QScriptValue>();
     } else if (callType == QMetaType::Int) {
-        *((int *)&data) = int(value.toInt32());
+        as<int>() = int(value.toInt32());
         type = callType;
     } else if (callType == QMetaType::UInt) {
-        *((uint *)&data) = uint(value.toUInt32());
+        as<uint>() = uint(value.toUInt32());
         type = callType;
     } else if (callType == QMetaType::Bool) {
-        *((bool *)&data) = value.toBool();
+        as<bool>() = value.toBool();
         type = callType;
     } else if (callType == QMetaType::Double) {
-        *((double *)&data) = double(value.toNumber());
+        as<double>() = double(value.toNumber());
         type = callType;
     } else if (callType == QMetaType::Float) {
-        *((float *)&data) = float(value.toNumber());
+        as<float>() = float(value.toNumber());
         type = callType;
     } else if (callType == QMetaType::QString) {
         if (value.isNull() || value.isUndefined())
-            new (&data) QString();
+            new (&as<QString>()) QString();
         else
-            new (&data) QString(value.toString());
+            new (&as<QString>()) QString(value.toString());
         type = callType;
     } else if (callType == QMetaType::QObjectStar) {
-        *((QObject **)&data) = value.toQObject();
+        as<QObject *>() = value.toQObject();
         type = callType;
     } else if (callType == qMetaTypeId<QVariant>()) {
-        new (&data) QVariant(QDeclarativeEnginePrivate::get(engine)->scriptValueToVariant(value));
+        new (&as<QVariant>()) QVariant(QDeclarativeEnginePrivate::get(engine)->scriptValueToVariant(value));
         type = callType;
     } else if (callType == qMetaTypeId<QList<QObject*> >()) {
-        QList<QObject *> *list = new (&data) QList<QObject *>(); 
+        QList<QObject *> *list = new (&as<QList<QObject *> >()) QList<QObject *>();
         if (value.isArray()) {
             int length = value.property(QLatin1String("length")).toInt32();
             for (int ii = 0; ii < length; ++ii) {
@@ -764,16 +793,16 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
         }
         type = callType;
     } else {
-        new (&data) QVariant();
+        new (&as<QVariant>()) QVariant();
         type = -1;
 
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(engine);
         QVariant v = priv->scriptValueToVariant(value);
         if (v.userType() == callType) {
-            *((QVariant *)&data) = v;
+            as<QVariant>() = v;
         } else if (v.canConvert((QVariant::Type)callType)) {
-            *((QVariant *)&data) = v;
-            ((QVariant *)&data)->convert((QVariant::Type)callType);
+            as<QVariant>() = v;
+            as<QVariant>().convert((QVariant::Type)callType);
         } else if (const QMetaObject *mo = priv->rawMetaObjectForType(callType)) {
             QObject *obj = priv->toQObject(v);
             
@@ -783,9 +812,9 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
                 if (!objMo) obj = 0;
             }
 
-            *((QVariant *)&data) = QVariant(callType, &obj);
+            as<QVariant>() = QVariant(callType, &obj);
         } else {
-            *((QVariant *)&data) = QVariant(callType, (void *)0);
+            as<QVariant>() = QVariant(callType, (void *)0);
         }
     }
 }
@@ -795,27 +824,27 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e)
     QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e);
 
     if (type == qMetaTypeId<QScriptValue>()) {
-        return QScriptDeclarativeClass::Value(engine, *((QScriptValue *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<QScriptValue>());
     } else if (type == QMetaType::Int) {
-        return QScriptDeclarativeClass::Value(engine, *((int *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<int>());
     } else if (type == QMetaType::UInt) {
-        return QScriptDeclarativeClass::Value(engine, *((uint *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<uint>());
     } else if (type == QMetaType::Bool) {
-        return QScriptDeclarativeClass::Value(engine, *((bool *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<bool>());
     } else if (type == QMetaType::Double) {
-        return QScriptDeclarativeClass::Value(engine, *((double *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<double>());
     } else if (type == QMetaType::Float) {
-        return QScriptDeclarativeClass::Value(engine, *((float *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<float>());
     } else if (type == QMetaType::QString) {
-        return QScriptDeclarativeClass::Value(engine, *((QString *)&data));
+        return QScriptDeclarativeClass::Value(engine, as<QString>());
     } else if (type == QMetaType::QObjectStar) {
-        QObject *object = *((QObject **)&data);
+        QObject *object = as<QObject *>();
         if (object)
             QDeclarativeData::get(object, true)->setImplicitDestructible();
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(e);
         return QScriptDeclarativeClass::Value(engine, priv->objectClass->newQObject(object));
     } else if (type == qMetaTypeId<QList<QObject *> >()) {
-        QList<QObject *> &list = *(QList<QObject *>*)&data;
+        QList<QObject *> &list = as<QList<QObject *> >();
         QScriptValue rv = engine->newArray(list.count());
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(e);
         for (int ii = 0; ii < list.count(); ++ii) {
@@ -826,7 +855,7 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e)
         return QScriptDeclarativeClass::Value(engine, rv);
     } else if (type == -1 || type == qMetaTypeId<QVariant>()) {
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(e);
-        QScriptValue rv = ep->scriptValueFromVariant(*((QVariant *)&data));
+        QScriptValue rv = ep->scriptValueFromVariant(as<QVariant>());
         if (rv.isQObject()) {
             QObject *object = rv.toQObject();
             if (object)
@@ -906,7 +935,7 @@ QDeclarativeObjectMethodScriptClass::callMethod(QObject *object, int index,
 {
     if (argCount > 0) {
 
-        QVarLengthArray<MetaCallArgument, 9> args(argCount + 1);
+        QVarLengthArray<GenericMetaCallArgument, 9> args(argCount + 1);
         args[0].initAsType(returnType, engine);
 
         for (int ii = 0; ii < argCount; ++ii)
@@ -922,7 +951,7 @@ QDeclarativeObjectMethodScriptClass::callMethod(QObject *object, int index,
 
     } else if (returnType != 0) {
         
-        MetaCallArgument arg;
+        GenericMetaCallArgument arg;
         arg.initAsType(returnType, engine);
 
         void *args[] = { arg.dataPtr() };
-- 
cgit v0.12


From 2e7e8a2b805b868eade36cc44fa14bf8ca2f8c2f Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Thu, 14 Apr 2011 11:04:10 +0200
Subject: QNativeWifiEngine: Fix problem with wifi polling on Windows

On some Windows machines the wifi detection in
QNativeWifiEngine::available does not work as WlanOpenHandle still
succeed altough there is no WLAN card. So instead we can detect this
using the WlanEnumInterfaces in requestUpdate() instead.

Task-number: QTBUG-17219
Reviewed-by: Xizhi Zhu
---
 src/plugins/bearer/nativewifi/qnativewifiengine.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
index 16c2239..d5beeff 100644
--- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
+++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
@@ -501,6 +501,11 @@ void QNativeWifiEngine::requestUpdate()
         return;
     }
 
+    if (interfaceList->dwNumberOfItems == 0) {
+        local_WlanFreeMemory(interfaceList);
+        return;
+    }
+
     bool requested = false;
     for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
         result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0);
-- 
cgit v0.12


From 290bc1e55ee3093cadc2addfd2ea29826ee91e87 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 26 Jan 2011 14:57:34 +0100
Subject: Move the constants up, preparing for refactoring

---
 src/corelib/kernel/qabstracteventdispatcher.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index b1b1380..06b76c9 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -49,6 +49,11 @@
 QT_BEGIN_NAMESPACE
 
 // we allow for 2^24 = 8^8 = 16777216 simultaneously running timers
+static const int TimerIdMask = 0x00ffffff;
+static const int TimerSerialMask = ~TimerIdMask & ~0x80000000;
+static const int TimerSerialCounter = TimerIdMask + 1;
+static const int MaxTimerId = TimerSerialCounter - 1;
+
 enum { NumberOfBuckets = 8, FirstBucketSize = 32 };
 
 static const int BucketSize[NumberOfBuckets] =
@@ -81,10 +86,6 @@ Q_DESTRUCTOR_FUNCTION(timerIdsDestructorFunction)
 
 static QBasicAtomicInt nextFreeTimerId = Q_BASIC_ATOMIC_INITIALIZER(1);
 
-static const int TimerIdMask = 0x00ffffff;
-static const int TimerSerialMask = ~TimerIdMask & ~0x80000000;
-static const int TimerSerialCounter = TimerIdMask + 1;
-
 // avoid the ABA-problem by using 7 of the top 8 bits of the timerId as a serial number
 static inline int prepareNewValueWithSerialNumber(int oldId, int newId)
 {
-- 
cgit v0.12


From 050928ae69c95018718fd77084aa70fa26a033a3 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 26 Jan 2011 15:09:47 +0100
Subject: Replace the handcoded math and change the timer buckets again.

Reduce from 8 to 6 buckets and increase the step between each
bucket. This way, the second bucket is now of 224 timers, which should
be enough for 99.9% of the applications.

Also change the hardcoded math to calculations using enum values. This
helps in changing the timer buckets again in the future.

Also fix the last bucket not to have a timer ID of 16777216, as that
is not valid.

Reviewed-by: Olivier Goffart
---
 src/corelib/kernel/qabstracteventdispatcher.cpp | 51 +++++++++++++++++++------
 1 file changed, 40 insertions(+), 11 deletions(-)

diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index 06b76c9..2949cd0 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -52,28 +52,48 @@ QT_BEGIN_NAMESPACE
 static const int TimerIdMask = 0x00ffffff;
 static const int TimerSerialMask = ~TimerIdMask & ~0x80000000;
 static const int TimerSerialCounter = TimerIdMask + 1;
-static const int MaxTimerId = TimerSerialCounter - 1;
-
-enum { NumberOfBuckets = 8, FirstBucketSize = 32 };
-
-static const int BucketSize[NumberOfBuckets] =
-    { 32, 64, 512, 4096, 32768, 262144, 2097152, 16777216 - 2364000 };
-static const int BucketOffset[NumberOfBuckets] =
-    { 0,  32,  96,  608,  4704,  37448,  266848,  2364000 };
+static const int MaxTimerId = TimerIdMask;
 
 static int FirstBucket[] = {
      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
 };
 
-static QBasicAtomicPointer<int> timerIds[NumberOfBuckets] =
+enum {
+    FirstBucketOffset  = 0,
+    SecondBucketOffset = sizeof(FirstBucket) / sizeof(FirstBucket[0]),
+    ThirdBucketOffset  = 0x100,
+    FourthBucketOffset = 0x1000,
+    FifthBucketOffset  = 0x10000,
+    SixthBucketOffset  = 0x100000
+};
+
+enum {
+    FirstBucketSize  = SecondBucketOffset,
+    SecondBucketSize = ThirdBucketOffset - SecondBucketOffset,
+    ThirdBucketSize  = FourthBucketOffset - ThirdBucketOffset,
+    FourthBucketSize = FifthBucketOffset - FourthBucketOffset,
+    FifthBucketSize  = SixthBucketOffset - FifthBucketOffset,
+    SixthBucketSize  = MaxTimerId - SixthBucketOffset
+};
+
+static const int BucketSize[] = {
+    FirstBucketSize, SecondBucketSize, ThirdBucketSize,
+    FourthBucketSize, FifthBucketSize, SixthBucketSize
+};
+enum { NumberOfBuckets = sizeof(BucketSize) / sizeof(BucketSize[0]) };
+
+static const int BucketOffset[] = {
+    FirstBucketOffset, SecondBucketOffset, ThirdBucketOffset,
+    FourthBucketOffset, FifthBucketOffset, SixthBucketOffset
+};
+
+static QBasicAtomicPointer<int> timerIds[] =
     { Q_BASIC_ATOMIC_INITIALIZER(FirstBucket),
       Q_BASIC_ATOMIC_INITIALIZER(0),
       Q_BASIC_ATOMIC_INITIALIZER(0),
       Q_BASIC_ATOMIC_INITIALIZER(0),
       Q_BASIC_ATOMIC_INITIALIZER(0),
-      Q_BASIC_ATOMIC_INITIALIZER(0),
-      Q_BASIC_ATOMIC_INITIALIZER(0),
       Q_BASIC_ATOMIC_INITIALIZER(0) };
 
 static void timerIdsDestructorFunction()
@@ -92,8 +112,17 @@ static inline int prepareNewValueWithSerialNumber(int oldId, int newId)
     return (newId & TimerIdMask) | ((oldId + TimerSerialCounter) & TimerSerialMask);
 }
 
+namespace {
+    template<bool> struct QStaticAssertType;
+    template<> struct QStaticAssertType<true> { enum { Value = 1 }; };
+}
+#define q_static_assert(expr)     (void)QStaticAssertType<expr>::Value
+
 static inline int bucketOffset(int timerId)
 {
+    q_static_assert(sizeof BucketSize == sizeof BucketOffset);
+    q_static_assert(sizeof(timerIds) / sizeof(timerIds[0]) == NumberOfBuckets);
+
     for (int i = 0; i < NumberOfBuckets; ++i) {
         if (timerId < BucketSize[i])
             return i;
-- 
cgit v0.12


From 95e2bf3d87543da8caabd090057da818ccf2ca4c Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 14 Apr 2011 11:26:28 +0200
Subject: Fix qstringbuilder4 test on mac

The behaviour is different with or without QT_FAST_OPERATOR_PLUS
And since on old gcc it is not defined, then the test fails.

With the normal operator+, the bytearray will first be converted to
a QString, and loose everything that is after \0, but now, with
QStringBuilder, we do not do QString conversion anymore, so no data
is lost.

We do not want to specify the behaviour here, so we remove the test.

Reviewed-by: Joao
---
 tests/auto/qstringbuilder1/stringbuilder.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/auto/qstringbuilder1/stringbuilder.cpp b/tests/auto/qstringbuilder1/stringbuilder.cpp
index 035a1f4..d7a32bf 100644
--- a/tests/auto/qstringbuilder1/stringbuilder.cpp
+++ b/tests/auto/qstringbuilder1/stringbuilder.cpp
@@ -190,9 +190,6 @@ void runScenario()
         ba2 = (ba += QLatin1String(LITERAL) + QString::fromUtf8(UTF8_LITERAL));
         QCOMPARE(ba2, ba);
         QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL UTF8_LITERAL));
-        ba = UTF8_LITERAL;
-        ba += QLatin1String(LITERAL) P withZero;
-        QCOMPARE(ba, QByteArray(UTF8_LITERAL LITERAL + withZero));
 #endif
     }
 
-- 
cgit v0.12


From 5b1413a1585b9959f4d6c9bb04c9c233fea017bb Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 14 Apr 2011 12:18:36 +0200
Subject: Compile fix for shared context change.

---
 src/plugins/platforms/uikit/quikitwindow.mm | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
index ff60de7..cda5d4c 100644
--- a/src/plugins/platforms/uikit/quikitwindow.mm
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -78,7 +78,6 @@ public:
         mFormat.setStencil(true);
         mFormat.setStereo(false);
         mFormat.setDirectRendering(false);
-        mFormat.setUseDefaultSharedContext(false);
 
         EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
         [mView setContext:aContext];
-- 
cgit v0.12


From 5f68933c9adbf2dc1d6150d5771c8443395d6780 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 14 Apr 2011 12:21:25 +0200
Subject: Lighthouse: Fix license headers

---
 .../platforms/glxconvenience/qglxconvenience.cpp   | 41 ++++++++++++++++++++++
 .../platforms/glxconvenience/qglxconvenience.h     | 41 ++++++++++++++++++++++
 src/plugins/platforms/xcb/qxcbconnection.h         |  3 +-
 3 files changed, 84 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
index fd3c4c4..7cee3e2 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #include "qglxconvenience.h"
 
 #include <QtCore/QVector>
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.h b/src/plugins/platforms/glxconvenience/qglxconvenience.h
index 6b65e08..2c59dbb 100644
--- a/src/plugins/platforms/glxconvenience/qglxconvenience.h
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QGLXCONVENIENCE_H
 #define QGLXCONVENIENCE_H
 
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index e38b44e..6b5f810 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -1,4 +1,5 @@
-/**************************************************************************** **
+/****************************************************************************
+**
 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
-- 
cgit v0.12


From 94117641f97d180e0452c508fd4743bf29fb53a7 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Thu, 14 Apr 2011 12:48:25 +0200
Subject: Compile with namespace support.

---
 src/dbus/qdbusunixfiledescriptor.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/dbus/qdbusunixfiledescriptor.cpp b/src/dbus/qdbusunixfiledescriptor.cpp
index 4817d95..f45b6cc 100644
--- a/src/dbus/qdbusunixfiledescriptor.cpp
+++ b/src/dbus/qdbusunixfiledescriptor.cpp
@@ -47,6 +47,8 @@
 # include <private/qcore_unix_p.h>
 #endif
 
+QT_BEGIN_NAMESPACE
+
 /*!
     \class QDBusUnixFileDescriptor
     \inmodule QtDBus
@@ -310,3 +312,5 @@ QDBusUnixFileDescriptorPrivate::~QDBusUnixFileDescriptorPrivate()
 }
 
 #endif
+
+QT_END_NAMESPACE
-- 
cgit v0.12


From 78d47f520b2c4acdf782d39311063f5d44376913 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 14 Apr 2011 13:08:53 +0200
Subject: QLocale: Fixed double to currency string conversion on Mac.

This also fixes the autotest failure on mac with macDefaultLocale test.

Reviewed-by: trustme
---
 src/corelib/tools/qlocale_mac.mm   | 2 +-
 tests/auto/qlocale/tst_qlocale.cpp | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 29d9a53..52005e0 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -318,7 +318,7 @@ static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
         break;
     }
     case QVariant::Double: {
-        double v = arg.value.toInt();
+        double v = arg.value.toDouble();
         value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
         break;
     }
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index cabf12e..2b7eaae 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -1130,10 +1130,10 @@ void tst_QLocale::macDefaultLocale()
 	const QString timeString = locale.toString(QTime(1,2,3), QLocale::LongFormat);
     QVERIFY(timeString.contains(QString("1:02:03")));
 
-    QCOMPARE(locale.toCurrencyString(qulonglong(1234)), QString("$1,234"));
-    QCOMPARE(locale.toCurrencyString(qlonglong(-1234)), QString("$-1,234"));
+    QCOMPARE(locale.toCurrencyString(qulonglong(1234)), QString("$1,234.00"));
+    QCOMPARE(locale.toCurrencyString(qlonglong(-1234)), QString("($1,234.00)"));
     QCOMPARE(locale.toCurrencyString(double(1234.56)), QString("$1,234.56"));
-    QCOMPARE(locale.toCurrencyString(double(-1234.56)), QString("$-1,234.56"));
+    QCOMPARE(locale.toCurrencyString(double(-1234.56)), QString("($1,234.56)"));
 
     // Depending on the configured time zone, the time string might not
     // contain a GMT specifier. (Sometimes it just names the zone, like "CEST")
-- 
cgit v0.12


From 6e74302238fbac8783eab36f7553eb30dc5ca352 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Thu, 14 Apr 2011 13:08:53 +0200
Subject: QLocale: Fixed double to currency string conversion on Mac.

This also fixes the autotest failure on mac with macDefaultLocale test.

Reviewed-by: trustme
(cherry picked from commit 78d47f520b2c4acdf782d39311063f5d44376913)
---
 src/corelib/tools/qlocale_mac.mm   | 2 +-
 tests/auto/qlocale/tst_qlocale.cpp | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
index 29d9a53..52005e0 100644
--- a/src/corelib/tools/qlocale_mac.mm
+++ b/src/corelib/tools/qlocale_mac.mm
@@ -318,7 +318,7 @@ static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &
         break;
     }
     case QVariant::Double: {
-        double v = arg.value.toInt();
+        double v = arg.value.toDouble();
         value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
         break;
     }
diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp
index cabf12e..2b7eaae 100644
--- a/tests/auto/qlocale/tst_qlocale.cpp
+++ b/tests/auto/qlocale/tst_qlocale.cpp
@@ -1130,10 +1130,10 @@ void tst_QLocale::macDefaultLocale()
 	const QString timeString = locale.toString(QTime(1,2,3), QLocale::LongFormat);
     QVERIFY(timeString.contains(QString("1:02:03")));
 
-    QCOMPARE(locale.toCurrencyString(qulonglong(1234)), QString("$1,234"));
-    QCOMPARE(locale.toCurrencyString(qlonglong(-1234)), QString("$-1,234"));
+    QCOMPARE(locale.toCurrencyString(qulonglong(1234)), QString("$1,234.00"));
+    QCOMPARE(locale.toCurrencyString(qlonglong(-1234)), QString("($1,234.00)"));
     QCOMPARE(locale.toCurrencyString(double(1234.56)), QString("$1,234.56"));
-    QCOMPARE(locale.toCurrencyString(double(-1234.56)), QString("$-1,234.56"));
+    QCOMPARE(locale.toCurrencyString(double(-1234.56)), QString("($1,234.56)"));
 
     // Depending on the configured time zone, the time string might not
     // contain a GMT specifier. (Sometimes it just names the zone, like "CEST")
-- 
cgit v0.12


From ba172a10765bb2a5474155675485848cb730e625 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Thu, 14 Apr 2011 11:24:05 +0200
Subject: HTTP+SSL: use default SSL configuration, and avoid setting it
 explctly

do not use a null configuration, but a default configuration in
QNetworkRequest by default. In addition, setting an SSL configuration
explicitly will cause the on-demand loading of root certs to be
disabled (because it could be that the user has set the CA certificates
explicitly).

Reviewed-by: Markus Goetz
---
 src/network/access/qhttpthreaddelegate.cpp | 2 +-
 src/network/access/qnetworkrequest.cpp     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index 7a17a7f..8084078 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -267,7 +267,7 @@ void QHttpThreadDelegate::startRequest()
 #endif
 #ifndef QT_NO_OPENSSL
         // Set the QSslConfiguration from this QNetworkRequest.
-        if (ssl) {
+        if (ssl && incomingSslConfiguration != QSslConfiguration::defaultConfiguration()) {
             httpConnection->setSslConfiguration(incomingSslConfiguration);
         }
 #endif
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index 665ee28..338969a 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -524,7 +524,7 @@ void QNetworkRequest::setAttribute(Attribute code, const QVariant &value)
 QSslConfiguration QNetworkRequest::sslConfiguration() const
 {
     if (!d->sslConfiguration)
-        d->sslConfiguration = new QSslConfiguration;
+        d->sslConfiguration = new QSslConfiguration(QSslConfiguration::defaultConfiguration());
     return *d->sslConfiguration;
 }
 
-- 
cgit v0.12


From 95154796e433b2f38b0a838a77ec1c8ae1d70c43 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 14 Apr 2011 13:45:32 +0200
Subject: L10n: German translations for Qt 4.8

---
 translations/assistant_de.ts | 159 +++++++++++++++++++++++++++++++++++++------
 translations/designer_de.ts  | 103 ++++++++++++++++++++++++++--
 translations/qt_de.ts        |  22 +++++-
 3 files changed, 258 insertions(+), 26 deletions(-)

diff --git a/translations/assistant_de.ts b/translations/assistant_de.ts
index 42557e6..c8ae518 100644
--- a/translations/assistant_de.ts
+++ b/translations/assistant_de.ts
@@ -261,6 +261,10 @@ Grund:
         <translation>Adresse</translation>
     </message>
     <message>
+        <source>Toolbar Menu</source>
+        <translation>Werkzeugleisten-Menu</translation>
+    </message>
+    <message>
         <source>Bookmarks Menu</source>
         <translation>Lesezeichen-Menü</translation>
     </message>
@@ -288,11 +292,11 @@ Grund:
     <name>CentralWidget</name>
     <message>
         <source>Add new page</source>
-        <translation>Neue Seite hinzufügen</translation>
+        <translation type="obsolete">Neue Seite hinzufügen</translation>
     </message>
     <message>
         <source>Close current page</source>
-        <translation>Aktuelle Seite schließen</translation>
+        <translation type="obsolete">Aktuelle Seite schließen</translation>
     </message>
     <message>
         <source>Print Document</source>
@@ -300,27 +304,27 @@ Grund:
     </message>
     <message>
         <source>unknown</source>
-        <translation>unbekannt</translation>
+        <translation type="obsolete">unbekannt</translation>
     </message>
     <message>
         <source>Add New Page</source>
-        <translation>Neue Seite hinzufügen</translation>
+        <translation type="obsolete">Neue Seite hinzufügen</translation>
     </message>
     <message>
         <source>Close This Page</source>
-        <translation>Aktuelle Seite schließen</translation>
+        <translation type="obsolete">Aktuelle Seite schließen</translation>
     </message>
     <message>
         <source>Close Other Pages</source>
-        <translation>Andere Seiten schließen</translation>
+        <translation type="obsolete">Andere Seiten schließen</translation>
     </message>
     <message>
         <source>Add Bookmark for this Page...</source>
-        <translation>Lesezeichen für diese Seite hinzufügen ...</translation>
+        <translation type="obsolete">Lesezeichen für diese Seite hinzufügen ...</translation>
     </message>
     <message>
         <source>Search</source>
-        <translation>Suchen</translation>
+        <translation type="obsolete">Suchen</translation>
     </message>
 </context>
 <context>
@@ -640,6 +644,49 @@ Grund:
     </message>
 </context>
 <context>
+    <name>GlobalActions</name>
+    <message>
+        <source>&amp;Back</source>
+        <translation>&amp;Rückwärts</translation>
+    </message>
+    <message>
+        <source>&amp;Forward</source>
+        <translation>&amp;Vorwärts</translation>
+    </message>
+    <message>
+        <source>&amp;Home</source>
+        <translation>&amp;Startseite</translation>
+    </message>
+    <message>
+        <source>ALT+Home</source>
+        <translation>ALT+Home</translation>
+    </message>
+    <message>
+        <source>Zoom &amp;in</source>
+        <translation>&amp;Vergrößern</translation>
+    </message>
+    <message>
+        <source>Zoom &amp;out</source>
+        <translation>Ver&amp;kleinern</translation>
+    </message>
+    <message>
+        <source>&amp;Copy selected Text</source>
+        <translation>Ausgewählten Text &amp;kopieren</translation>
+    </message>
+    <message>
+        <source>&amp;Print...</source>
+        <translation>&amp;Drucken ...</translation>
+    </message>
+    <message>
+        <source>&amp;Find in Text...</source>
+        <translation>&amp;Textsuche ...</translation>
+    </message>
+    <message>
+        <source>&amp;Find</source>
+        <translation>&amp;Suchen</translation>
+    </message>
+</context>
+<context>
     <name>HelpEngineWrapper</name>
     <message>
         <source>Unfiltered</source>
@@ -664,16 +711,32 @@ Grund:
         <translation>&lt;title&gt;Fehler 404 ...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;Die Seite kann nicht gefunden werden.&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</translation>
     </message>
     <message>
+        <source>Open Link</source>
+        <translation>Link öffnen</translation>
+    </message>
+    <message>
         <source>Copy &amp;Link Location</source>
         <translation>&amp;Link-Adresse kopieren</translation>
     </message>
     <message>
+        <source>Copy</source>
+        <translation>Kopieren</translation>
+    </message>
+    <message>
+        <source>Reload</source>
+        <translation>Neu laden</translation>
+    </message>
+    <message>
         <source>Open Link in New Tab	Ctrl+LMB</source>
         <translation>Link in neuem Reiter öffnen (Strg + linke Maustaste)</translation>
     </message>
     <message>
         <source>Open Link in New Tab</source>
-        <translation>Link in neuem Reiter öffnen</translation>
+        <translation type="obsolete">Link in neuem Reiter öffnen</translation>
+    </message>
+    <message>
+        <source>Open Link in New Page</source>
+        <translation>Link in neuer Seite öffnen</translation>
     </message>
 </context>
 <context>
@@ -881,7 +944,7 @@ Grund:
     </message>
     <message>
         <source>&amp;Print...</source>
-        <translation>&amp;Drucken ...</translation>
+        <translation type="obsolete">&amp;Drucken ...</translation>
     </message>
     <message>
         <source>New &amp;Tab</source>
@@ -901,15 +964,15 @@ Grund:
     </message>
     <message>
         <source>&amp;Copy selected Text</source>
-        <translation>Ausgewählten Text &amp;kopieren</translation>
+        <translation type="obsolete">Ausgewählten Text &amp;kopieren</translation>
     </message>
     <message>
         <source>&amp;Find in Text...</source>
-        <translation>&amp;Textsuche ...</translation>
+        <translation type="obsolete">&amp;Textsuche ...</translation>
     </message>
     <message>
         <source>&amp;Find</source>
-        <translation>&amp;Suchen</translation>
+        <translation type="obsolete">&amp;Suchen</translation>
     </message>
     <message>
         <source>Find &amp;Next</source>
@@ -925,11 +988,11 @@ Grund:
     </message>
     <message>
         <source>Zoom &amp;in</source>
-        <translation>&amp;Vergrößern</translation>
+        <translation type="obsolete">&amp;Vergrößern</translation>
     </message>
     <message>
         <source>Zoom &amp;out</source>
-        <translation>Ver&amp;kleinern</translation>
+        <translation type="obsolete">Ver&amp;kleinern</translation>
     </message>
     <message>
         <source>Normal &amp;Size</source>
@@ -953,15 +1016,15 @@ Grund:
     </message>
     <message>
         <source>&amp;Home</source>
-        <translation>&amp;Startseite</translation>
+        <translation type="obsolete">&amp;Startseite</translation>
     </message>
     <message>
         <source>&amp;Back</source>
-        <translation>&amp;Rückwärts</translation>
+        <translation type="obsolete">&amp;Rückwärts</translation>
     </message>
     <message>
         <source>&amp;Forward</source>
-        <translation>&amp;Vorwärts</translation>
+        <translation type="obsolete">&amp;Vorwärts</translation>
     </message>
     <message>
         <source>Sync with Table of Contents</source>
@@ -1000,6 +1063,22 @@ Grund:
         <translation>Ãœber ...</translation>
     </message>
     <message>
+        <source>Open Pages</source>
+        <translation>Offene Seiten</translation>
+    </message>
+    <message>
+        <source>Bookmark Toolbar</source>
+        <translation>Lesezeichen-Leiste</translation>
+    </message>
+    <message>
+        <source>E&amp;xit</source>
+        <translation>B&amp;eenden</translation>
+    </message>
+    <message>
+        <source>ALT+P</source>
+        <translation>ALT+P</translation>
+    </message>
+    <message>
         <source>Navigation Toolbar</source>
         <translation>Navigationsleiste</translation>
     </message>
@@ -1073,7 +1152,7 @@ Grund:
     </message>
     <message>
         <source>ALT+Home</source>
-        <translation>ALT+Home</translation>
+        <translation type="obsolete">ALT+Home</translation>
     </message>
     <message>
         <source>&amp;Bookmarks</source>
@@ -1089,6 +1168,17 @@ Grund:
     </message>
 </context>
 <context>
+    <name>OpenPagesWidget</name>
+    <message>
+        <source>Close %1</source>
+        <translation>Schließe %1</translation>
+    </message>
+    <message>
+        <source>Close All Except %1</source>
+        <translation>Alle außer %1 schließen</translation>
+    </message>
+</context>
+<context>
     <name>OutputPage</name>
     <message>
         <source>Form</source>
@@ -1307,6 +1397,14 @@ Möchten Sie sie löschen?</translation>
         <source>Blank Page</source>
         <translation>Leere Seite</translation>
     </message>
+    <message>
+        <source>Appearance</source>
+        <translation>Erscheinungsbild</translation>
+    </message>
+    <message>
+        <source>Show tabs for each individual page</source>
+        <translation>Reiter für jede einzelne Seite anzeigen</translation>
+    </message>
 </context>
 <context>
     <name>QCollectionGenerator</name>
@@ -1507,6 +1605,29 @@ qhelpgenerator &lt;Hilfe-Projektdatei&gt; [Optionen]
     </message>
 </context>
 <context>
+    <name>TabBar</name>
+    <message>
+        <source>(Untitled)</source>
+        <translation>(Ohne Titel)</translation>
+    </message>
+    <message>
+        <source>New &amp;Tab</source>
+        <translation>Neuer &amp;Reiter</translation>
+    </message>
+    <message>
+        <source>&amp;Close Tab</source>
+        <translation>Reiter &amp;schließen</translation>
+    </message>
+    <message>
+        <source>Close Other Tabs</source>
+        <translation>Andere Reiter schließen</translation>
+    </message>
+    <message>
+        <source>Add Bookmark for this Page...</source>
+        <translation>Lesezeichen für diese Seite hinzufügen ...</translation>
+    </message>
+</context>
+<context>
     <name>TopicChooser</name>
     <message>
         <source>Choose a topic for &lt;b&gt;%1&lt;/b&gt;:</source>
diff --git a/translations/designer_de.ts b/translations/designer_de.ts
index e7aeb51..91da4c0 100644
--- a/translations/designer_de.ts
+++ b/translations/designer_de.ts
@@ -364,7 +364,7 @@
     </message>
     <message>
         <source>page</source>
-        <translation>Seite</translation>
+        <translation type="obsolete">Seite</translation>
     </message>
     <message>
         <source>Insert Page</source>
@@ -476,7 +476,7 @@
     </message>
     <message>
         <source>subwindow</source>
-        <translation>subwindow</translation>
+        <translation type="obsolete">subwindow</translation>
     </message>
     <message>
         <source>Subwindow</source>
@@ -520,6 +520,10 @@
         <translation>Layout von &apos;%1&apos; von %2 in %3 umwandeln</translation>
     </message>
     <message>
+        <source>Change layout alignment</source>
+        <translation>Ausrichtung des Layouts ändern</translation>
+    </message>
+    <message>
         <source>Add &apos;%1&apos; to &apos;%2&apos;</source>
         <extracomment>Command description for adding buttons to a QButtonGroup</extracomment>
         <translation>&apos;%1&apos; zu &apos;%2&apos; hinzufügen</translation>
@@ -1834,7 +1838,7 @@ Container-Seiten sollten ausschließlich im XML der domXML()-Methode spezifizier
     </message>
     <message>
         <source>Edit</source>
-        <translation>Bearbeiten</translation>
+        <translation type="obsolete">Bearbeiten</translation>
     </message>
     <message>
         <source>Toolbars</source>
@@ -1849,6 +1853,10 @@ Container-Seiten sollten ausschließlich im XML der domXML()-Methode spezifizier
         <translation>&amp;Ansicht</translation>
     </message>
     <message>
+        <source>&amp;Edit</source>
+        <translation>&amp;Bearbeiten</translation>
+    </message>
+    <message>
         <source>&amp;Settings</source>
         <translation>&amp;Einstellungen</translation>
     </message>
@@ -3734,6 +3742,10 @@ Möchten Sie sie überschreiben?</translation>
         <translation>Geerbt</translation>
     </message>
     <message>
+        <source>[Theme] %1</source>
+        <translation>[Thema] %1</translation>
+    </message>
+    <message>
         <source>Horizontal</source>
         <translation>Horizontal</translation>
     </message>
@@ -3742,6 +3754,10 @@ Möchten Sie sie überschreiben?</translation>
         <translation>Vertikal</translation>
     </message>
     <message>
+        <source>Theme</source>
+        <translation>Thema</translation>
+    </message>
+    <message>
         <source>Normal Off</source>
         <translation>Normal, aus</translation>
     </message>
@@ -4328,6 +4344,17 @@ Möchten Sie sie überschreiben?</translation>
     </message>
 </context>
 <context>
+    <name>qdesigner_internal::IconThemeDialog</name>
+    <message>
+        <source>Set Icon From Theme</source>
+        <translation>Icon aus Thema setzen</translation>
+    </message>
+    <message>
+        <source>Input icon name from the current theme:</source>
+        <translation>Icon-Name vom aktuellen Thema eingeben:</translation>
+    </message>
+</context>
+<context>
     <name>qdesigner_internal::ItemListEditor</name>
     <message>
         <source>Properties &amp;&lt;&lt;</source>
@@ -4470,15 +4497,15 @@ Möchten Sie sie überschreiben?</translation>
     </message>
     <message>
         <source>Shortcut:</source>
-        <translation>Tastenkürzel</translation>
+        <translation type="obsolete">Tastenkürzel</translation>
     </message>
     <message>
         <source>Checkable:</source>
-        <translation>Ankreuzbar:</translation>
+        <translation type="obsolete">Ankreuzbar:</translation>
     </message>
     <message>
         <source>ToolTip:</source>
-        <translation>ToolTip:</translation>
+        <translation type="obsolete">ToolTip:</translation>
     </message>
     <message>
         <source>...</source>
@@ -4492,6 +4519,22 @@ Möchten Sie sie überschreiben?</translation>
         <source>Object &amp;name:</source>
         <translation>Objekt&amp;name:</translation>
     </message>
+    <message>
+        <source>T&amp;oolTip:</source>
+        <translation>T&amp;oolTip:</translation>
+    </message>
+    <message>
+        <source>Icon th&amp;eme:</source>
+        <translation>Icon-Th&amp;ema:</translation>
+    </message>
+    <message>
+        <source>&amp;Checkable:</source>
+        <translation>&amp;Ankreuzbar:</translation>
+    </message>
+    <message>
+        <source>&amp;Shortcut:</source>
+        <translation>Tastenk&amp;ürzel</translation>
+    </message>
 </context>
 <context>
     <name>qdesigner_internal::NewDynamicPropertyDialog</name>
@@ -4748,9 +4791,17 @@ Please select another name.</source>
         <translation>Datei auswählen...</translation>
     </message>
     <message>
+        <source>Set Icon From Theme...</source>
+        <translation>Icon aus Thema setzen...</translation>
+    </message>
+    <message>
         <source>...</source>
         <translation>...</translation>
     </message>
+    <message>
+        <source>[Theme] %1</source>
+        <translation>[Thema] %1</translation>
+    </message>
 </context>
 <context>
     <name>qdesigner_internal::PlainTextEditorDialog</name>
@@ -5132,6 +5183,42 @@ Klasse: %2</translation>
         <translation>Größe</translation>
     </message>
     <message>
+        <source>Layout Alignment</source>
+        <translation>Ausrichtung des Layouts</translation>
+    </message>
+    <message>
+        <source>No Horizontal Alignment</source>
+        <translation>Keine horizontale Ausrichtung</translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation>Links</translation>
+    </message>
+    <message>
+        <source>Center Horizontally</source>
+        <translation>Horizontal zentrieren</translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation>Rechts</translation>
+    </message>
+    <message>
+        <source>No Vertical Alignment</source>
+        <translation>Keine vertikale Ausrichtung</translation>
+    </message>
+    <message>
+        <source>Top</source>
+        <translation>Oben</translation>
+    </message>
+    <message>
+        <source>Center Vertically</source>
+        <translation>Vertikal zentrieren</translation>
+    </message>
+    <message>
+        <source>Bottom</source>
+        <translation>Unten</translation>
+    </message>
+    <message>
         <source>Set Minimum Width</source>
         <translation>Minimalbreite festlegen</translation>
     </message>
@@ -5338,6 +5425,10 @@ Klasse: %2</translation>
         <source>Insert &amp;Image</source>
         <translation>&amp;Bild einfügen</translation>
     </message>
+    <message>
+        <source>Simplify Rich Text</source>
+        <translation>Formatierbaren Text vereinfachen</translation>
+    </message>
 </context>
 <context>
     <name>qdesigner_internal::ScriptDialog</name>
diff --git a/translations/qt_de.ts b/translations/qt_de.ts
index 0e62340..92a9e1d 100644
--- a/translations/qt_de.ts
+++ b/translations/qt_de.ts
@@ -2514,6 +2514,10 @@ nach
         <source>Cannot create %1 for output</source>
         <translation>%1 kann nicht erstellt werden</translation>
     </message>
+    <message>
+        <source>No file engine available or engine does not support UnMapExtension</source>
+        <translation>Es ist kein Datei-Engine verfügbar oder der gegenwärtig aktive Engine unterstützt die UnMap-Erweiterung nicht</translation>
+    </message>
 </context>
 <context>
     <name>QFileDialog</name>
@@ -3483,6 +3487,18 @@ Möchten Sie die Datei trotzdem löschen?</translation>
         <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
         <translation>Das Symbol &quot;%1&quot; kann in %2 nicht aufgelöst werden: %3</translation>
     </message>
+    <message>
+        <source>&apos;%1&apos; is not an ELF object (%2)</source>
+        <translation>&apos;%1&apos; ist keine ELF-Objektdatei (%2)</translation>
+    </message>
+    <message>
+        <source>&apos;%1&apos; is not an ELF object</source>
+        <translation>&apos;%1&apos; ist keine ELF-Objektdatei</translation>
+    </message>
+    <message>
+        <source>&apos;%1&apos; is an invalid ELF object (%2)</source>
+        <translation>&apos;%1&apos; ist keine gültige ELF-Objektdatei (%2)</translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3580,6 +3596,10 @@ Möchten Sie die Datei trotzdem löschen?</translation>
         <source>%1: Unknown error %2</source>
         <translation>%1: Unbekannter Fehler %2</translation>
     </message>
+    <message>
+        <source>%1: Access denied</source>
+        <translation>%1: Zugriff verweigert</translation>
+    </message>
 </context>
 <context>
     <name>QMYSQLDriver</name>
@@ -3922,7 +3942,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
     <name>QNetworkAccessDataBackend</name>
     <message>
         <source>Operation not supported on %1</source>
-        <translation>Diese Operation wird von %1 nicht unterstützt</translation>
+        <translation type="obsolete">Diese Operation wird von %1 nicht unterstützt</translation>
     </message>
     <message>
         <source>Invalid URI: %1</source>
-- 
cgit v0.12


From c7537e30ba4698b52d90b68875af16285785bf70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 14 Apr 2011 15:48:36 +0200
Subject: Remove hasOpenGL. This changes breaks binary compatibillity

so you will need to use $QTBUILDDIR/bin/syncqt and recompile all
applications
---
 src/gui/kernel/qplatformintegration_qpa.cpp             | 10 ----------
 src/gui/kernel/qplatformintegration_qpa.h               |  4 +---
 src/opengl/qgl.cpp                                      |  4 ----
 src/opengl/qgl_qpa.cpp                                  |  3 ++-
 src/plugins/platforms/eglfs/qeglfsintegration.cpp       |  4 ++--
 src/plugins/platforms/eglfs/qeglfsscreen.h              |  1 +
 src/plugins/platforms/eglfs/qeglfswindow.h              |  3 ---
 src/plugins/platforms/openkode/qopenkodeintegration.cpp |  6 +-----
 src/plugins/platforms/openkode/qopenkodeintegration.h   |  2 --
 src/plugins/platforms/wayland/qwaylandintegration.cpp   |  1 +
 src/plugins/platforms/wayland/qwaylandintegration.h     |  2 +-
 src/plugins/platforms/xcb/qxcbintegration.cpp           |  9 +++++++++
 src/plugins/platforms/xcb/qxcbintegration.h             |  3 ++-
 src/plugins/platforms/xcb/qxcbwindow.cpp                |  4 ++--
 src/plugins/platforms/xlib/qxlibintegration.cpp         |  9 +++++++++
 src/plugins/platforms/xlib/qxlibintegration.h           |  3 ++-
 src/plugins/platforms/xlib/qxlibwindow.cpp              |  4 ++--
 17 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/src/gui/kernel/qplatformintegration_qpa.cpp b/src/gui/kernel/qplatformintegration_qpa.cpp
index c45a953..d559c53 100644
--- a/src/gui/kernel/qplatformintegration_qpa.cpp
+++ b/src/gui/kernel/qplatformintegration_qpa.cpp
@@ -69,16 +69,6 @@ QPlatformEventLoopIntegration *QPlatformIntegration::createEventLoopIntegration(
 }
 
 /*!
-    Returns whether the given platform integration supports OpenGL.
-
-    Default implementation returns false,
-*/
-bool QPlatformIntegration::hasOpenGL() const
-{
-    return false;
-}
-
-/*!
     Accessor for the platform integrations fontdatabase.
 
     Default implementation returns a default QPlatformFontDatabase.
diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h
index 0aacefa..d06272c 100644
--- a/src/gui/kernel/qplatformintegration_qpa.h
+++ b/src/gui/kernel/qplatformintegration_qpa.h
@@ -67,6 +67,7 @@ class Q_GUI_EXPORT QPlatformIntegration
 public:
     enum Capability {
         ThreadedPixmaps = 1,
+        OpenGL = 2
     };
 
     virtual ~QPlatformIntegration() { }
@@ -95,9 +96,6 @@ public:
 // the gui thread. All of the functions in QWindowSystemInterface are thread safe.
     virtual QPlatformEventLoopIntegration *createEventLoopIntegration() const;
 
-//jl:XXX should it be hasGLContext and do we need it at all?
-    virtual bool hasOpenGL() const;
-
 // Access native handles. The window handle is already available from Wid;
     virtual QPlatformNativeInterface *nativeInterface() const;
 };
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index b3b459d..057fb55 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1423,10 +1423,6 @@ QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags()
         }
     }
 
-#ifdef Q_WS_QPA
-    hasOpenGL(); // ### I have no idea why this is needed here, but it makes things work for testlite
-#endif
-
     QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
     OpenGLVersionFlags versionFlags = qOpenGLVersionFlagsFromString(versionString);
     if (currentCtx) {
diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp
index 4bac1fb..994344c 100644
--- a/src/opengl/qgl_qpa.cpp
+++ b/src/opengl/qgl_qpa.cpp
@@ -127,7 +127,8 @@ void QGLContextPrivate::setupSharing() {
 
 bool QGLFormat::hasOpenGL()
 {
-    return QApplicationPrivate::platformIntegration()->hasOpenGL();
+    return QApplicationPrivate::platformIntegration()
+            ->hasCapability(QPlatformIntegration::OpenGL);
 }
 
 void qDeleteQGLContext(void *handle)
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
index 78981f9..1bc0806 100644
--- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
@@ -44,12 +44,12 @@
 #include "qeglfswindow.h"
 #include "qeglfswindowsurface.h"
 
+#include "qgenericunixfontdatabase.h"
+
 #include <QtGui/QPlatformWindow>
 #include <QtGui/QPlatformWindowFormat>
 #include <QtOpenGL/private/qpixmapdata_gl_p.h>
 
-#include "qgenericunixfontdatabase.h"
-
 #include <EGL/egl.h>
 
 QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.h b/src/plugins/platforms/eglfs/qeglfsscreen.h
index 6a2a504..f300842 100644
--- a/src/plugins/platforms/eglfs/qeglfsscreen.h
+++ b/src/plugins/platforms/eglfs/qeglfsscreen.h
@@ -44,6 +44,7 @@
 
 #include <QPlatformScreen>
 
+#include <QtCore/QTextStream>
 
 #include <EGL/egl.h>
 
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h
index ad51114..f125eab 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.h
+++ b/src/plugins/platforms/eglfs/qeglfswindow.h
@@ -45,12 +45,9 @@
 #include "qeglfsintegration.h"
 #include "qeglfsscreen.h"
 
-
 #include <QPlatformWindow>
 #include <QtGui/QWidget>
 
-#include <EGL/egl.h>
-
 QT_BEGIN_NAMESPACE
 
 class QEglFSWindow : public QPlatformWindow
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.cpp b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
index e98f322..703b1a9 100644
--- a/src/plugins/platforms/openkode/qopenkodeintegration.cpp
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
@@ -192,6 +192,7 @@ bool QOpenKODEIntegration::hasCapability(QPlatformIntegration::Capability cap) c
 {
     switch (cap) {
     case ThreadedPixmaps: return true;
+    case OpenGL: return true;
     default: return QPlatformIntegration::hasCapability(cap);
     }
 }
@@ -228,11 +229,6 @@ QWindowSurface *QOpenKODEIntegration::createWindowSurface(QWidget *widget, WId)
     return returnSurface;
 }
 
-bool QOpenKODEIntegration::hasOpenGL() const
-{
-    return true;
-}
-
 QPlatformEventLoopIntegration *QOpenKODEIntegration::createEventLoopIntegration() const
 {
     if (!mEventLoopIntegration) {
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.h b/src/plugins/platforms/openkode/qopenkodeintegration.h
index a788091..d5aac98 100644
--- a/src/plugins/platforms/openkode/qopenkodeintegration.h
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.h
@@ -96,8 +96,6 @@ public:
     QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
     QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
 
-    bool hasOpenGL() const;
-
     QPlatformEventLoopIntegration *createEventLoopIntegration() const;
 
     QPlatformFontDatabase *fontDatabase() const;
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp
index 04f3d9a..3f3ee5e 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.cpp
+++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp
@@ -75,6 +75,7 @@ bool QWaylandIntegration::hasCapability(QPlatformIntegration::Capability cap) co
 {
     switch (cap) {
     case ThreadedPixmaps: return true;
+    case OpenGL: return hasOpenGL();
     default: return QPlatformIntegration::hasCapability(cap);
     }
 }
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h
index 20f8c5c..fc9b8d6 100644
--- a/src/plugins/platforms/wayland/qwaylandintegration.h
+++ b/src/plugins/platforms/wayland/qwaylandintegration.h
@@ -63,9 +63,9 @@ public:
 
     QPlatformFontDatabase *fontDatabase() const;
 
+private:
     bool hasOpenGL() const;
 
-private:
     QPlatformFontDatabase *mFontDb;
     QWaylandDisplay *mDisplay;
     bool mUseOpenGL;
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 63c26a1..9df5f14 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -73,6 +73,15 @@ QXcbIntegration::~QXcbIntegration()
     delete m_connection;
 }
 
+bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+    switch (cap) {
+    case ThreadedPixmaps: return true;
+    case OpenGL: return hasOpenGL();
+    default: return QPlatformIntegration::hasCapability(cap);
+    }
+}
+
 QPixmapData *QXcbIntegration::createPixmapData(QPixmapData::PixelType type) const
 {
     return new QRasterPixmapData(type);
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
index 6c9634e..d27fd71 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.h
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -55,6 +55,7 @@ public:
     QXcbIntegration();
     ~QXcbIntegration();
 
+    bool hasCapability(Capability cap) const;
     QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
     QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
@@ -65,11 +66,11 @@ public:
     QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
 
     QPlatformFontDatabase *fontDatabase() const;
-    bool hasOpenGL() const;
 
     QPlatformNativeInterface *nativeInterface()const;
 
 private:
+    bool hasOpenGL() const;
     QList<QPlatformScreen *> m_screens;
     QXcbConnection *m_connection;
 
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 107e004..0456638 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -113,7 +113,7 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
 
 #if defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
     if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
-        && QApplicationPrivate::platformIntegration()->hasOpenGL())
+        && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
     {
 #if defined(XCB_USE_GLX)
         XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
@@ -491,7 +491,7 @@ void QXcbWindow::requestActivateWindow()
 
 QPlatformGLContext *QXcbWindow::glContext() const
 {
-    if (!QApplicationPrivate::platformIntegration()->hasOpenGL()) {
+    if (!QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) {
         printf("no opengl\n");
         return 0;
     }
diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
index 8deb2f3..78f907a 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.cpp
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -73,6 +73,15 @@ QXlibIntegration::QXlibIntegration(bool useOpenGL)
     mScreens.append(mPrimaryScreen);
 }
 
+bool QXlibIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+    switch (cap) {
+    case ThreadedPixmaps: return true;
+    case OpenGL: return hasOpenGL();
+    default: return QPlatformIntegration::hasCapability(cap);
+    }
+}
+
 QPixmapData *QXlibIntegration::createPixmapData(QPixmapData::PixelType type) const
 {
 #ifndef QT_NO_OPENGL
diff --git a/src/plugins/platforms/xlib/qxlibintegration.h b/src/plugins/platforms/xlib/qxlibintegration.h
index f8efae0..1a2515a 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.h
+++ b/src/plugins/platforms/xlib/qxlibintegration.h
@@ -60,6 +60,7 @@ class QXlibIntegration : public QPlatformIntegration
 public:
     QXlibIntegration(bool useOpenGL = false);
 
+    bool hasCapability(Capability cap) const;
     QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
     QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
@@ -73,9 +74,9 @@ public:
 
     QPlatformNativeInterface *nativeInterface() const;
 
+private:
     bool hasOpenGL() const;
 
-private:
     bool mUseOpenGL;
     QXlibScreen *mPrimaryScreen;
     QList<QPlatformScreen *> mScreens;
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index 82e377c..9a05fc6 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -81,7 +81,7 @@ QXlibWindow::QXlibWindow(QWidget *window)
     int h = window->height();
 
     if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
-            && QApplicationPrivate::platformIntegration()->hasOpenGL() ) {
+            && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL) ) {
 #if !defined(QT_NO_OPENGL)
 #if !defined(QT_OPENGL_ES_2)
         XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(),mScreen->xScreenNumber(),window->platformWindowFormat());
@@ -656,7 +656,7 @@ void QXlibWindow::setCursor(const Cursor &cursor)
 
 QPlatformGLContext *QXlibWindow::glContext() const
 {
-    if (!QApplicationPrivate::platformIntegration()->hasOpenGL())
+    if (!QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
         return 0;
     if (!mGLContext) {
         QXlibWindow *that = const_cast<QXlibWindow *>(this);
-- 
cgit v0.12


From e90c655dc88776947a0e98cc21f8e49069b09a45 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 15 Apr 2011 07:47:54 +0200
Subject: Lighthouse: Fix license headers

---
 .../platforms/uikit/quikitsoftwareinputhandler.h   | 43 ++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
index c0a5c25..629fd13 100644
--- a/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
+++ b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
@@ -1,3 +1,46 @@
+
+
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
 #ifndef QUIKITSOFTWAREINPUTHANDLER_H
 #define QUIKITSOFTWAREINPUTHANDLER_H
 
-- 
cgit v0.12


From 56c0278fd5035d358340724c2ed9969d5332b313 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Fri, 15 Apr 2011 10:19:55 +0200
Subject: QSslConfiguration: fix equals operator

---
 src/network/ssl/qsslconfiguration.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/ssl/qsslconfiguration.cpp b/src/network/ssl/qsslconfiguration.cpp
index c8dbaed..70d7dd8 100644
--- a/src/network/ssl/qsslconfiguration.cpp
+++ b/src/network/ssl/qsslconfiguration.cpp
@@ -164,7 +164,7 @@ bool QSslConfiguration::operator==(const QSslConfiguration &other) const
         d->privateKey == other.d->privateKey &&
         d->sessionCipher == other.d->sessionCipher &&
         d->ciphers == other.d->ciphers &&
-        d->caCertificates == d->caCertificates &&
+        d->caCertificates == other.d->caCertificates &&
         d->protocol == other.d->protocol &&
         d->peerVerifyMode == other.d->peerVerifyMode &&
         d->peerVerifyDepth == other.d->peerVerifyDepth;
-- 
cgit v0.12


From a67ab4fd1065d434f4a14b72ee2d991a71af493c Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Fri, 15 Apr 2011 10:04:56 +0200
Subject: Compile fix for window surface features. (uikit)

---
 src/plugins/platforms/uikit/quikitwindowsurface.h  | 1 +
 src/plugins/platforms/uikit/quikitwindowsurface.mm | 6 +++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.h b/src/plugins/platforms/uikit/quikitwindowsurface.h
index 58ccb1b..ca10a71 100644
--- a/src/plugins/platforms/uikit/quikitwindowsurface.h
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.h
@@ -53,6 +53,7 @@ public:
 
     QPaintDevice *paintDevice();
     void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+    WindowSurfaceFeatures features() const;
 
 private:
     QPaintDevice *mPaintDevice;
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.mm b/src/plugins/platforms/uikit/quikitwindowsurface.mm
index dd188fb..bb7dcd7 100644
--- a/src/plugins/platforms/uikit/quikitwindowsurface.mm
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.mm
@@ -73,7 +73,6 @@ QT_BEGIN_NAMESPACE
 QUIKitWindowSurface::QUIKitWindowSurface(QWidget *window)
     : QWindowSurface(window), mPaintDevice(new EAGLPaintDevice(window->platformWindow()))
 {
-    setPartialUpdateSupport(false);
 }
 
 QPaintDevice *QUIKitWindowSurface::paintDevice()
@@ -89,4 +88,9 @@ void QUIKitWindowSurface::flush(QWidget *widget, const QRegion &region, const QP
     widget->platformWindow()->glContext()->swapBuffers();
 }
 
+QWindowSurface::WindowSurfaceFeatures QUIKitWindowSurface::features() const
+{
+    return PartialUpdates;
+}
+
 QT_END_NAMESPACE
-- 
cgit v0.12


From 42998c318800ed5ac578e54a13063d40b94ebf66 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 15 Apr 2011 12:16:43 +0200
Subject: Lighthouse: Make directfb conform with ligthhouse gl context api

---
 src/plugins/platforms/directfb/qdirectfbglcontext.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/plugins/platforms/directfb/qdirectfbglcontext.cpp b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
index ee46691..85effc9 100644
--- a/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
@@ -70,11 +70,13 @@ QDirectFbGLContext::QDirectFbGLContext(IDirectFBGL *glContext)
 
 void QDirectFbGLContext::makeCurrent()
 {
+    QPlatformGLContext::makeCurrent();
     m_dfbGlContext->Lock(m_dfbGlContext);
 }
 
 void QDirectFbGLContext::doneCurrent()
 {
+    QPlatformGLContext::doneCurrent();
     m_dfbGlContext->Unlock(m_dfbGlContext);
 }
 
-- 
cgit v0.12


From 6849e252cb8ebadc3211485fd059265635f3aba0 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Fri, 15 Apr 2011 16:27:18 +0200
Subject: Adapt to different uikit resolutions.

---
 src/plugins/platforms/uikit/quikitscreen.mm | 20 +++++++++-----------
 src/plugins/platforms/uikit/quikitwindow.mm |  2 +-
 2 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/src/plugins/platforms/uikit/quikitscreen.mm b/src/plugins/platforms/uikit/quikitscreen.mm
index 97382e3..21494c9 100644
--- a/src/plugins/platforms/uikit/quikitscreen.mm
+++ b/src/plugins/platforms/uikit/quikitscreen.mm
@@ -53,24 +53,22 @@ QUIKitScreen::QUIKitScreen(int screenIndex)
 {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     UIScreen *screen = [[UIScreen screens] objectAtIndex:screenIndex];
-    UIScreenMode *mode = [screen currentMode];
-    CGSize size = [mode size];
-    m_geometry = QRect(0, 0, size.width, size.height);
-    CGRect bounds = [screen bounds]; // in 'points', 1p == 1/160in
-
-//    qreal xDpi = size.width * 160. / bounds.size.width;
-//    qreal yDpi = size.height * 160. / bounds.size.height;
-//    qDebug() << xDpi << yDpi;
+    CGRect bounds = [screen bounds];
+    m_geometry = QRect(0, 0, bounds.size.width, bounds.size.height);
 
     m_format = QImage::Format_ARGB32;
 
     m_depth = 24;
 
     const qreal inch = 25.4;
-    const qreal dpi = 160.;
+    qreal dpi = 160.;
+    int dragDistance = 14;
+    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+        dpi = 132.;
+        dragDistance = 10;
+    }
     m_physicalSize = QSize(qRound(bounds.size.width * inch / dpi), qRound(bounds.size.height * inch / dpi));
-    if (m_index == 0)
-        qApp->setStartDragDistance(12);
+    qApp->setStartDragDistance(dragDistance);
     [pool release];
 }
 
diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
index cda5d4c..52d1846 100644
--- a/src/plugins/platforms/uikit/quikitwindow.mm
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -127,7 +127,7 @@ private:
         CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
         eaglLayer.opaque = TRUE;
         eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
-                                        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
+                                        [NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
                                         kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
                                         nil];
         autocapitalizationType = UITextAutocapitalizationTypeNone;
-- 
cgit v0.12


From dd14d7d1fb0327c702e548db794acca65628ac54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 15 Apr 2011 16:51:36 +0200
Subject: Lighthouse: Add dummy QSessionManager

---
 configure                              |   2 +-
 src/gui/kernel/kernel.pri              |   3 +-
 src/gui/kernel/qsessionmanager_qpa.cpp | 172 +++++++++++++++++++++++++++++++++
 3 files changed, 175 insertions(+), 2 deletions(-)
 create mode 100644 src/gui/kernel/qsessionmanager_qpa.cpp

diff --git a/configure b/configure
index a54cfdf..95e4e28 100755
--- a/configure
+++ b/configure
@@ -2873,7 +2873,7 @@ if [ -z "$PLATFORM" ]; then
     esac
 fi
 
-if [ "$PLATFORM_QWS" = "yes" -o "$PLATFORM_QPA" = "yes" ]; then
+if [ "$PLATFORM_QWS" = "yes" ]; then
     CFG_SM=no
     PLATFORMS=`find "$relpath/mkspecs/qws" | sed "s,$relpath/mkspecs/qws/,,"`
 else
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 32fa3d3..3aa28a4 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -248,7 +248,8 @@ qpa {
                 kernel/qplatformglcontext_qpa.cpp \
                 kernel/qplatformcursor_qpa.cpp \
                 kernel/qplatformclipboard_qpa.cpp \
-                kernel/qplatformnativeinterface_qpa.cpp
+                kernel/qplatformnativeinterface_qpa.cpp \
+                kernel/qsessionmanager_qpa.cpp
 
         contains(QT_CONFIG, glib) {
             SOURCES += \
diff --git a/src/gui/kernel/qsessionmanager_qpa.cpp b/src/gui/kernel/qsessionmanager_qpa.cpp
new file mode 100644
index 0000000..e28ac1e
--- /dev/null
+++ b/src/gui/kernel/qsessionmanager_qpa.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsessionmanager.h>
+
+#include <private/qobject_p.h>
+#ifndef QT_NO_SESSIONMANAGER
+
+QT_BEGIN_NAMESPACE
+
+class QSessionManagerPrivate : public QObjectPrivate
+{
+public:
+    QSessionManagerPrivate(QSessionManager *m, const QString &id,
+                           const QString &key);
+
+    QStringList restartCommand;
+    QStringList discardCommand;
+    const QString sessionId;
+    const QString sessionKey;
+    QSessionManager::RestartHint restartHint;
+};
+
+QSessionManagerPrivate::QSessionManagerPrivate(QSessionManager*,
+                                               const QString &id,
+                                               const QString &key)
+    : QObjectPrivate(), sessionId(id), sessionKey(key)
+{
+}
+
+QSessionManager::QSessionManager(QApplication *app, QString &id, QString &key)
+    : QObject(*new QSessionManagerPrivate(this, id, key), app)
+{
+    Q_D(QSessionManager);
+    d->restartHint = RestartIfRunning;
+}
+
+QSessionManager::~QSessionManager()
+{
+}
+
+QString QSessionManager::sessionId() const
+{
+    Q_D(const QSessionManager);
+    return d->sessionId;
+}
+
+QString QSessionManager::sessionKey() const
+{
+    Q_D(const QSessionManager);
+    return d->sessionKey;
+}
+
+
+bool QSessionManager::allowsInteraction()
+{
+    return false;
+}
+
+bool QSessionManager::allowsErrorInteraction()
+{
+    return false;
+}
+
+void QSessionManager::release()
+{
+}
+
+void QSessionManager::cancel()
+{
+}
+
+void QSessionManager::setRestartHint(QSessionManager::RestartHint hint)
+{
+    Q_D(QSessionManager);
+    d->restartHint = hint;
+}
+
+QSessionManager::RestartHint QSessionManager::restartHint() const
+{
+    Q_D(const QSessionManager);
+    return d->restartHint;
+}
+
+void QSessionManager::setRestartCommand(const QStringList &command)
+{
+    Q_D(QSessionManager);
+    d->restartCommand = command;
+}
+
+QStringList QSessionManager::restartCommand() const
+{
+    Q_D(const QSessionManager);
+    return d->restartCommand;
+}
+
+void QSessionManager::setDiscardCommand(const QStringList &command)
+{
+    Q_D(QSessionManager);
+    d->discardCommand = command;
+}
+
+QStringList QSessionManager::discardCommand() const
+{
+    Q_D(const QSessionManager);
+    return d->discardCommand;
+}
+
+void QSessionManager::setManagerProperty(const QString &name,
+                                         const QString &value)
+{
+    Q_UNUSED(name);
+    Q_UNUSED(value);
+}
+
+void QSessionManager::setManagerProperty(const QString &name,
+                                         const QStringList &value)
+{
+    Q_UNUSED(name);
+    Q_UNUSED(value);
+}
+
+bool QSessionManager::isPhase2() const
+{
+    return false;
+}
+
+void QSessionManager::requestPhase2()
+{
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SESSIONMANAGER
-- 
cgit v0.12


From 5769a3bf3c14b08e83ee785a7877be0fd6a37376 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Fri, 15 Apr 2011 17:52:34 +0200
Subject: Add platformNativeInterface assessor to QApplication

---
 src/gui/kernel/qapplication.h       | 6 ++++++
 src/gui/kernel/qapplication_qpa.cpp | 6 ++++++
 2 files changed, 12 insertions(+)

diff --git a/src/gui/kernel/qapplication.h b/src/gui/kernel/qapplication.h
index aa62518..fb61d36 100644
--- a/src/gui/kernel/qapplication.h
+++ b/src/gui/kernel/qapplication.h
@@ -79,6 +79,8 @@ template <typename T> class QList;
 class QLocale;
 #if defined(Q_WS_QWS)
 class QDecoration;
+#elif defined(Q_WS_QPA)
+class QPlatformNativeInterface;
 #endif
 #if defined(Q_OS_SYMBIAN)
 class QSymbianEvent;
@@ -254,6 +256,10 @@ public:
 #endif
 #endif
 
+#if defined(Q_WS_QPA)
+    static QPlatformNativeInterface *platformNativeInterface();
+#endif
+
 
 #if defined(Q_WS_WIN)
     void winFocus(QWidget *, bool);
diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp
index 1d4400a..b754cf7 100644
--- a/src/gui/kernel/qapplication_qpa.cpp
+++ b/src/gui/kernel/qapplication_qpa.cpp
@@ -444,6 +444,12 @@ void QApplication::alert(QWidget *, int)
 {
 }
 
+QPlatformNativeInterface *QApplication::platformNativeInterface()
+{
+    QPlatformIntegration *pi = QApplicationPrivate::platformIntegration();
+    return pi->nativeInterface();
+}
+
 static void init_platform(const QString &name, const QString &platformPluginPath)
 {
     QApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, platformPluginPath);
-- 
cgit v0.12


From 72032a323d2a08e414e2b09ca37b0a514e0021f2 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Sun, 17 Apr 2011 15:58:33 +0200
Subject: Do not try to test UnixFDs with the system API because it may be too
 old

---
 tests/auto/qdbustype/tst_qdbustype.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qdbustype/tst_qdbustype.cpp b/tests/auto/qdbustype/tst_qdbustype.cpp
index 0469719..676a904 100644
--- a/tests/auto/qdbustype/tst_qdbustype.cpp
+++ b/tests/auto/qdbustype/tst_qdbustype.cpp
@@ -85,7 +85,9 @@ static void addFixedTypes()
     QTest::newRow("int64") << DBUS_TYPE_INT64_AS_STRING << true << true;
     QTest::newRow("uint64") << DBUS_TYPE_UINT64_AS_STRING << true << true;
     QTest::newRow("double") << DBUS_TYPE_DOUBLE_AS_STRING << true << true;
-    QTest::newRow("unixfd") << "h" << true << true;
+#ifdef DBUS_TYPE_UNIX_FD_AS_STRING
+    QTest::newRow("unixfd") << DBUS_TYPE_UNIX_FD_AS_STRING << true << true;
+#endif
 }
 
 static void addInvalidSingleLetterTypes()
-- 
cgit v0.12


From d4fa1878ff1e7628d3e984d54f8a93810353c71b Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Sun, 17 Apr 2011 16:34:22 +0200
Subject: Fix warning about vSize not being used in this function

---
 src/declarative/graphicsitems/qdeclarativeflickable.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 1d50baf..3dd194b 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -266,7 +266,7 @@ void QDeclarativeFlickablePrivate::flickY(qreal velocity)
     flick(vData, q->minYExtent(), q->maxYExtent(), q->height(), fixupY_callback, velocity);
 }
 
-void QDeclarativeFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+void QDeclarativeFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal,
                                          QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity)
 {
     Q_Q(QDeclarativeFlickable);
-- 
cgit v0.12


From 7b0d6dce4b00c190b57da1edc65cd129765cdd24 Mon Sep 17 00:00:00 2001
From: Jason McDonald <jason.mcdonald@nokia.com>
Date: Wed, 6 Apr 2011 17:18:09 +1000
Subject: Fix missing equality and inequality operator docs for QPointer.

Task-number: QTBUG-18565
Reviewed-by: Rohan McGovern
---
 src/corelib/kernel/qpointer.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/corelib/kernel/qpointer.cpp b/src/corelib/kernel/qpointer.cpp
index 7d63088..73f695b 100644
--- a/src/corelib/kernel/qpointer.cpp
+++ b/src/corelib/kernel/qpointer.cpp
@@ -183,6 +183,7 @@
 
 /*!
     \fn bool operator==(const T *o, const QPointer<T> &p)
+    \relates QPointer
 
     Equality operator. Returns true if \a o and the guarded
     pointer \a p are pointing to the same object, otherwise
@@ -191,6 +192,7 @@
 */
 /*!
     \fn bool operator==(const QPointer<T> &p, const T *o)
+    \relates QPointer
 
     Equality operator. Returns true if \a o and the guarded
     pointer \a p are pointing to the same object, otherwise
@@ -199,6 +201,7 @@
 */
 /*!
     \fn bool operator==(T *o, const QPointer<T> &p)
+    \relates QPointer
 
     Equality operator. Returns true if \a o and the guarded
     pointer \a p are pointing to the same object, otherwise
@@ -207,6 +210,7 @@
 */
 /*!
     \fn bool operator==(const QPointer<T> &p, T *o)
+    \relates QPointer
 
     Equality operator. Returns true if \a o and the guarded
     pointer \a p are pointing to the same object, otherwise
@@ -215,6 +219,7 @@
 */
 /*!
     \fn bool operator==(const QPointer<T> &p1, const QPointer<T> &p2)
+    \relates QPointer
 
     Equality operator. Returns true if the guarded pointers \a p1 and \a p2
     are pointing to the same object, otherwise
@@ -225,6 +230,7 @@
 
 /*!
     \fn bool operator!=(const T *o, const QPointer<T> &p)
+    \relates QPointer
 
     Inequality operator. Returns true if \a o and the guarded
     pointer \a p are not pointing to the same object, otherwise
@@ -232,6 +238,7 @@
 */
 /*!
     \fn bool operator!=(const QPointer<T> &p, const T *o)
+    \relates QPointer
 
     Inequality operator. Returns true if \a o and the guarded
     pointer \a p are not pointing to the same object, otherwise
@@ -239,6 +246,7 @@
 */
 /*!
     \fn bool operator!=(T *o, const QPointer<T> &p)
+    \relates QPointer
 
     Inequality operator. Returns true if \a o and the guarded
     pointer \a p are not pointing to the same object, otherwise
@@ -246,6 +254,7 @@
 */
 /*!
     \fn bool operator!=(const QPointer<T> &p, T *o)
+    \relates QPointer
 
     Inequality operator. Returns true if \a o and the guarded
     pointer \a p are not pointing to the same object, otherwise
@@ -253,6 +262,7 @@
 */
 /*!
     \fn bool operator!=(const QPointer<T> &p1, const QPointer<T> &p2)
+    \relates QPointer
 
     Inequality operator. Returns true if  the guarded pointers \a p1 and
     \a p2 are not pointing to the same object, otherwise
-- 
cgit v0.12


From ed3703f6779e7bc94744347eeb4d925d0f7f267c Mon Sep 17 00:00:00 2001
From: Jason McDonald <jason.mcdonald@nokia.com>
Date: Mon, 11 Apr 2011 12:43:28 +1000
Subject: Remove autotest code related to old Qt versions

Reviewed-by: Rohan McGovern
---
 tests/auto/qbuttongroup/tst_qbuttongroup.cpp     | 10 +---------
 tests/auto/qeasingcurve/tst_qeasingcurve.cpp     |  6 ------
 tests/auto/qsharedpointer/tst_qsharedpointer.cpp |  4 +---
 tests/auto/selftests/tst_selftests.cpp           | 14 --------------
 tests/auto/symbols/tst_symbols.cpp               |  4 ----
 5 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/tests/auto/qbuttongroup/tst_qbuttongroup.cpp b/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
index a809101..34be20c 100644
--- a/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
+++ b/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
@@ -98,10 +98,7 @@ private slots:
 
     void task106609();
 
-    // fixed for Qt 4.6.0
-#if QT_VERSION >= 0x040600
     void autoIncrementId();
-#endif
 
     void task209485_removeFromGroupInEventHandler_data();
     void task209485_removeFromGroupInEventHandler();
@@ -338,10 +335,7 @@ void tst_QButtonGroup::testSignals()
     QCOMPARE(clickedSpy.count(), 1);
     QCOMPARE(clickedIdSpy.count(), 1);
 
-    int expectedId = -1;
-#if QT_VERSION >= 0x040600
-    expectedId = -2;
-#endif
+    int expectedId = -2;
 
     QVERIFY(clickedIdSpy.takeFirst().at(0).toInt() == expectedId);
     QCOMPARE(pressedSpy.count(), 1);
@@ -500,7 +494,6 @@ void tst_QButtonGroup::task209485_removeFromGroupInEventHandler()
     QCOMPARE(spy1.count() + spy2.count(), signalCount);
 }
 
-#if QT_VERSION >= 0x040600
 void tst_QButtonGroup::autoIncrementId()
 {
     QDialog dlg(0);
@@ -529,7 +522,6 @@ void tst_QButtonGroup::autoIncrementId()
 
     dlg.show();
 }
-#endif
 
 QTEST_MAIN(tst_QButtonGroup)
 #include "tst_qbuttongroup.moc"
diff --git a/tests/auto/qeasingcurve/tst_qeasingcurve.cpp b/tests/auto/qeasingcurve/tst_qeasingcurve.cpp
index 327b6f3..f10d35b 100644
--- a/tests/auto/qeasingcurve/tst_qeasingcurve.cpp
+++ b/tests/auto/qeasingcurve/tst_qeasingcurve.cpp
@@ -42,10 +42,6 @@
 
 #include <QtTest/QtTest>
 
-#if QT_VERSION < 0x040200
-QTEST_NOOP_MAIN
-#else
-
 #include <qeasingcurve.h>
 
 //TESTED_CLASS=
@@ -578,5 +574,3 @@ void tst_QEasingCurve::metaTypes()
 
 QTEST_MAIN(tst_QEasingCurve)
 #include "tst_qeasingcurve.moc"
-
-#endif //QT_VERSION
diff --git a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
index e7c8175..bb04621 100644
--- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
@@ -698,7 +698,7 @@ void tst_QSharedPointer::noSharedPointerFromWeakQObject()
     QSharedPointer<QObject> strong = weak.toStrongRef();
     QVERIFY(strong.isNull());
 
-    // is something went wrong, we'll probably crash here
+    // if something went wrong, we'll probably crash here
 }
 
 void tst_QSharedPointer::weakQObjectFromSharedPointer()
@@ -1747,7 +1747,6 @@ void tst_QSharedPointer::invalidConstructs_data()
            "QSharedPointer<Data> b;\n"
            "if (a + b) return;";
 
-#if QT_VERSION >= 0x040600
     // two objects with the same pointer
     QTest::newRow("same-pointer")
         << &QTest::QExternalTest::tryRunFail
@@ -1761,7 +1760,6 @@ void tst_QSharedPointer::invalidConstructs_data()
         << "Data *aData = new Data;\n"
            "QSharedPointer<Data> ptr1 = QSharedPointer<Data>(aData);"
            "ptr1 = QSharedPointer<Data>(aData);";
-#endif
 
     // any type of cast for unrelated types:
     // (we have no reinterpret_cast)
diff --git a/tests/auto/selftests/tst_selftests.cpp b/tests/auto/selftests/tst_selftests.cpp
index 0d27d38..1c01c5f 100644
--- a/tests/auto/selftests/tst_selftests.cpp
+++ b/tests/auto/selftests/tst_selftests.cpp
@@ -515,8 +515,6 @@ BenchmarkResult BenchmarkResult::parse(QString const& line, QString* error)
         }
 
         bool ok;
-#if QT_VERSION >= 0x040700
-        // Qt 4.7 uses floating point
         double total = sTotal.toDouble(&ok);
         if (!ok) {
             if (error) *error = sTotal + " is not a valid number";
@@ -527,18 +525,6 @@ BenchmarkResult BenchmarkResult::parse(QString const& line, QString* error)
             if (error) *error = sIterations + " is not a valid number";
             return out;
         }
-#else
-        qlonglong total = sTotal.toLongLong(&ok);
-        if (!ok) {
-            if (error) *error = sTotal + " is not a valid integer";
-            return out;
-        }
-        qlonglong iterations = sIterations.toLongLong(&ok);
-        if (!ok) {
-            if (error) *error = sIterations + " is not a valid integer";
-            return out;
-        }
-#endif
 
         out.unit = unit;
         out.total = total;
diff --git a/tests/auto/symbols/tst_symbols.cpp b/tests/auto/symbols/tst_symbols.cpp
index db1cbea..6f21c71 100644
--- a/tests/auto/symbols/tst_symbols.cpp
+++ b/tests/auto/symbols/tst_symbols.cpp
@@ -169,11 +169,7 @@ void tst_Symbols::globalObjects()
     }
 
     if (isFailed) {
-#if QT_VERSION >= 0x040600
         QVERIFY2(!isFailed, "Libraries contain static global objects. See Debug output above.");
-#else
-        QSKIP("Libraries contains static global objects. See Debug output above. [These errors cannot be fixed in 4.5 in time]", SkipSingle);
-#endif
     }
 }
 
-- 
cgit v0.12


From c4ae6d8464b9839729744e2710869947c0ec7bd0 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Mon, 18 Apr 2011 12:38:54 +0200
Subject: Fix build for Apple gcc

Reviewed-by: Paul Olav Tvete
---
 src/gui/kernel/qsessionmanager_qpa.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/kernel/qsessionmanager_qpa.cpp b/src/gui/kernel/qsessionmanager_qpa.cpp
index e28ac1e..ef532d7 100644
--- a/src/gui/kernel/qsessionmanager_qpa.cpp
+++ b/src/gui/kernel/qsessionmanager_qpa.cpp
@@ -67,7 +67,7 @@ QSessionManagerPrivate::QSessionManagerPrivate(QSessionManager*,
 }
 
 QSessionManager::QSessionManager(QApplication *app, QString &id, QString &key)
-    : QObject(*new QSessionManagerPrivate(this, id, key), app)
+    : QObject(*(new QSessionManagerPrivate(this, id, key)), app)
 {
     Q_D(QSessionManager);
     d->restartHint = RestartIfRunning;
-- 
cgit v0.12


From 9b97e319fc2a8e48a454725a5eb54edeb305a27c Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 18 Apr 2011 13:02:36 +0200
Subject: Revert "Fix strict-alias breaking warnings with GCC."

This reverts commit 0d3044b547614cbd313d90021606af1f81fb10de.

I'm not sure if this is good for anything. I can't reproduce the
failures that happen on Mac and Windows, so let's try reverting the
only patch that touches QtDeclarative.

If this works, then we'll have found out that the code is broken and
my patch only revealed the errors.
---
 .../qml/qdeclarativeobjectscriptclass.cpp          | 115 ++++++++-------------
 1 file changed, 43 insertions(+), 72 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index a2411b9..dc3ecca 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -632,6 +632,7 @@ QDeclarativeObjectMethodScriptClass::property(Object *, const Identifier &name)
 
 namespace {
 struct MetaCallArgument {
+    inline MetaCallArgument();
     inline ~MetaCallArgument();
     inline void *dataPtr();
 
@@ -639,45 +640,15 @@ struct MetaCallArgument {
     void fromScriptValue(int type, QDeclarativeEngine *, const QScriptValue &);
     inline QScriptDeclarativeClass::Value toValue(QDeclarativeEngine *);
 
-protected:
-    inline MetaCallArgument();
-
 private:
     MetaCallArgument(const MetaCallArgument &);
-    template <typename T> T &as();
 
     inline void cleanup();
 
+    char data[4 * sizeof(void *)];
     int type;
     bool isObjectType;
-    char padding[6]; // ensure sizeof(MetaCallArgument) == 8
-};
-
-template <typename T> struct TypedMetaCallArgument: public MetaCallArgument
-{
-    T data;
-protected:
-    TypedMetaCallArgument() {}
-    ~TypedMetaCallArgument() {}
-private:
-    TypedMetaCallArgument(const TypedMetaCallArgument &);
 };
-
-struct GenericPayload { void *data[4]; };
-struct GenericMetaCallArgument: public TypedMetaCallArgument<GenericPayload>
-{
-};
-
-template <typename T> T &MetaCallArgument::as()
-{
-#ifdef Q_ALIGNOF
-    // static assert
-    char dummy_array[Q_ALIGNOF(T) <= sizeof(*this) ? 1 : -1]; Q_UNUSED(dummy_array);
-#endif
-    TypedMetaCallArgument<T> &typed = static_cast<TypedMetaCallArgument<T> &>(*this);
-    return typed.data;
-}
-
 }
 
 MetaCallArgument::MetaCallArgument()
@@ -693,22 +664,22 @@ MetaCallArgument::~MetaCallArgument()
 void MetaCallArgument::cleanup()
 {
     if (type == QMetaType::QString) {
-        as<QString>().~QString();
+        ((QString *)&data)->~QString();
     } else if (type == -1 || type == qMetaTypeId<QVariant>()) {
-        as<QVariant>().~QVariant();
+        ((QVariant *)&data)->~QVariant();
     } else if (type == qMetaTypeId<QScriptValue>()) {
-        as<QScriptValue>().~QScriptValue();
+        ((QScriptValue *)&data)->~QScriptValue();
     } else if (type == qMetaTypeId<QList<QObject *> >()) {
-        as<QList<QObject *> >().~QList<QObject *>();
+        ((QList<QObject *> *)&data)->~QList<QObject *>();
     }
 }
 
 void *MetaCallArgument::dataPtr()
 {
     if (type == -1)
-        return as<QVariant>().data();
+        return ((QVariant *)data)->data();
     else
-        return &as<GenericPayload>();
+        return (void *)&data;
 }
 
 void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
@@ -719,7 +690,7 @@ void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
     QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e);
 
     if (callType == qMetaTypeId<QScriptValue>()) {
-        new (&as<QScriptValue>()) QScriptValue(engine->undefinedValue());
+        new (&data) QScriptValue(engine->undefinedValue());
         type = callType;
     } else if (callType == QMetaType::Int ||
                callType == QMetaType::UInt ||
@@ -728,20 +699,20 @@ void MetaCallArgument::initAsType(int callType, QDeclarativeEngine *e)
                callType == QMetaType::Float) {
         type = callType;
     } else if (callType == QMetaType::QObjectStar) {
-        as<QObject *>() = 0;
+        *((QObject **)&data) = 0;
         type = callType;
     } else if (callType == QMetaType::QString) {
-        new (&as<QString>()) QString();
+        new (&data) QString();
         type = callType;
     } else if (callType == qMetaTypeId<QVariant>()) {
         type = callType;
-        new (&as<QVariant>()) QVariant();
+        new (&data) QVariant();
     } else if (callType == qMetaTypeId<QList<QObject *> >()) {
         type = callType;
-        new (&as<QList<QObject *> >()) QList<QObject *>();
+        new (&data) QList<QObject *>();
     } else {
         type = -1;
-        new (&as<QVariant>()) QVariant(callType, (void *)0);
+        new (&data) QVariant(callType, (void *)0);
     }
 }
 
@@ -750,37 +721,37 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
     if (type != 0) { cleanup(); type = 0; }
 
     if (callType == qMetaTypeId<QScriptValue>()) {
-        new (&as<QScriptValue>()) QScriptValue(value);
+        new (&data) QScriptValue(value);
         type = qMetaTypeId<QScriptValue>();
     } else if (callType == QMetaType::Int) {
-        as<int>() = int(value.toInt32());
+        *((int *)&data) = int(value.toInt32());
         type = callType;
     } else if (callType == QMetaType::UInt) {
-        as<uint>() = uint(value.toUInt32());
+        *((uint *)&data) = uint(value.toUInt32());
         type = callType;
     } else if (callType == QMetaType::Bool) {
-        as<bool>() = value.toBool();
+        *((bool *)&data) = value.toBool();
         type = callType;
     } else if (callType == QMetaType::Double) {
-        as<double>() = double(value.toNumber());
+        *((double *)&data) = double(value.toNumber());
         type = callType;
     } else if (callType == QMetaType::Float) {
-        as<float>() = float(value.toNumber());
+        *((float *)&data) = float(value.toNumber());
         type = callType;
     } else if (callType == QMetaType::QString) {
         if (value.isNull() || value.isUndefined())
-            new (&as<QString>()) QString();
+            new (&data) QString();
         else
-            new (&as<QString>()) QString(value.toString());
+            new (&data) QString(value.toString());
         type = callType;
     } else if (callType == QMetaType::QObjectStar) {
-        as<QObject *>() = value.toQObject();
+        *((QObject **)&data) = value.toQObject();
         type = callType;
     } else if (callType == qMetaTypeId<QVariant>()) {
-        new (&as<QVariant>()) QVariant(QDeclarativeEnginePrivate::get(engine)->scriptValueToVariant(value));
+        new (&data) QVariant(QDeclarativeEnginePrivate::get(engine)->scriptValueToVariant(value));
         type = callType;
     } else if (callType == qMetaTypeId<QList<QObject*> >()) {
-        QList<QObject *> *list = new (&as<QList<QObject *> >()) QList<QObject *>();
+        QList<QObject *> *list = new (&data) QList<QObject *>(); 
         if (value.isArray()) {
             int length = value.property(QLatin1String("length")).toInt32();
             for (int ii = 0; ii < length; ++ii) {
@@ -793,16 +764,16 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
         }
         type = callType;
     } else {
-        new (&as<QVariant>()) QVariant();
+        new (&data) QVariant();
         type = -1;
 
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(engine);
         QVariant v = priv->scriptValueToVariant(value);
         if (v.userType() == callType) {
-            as<QVariant>() = v;
+            *((QVariant *)&data) = v;
         } else if (v.canConvert((QVariant::Type)callType)) {
-            as<QVariant>() = v;
-            as<QVariant>().convert((QVariant::Type)callType);
+            *((QVariant *)&data) = v;
+            ((QVariant *)&data)->convert((QVariant::Type)callType);
         } else if (const QMetaObject *mo = priv->rawMetaObjectForType(callType)) {
             QObject *obj = priv->toQObject(v);
             
@@ -812,9 +783,9 @@ void MetaCallArgument::fromScriptValue(int callType, QDeclarativeEngine *engine,
                 if (!objMo) obj = 0;
             }
 
-            as<QVariant>() = QVariant(callType, &obj);
+            *((QVariant *)&data) = QVariant(callType, &obj);
         } else {
-            as<QVariant>() = QVariant(callType, (void *)0);
+            *((QVariant *)&data) = QVariant(callType, (void *)0);
         }
     }
 }
@@ -824,27 +795,27 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e)
     QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(e);
 
     if (type == qMetaTypeId<QScriptValue>()) {
-        return QScriptDeclarativeClass::Value(engine, as<QScriptValue>());
+        return QScriptDeclarativeClass::Value(engine, *((QScriptValue *)&data));
     } else if (type == QMetaType::Int) {
-        return QScriptDeclarativeClass::Value(engine, as<int>());
+        return QScriptDeclarativeClass::Value(engine, *((int *)&data));
     } else if (type == QMetaType::UInt) {
-        return QScriptDeclarativeClass::Value(engine, as<uint>());
+        return QScriptDeclarativeClass::Value(engine, *((uint *)&data));
     } else if (type == QMetaType::Bool) {
-        return QScriptDeclarativeClass::Value(engine, as<bool>());
+        return QScriptDeclarativeClass::Value(engine, *((bool *)&data));
     } else if (type == QMetaType::Double) {
-        return QScriptDeclarativeClass::Value(engine, as<double>());
+        return QScriptDeclarativeClass::Value(engine, *((double *)&data));
     } else if (type == QMetaType::Float) {
-        return QScriptDeclarativeClass::Value(engine, as<float>());
+        return QScriptDeclarativeClass::Value(engine, *((float *)&data));
     } else if (type == QMetaType::QString) {
-        return QScriptDeclarativeClass::Value(engine, as<QString>());
+        return QScriptDeclarativeClass::Value(engine, *((QString *)&data));
     } else if (type == QMetaType::QObjectStar) {
-        QObject *object = as<QObject *>();
+        QObject *object = *((QObject **)&data);
         if (object)
             QDeclarativeData::get(object, true)->setImplicitDestructible();
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(e);
         return QScriptDeclarativeClass::Value(engine, priv->objectClass->newQObject(object));
     } else if (type == qMetaTypeId<QList<QObject *> >()) {
-        QList<QObject *> &list = as<QList<QObject *> >();
+        QList<QObject *> &list = *(QList<QObject *>*)&data;
         QScriptValue rv = engine->newArray(list.count());
         QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(e);
         for (int ii = 0; ii < list.count(); ++ii) {
@@ -855,7 +826,7 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e)
         return QScriptDeclarativeClass::Value(engine, rv);
     } else if (type == -1 || type == qMetaTypeId<QVariant>()) {
         QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(e);
-        QScriptValue rv = ep->scriptValueFromVariant(as<QVariant>());
+        QScriptValue rv = ep->scriptValueFromVariant(*((QVariant *)&data));
         if (rv.isQObject()) {
             QObject *object = rv.toQObject();
             if (object)
@@ -935,7 +906,7 @@ QDeclarativeObjectMethodScriptClass::callMethod(QObject *object, int index,
 {
     if (argCount > 0) {
 
-        QVarLengthArray<GenericMetaCallArgument, 9> args(argCount + 1);
+        QVarLengthArray<MetaCallArgument, 9> args(argCount + 1);
         args[0].initAsType(returnType, engine);
 
         for (int ii = 0; ii < argCount; ++ii)
@@ -951,7 +922,7 @@ QDeclarativeObjectMethodScriptClass::callMethod(QObject *object, int index,
 
     } else if (returnType != 0) {
         
-        GenericMetaCallArgument arg;
+        MetaCallArgument arg;
         arg.initAsType(returnType, engine);
 
         void *args[] = { arg.dataPtr() };
-- 
cgit v0.12


From 8856e2412fc2756443288644465d9edce5798fea Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 18 Apr 2011 13:15:36 +0200
Subject: Alternative fix to the strict-aliasing violation warnings

The code doesn't actually violate aliasing by doing type-punned
dereferencing. The objects are always accessed as the right type. So
disable the warning and pray that GCC doesn't optimise code out of
existence.

Reviewed-by: Trust Me
---
 src/declarative/qml/qdeclarativeobjectscriptclass.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index dc3ecca..9eecc65 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -54,7 +54,15 @@
 #include <QtCore/qvarlengtharray.h>
 #include <QtScript/qscriptcontextinfo.h>
 
-Q_DECLARE_METATYPE(QScriptValue);
+Q_DECLARE_METATYPE(QScriptValue)
+
+#if defined(__GNUC__)
+# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+// The code in this file does not violate strict aliasing, but GCC thinks it does
+// so turn off the warnings for us to have a clean build
+#  pragma GCC diagnostic ignored "-Wstrict-aliasing"
+# endif
+#endif
 
 QT_BEGIN_NAMESPACE
 
-- 
cgit v0.12


From d0245f57d1b617a61bb7472c232be5b974892369 Mon Sep 17 00:00:00 2001
From: Robert Griebl <robert.griebl@nokia.com>
Date: Mon, 18 Apr 2011 14:26:46 +0200
Subject: Use s/static/Q_GLOBAL_STATIC/g in QScroller

Reviewed-by: Harald Fernengel
---
 src/gui/util/qscroller.cpp | 24 +++++++++++++-----------
 src/gui/util/qscroller_p.h |  4 ----
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp
index 9c2d24d..db128c1 100644
--- a/src/gui/util/qscroller.cpp
+++ b/src/gui/util/qscroller.cpp
@@ -279,9 +279,11 @@ private:
     \sa QScrollEvent, QScrollPrepareEvent, QScrollerProperties
 */
 
+typedef QMap<QObject *, QScroller *> ScrollerHash;
+typedef QSet<QScroller *> ScrollerSet;
 
-QMap<QObject *, QScroller *> QScrollerPrivate::allScrollers;
-QSet<QScroller *> QScrollerPrivate::activeScrollers;
+Q_GLOBAL_STATIC(ScrollerHash, qt_allScrollers)
+Q_GLOBAL_STATIC(ScrollerSet, qt_activeScrollers)
 
 /*!
     Returns \c true if a QScroller object was already created for \a target; \c false otherwise.
@@ -290,7 +292,7 @@ QSet<QScroller *> QScrollerPrivate::activeScrollers;
 */
 bool QScroller::hasScroller(QObject *target)
 {
-    return (QScrollerPrivate::allScrollers.value(target));
+    return (qt_allScrollers()->value(target));
 }
 
 /*!
@@ -308,11 +310,11 @@ QScroller *QScroller::scroller(QObject *target)
         return 0;
     }
 
-    if (QScrollerPrivate::allScrollers.contains(target))
-        return QScrollerPrivate::allScrollers.value(target);
+    if (qt_allScrollers()->contains(target))
+        return qt_allScrollers()->value(target);
 
     QScroller *s = new QScroller(target);
-    QScrollerPrivate::allScrollers.insert(target, s);
+    qt_allScrollers()->insert(target, s);
     return s;
 }
 
@@ -332,7 +334,7 @@ const QScroller *QScroller::scroller(const QObject *target)
 */
 QList<QScroller *> QScroller::activeScrollers()
 {
-    return QScrollerPrivate::activeScrollers.toList();
+    return qt_activeScrollers()->toList();
 }
 
 /*!
@@ -508,8 +510,8 @@ QScroller::~QScroller()
     // do not delete the recognizer. The QGestureManager is doing this.
     d->recognizer = 0;
 #endif
-    QScrollerPrivate::allScrollers.remove(d->target);
-    QScrollerPrivate::activeScrollers.remove(this);
+    qt_allScrollers()->remove(d->target);
+    qt_activeScrollers()->remove(this);
 
     delete d_ptr;
 }
@@ -1754,9 +1756,9 @@ void QScrollerPrivate::setState(QScroller::State newstate)
         firstScroll = true;
     }
     if (state == QScroller::Dragging || state == QScroller::Scrolling)
-        activeScrollers.insert(q);
+        qt_activeScrollers()->insert(q);
     else
-        activeScrollers.remove(q);
+        qt_activeScrollers()->remove(q);
     emit q->stateChanged(state);
 }
 
diff --git a/src/gui/util/qscroller_p.h b/src/gui/util/qscroller_p.h
index 8c5f2e7..c119615 100644
--- a/src/gui/util/qscroller_p.h
+++ b/src/gui/util/qscroller_p.h
@@ -148,10 +148,6 @@ public slots:
     void targetDestroyed();
 
 public:
-    // static
-    static QMap<QObject *, QScroller *> allScrollers;
-    static QSet<QScroller *> activeScrollers;
-
     // non static
     QObject *target;
     QScrollerProperties properties;
-- 
cgit v0.12


From b0a01659ee47752d905b2c30bf9027ced8b1f86c Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Mon, 18 Apr 2011 14:47:55 +0200
Subject: Revert "QNativeWifiEngine: Fix problem with wifi polling on Windows"

This reverts commit 2e7e8a2b805b868eade36cc44fa14bf8ca2f8c2f.

This broke the QNetworkconfigurationManager auto tests.

Reviewed-by: Peter Hartmann
---
 src/plugins/bearer/nativewifi/qnativewifiengine.cpp | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
index d5beeff..16c2239 100644
--- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
+++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
@@ -501,11 +501,6 @@ void QNativeWifiEngine::requestUpdate()
         return;
     }
 
-    if (interfaceList->dwNumberOfItems == 0) {
-        local_WlanFreeMemory(interfaceList);
-        return;
-    }
-
     bool requested = false;
     for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
         result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0);
-- 
cgit v0.12


From 393462ae14f6c33d0dc462704c754cf4f6bd41c3 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:04 -0500
Subject: QtDBus: Cleaning comments, spacing, etc.

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp |  4 ++--
 src/dbus/qdbusintegrator.cpp | 13 +++++--------
 src/dbus/qdbusserver.cpp     |  6 +++---
 3 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index 4883a4d..a7ee5b9 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -371,7 +371,7 @@ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name)
 }
 
 /*!
-    Opens a peer-to-peer connection on address \a address and associate with it the
+    Opens a connection to a private bus on address \a address and associate with it the
     connection name \a name. Returns a QDBusConnection object associated with that connection.
 */
 QDBusConnection QDBusConnection::connectToBus(const QString &address,
@@ -413,7 +413,7 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address,
 }
 
 /*!
-    Closes the connection of name \a name.
+    Closes the bus connection of name \a name.
 
     Note that if there are still QDBusConnection objects associated
     with the same connection, the connection will not be closed until
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index d6fbe80..a1cb209 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -377,7 +377,7 @@ static void qDBusUpdateDispatchStatus(DBusConnection *connection, DBusDispatchSt
 
 static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, void *data)
 {
-    // ### We may want to separate the server from the QDBusConnectionPrivate    
+    // ### We may want to separate the server from the QDBusConnectionPrivate
     Q_ASSERT(server); Q_UNUSED(server);
     Q_ASSERT(connection);
     Q_ASSERT(data);
@@ -385,17 +385,14 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v
     // keep the connection alive
     q_dbus_connection_ref(connection);
     QDBusConnectionPrivate *d = new QDBusConnectionPrivate;
-    
-    // setConnection does the error handling for us
+
+    // setPeer does the error handling for us
     QDBusErrorInternal error;
     d->setPeer(connection, error);
 
     QDBusConnection retval = QDBusConnectionPrivate::q(d);
     d->setBusService(retval);
 
-    //d->name = QString::number(reinterpret_cast<int>(d));
-    //d->setConnection(d->name, d); 
-
     // make QDBusServer emit the newConnection signal
     QDBusConnectionPrivate *server_d = static_cast<QDBusConnectionPrivate *>(data);
     server_d->serverConnection(retval);
@@ -1630,7 +1627,7 @@ void QDBusConnectionPrivate::setServer(DBusServer *s, const QDBusErrorInternal &
                                                                        this, 0);
     //qDebug() << "time_functions_set" << time_functions_set;
     Q_UNUSED(time_functions_set);
-    
+
     q_dbus_server_set_new_connection_function(server, qDBusNewConnection, this, 0);
 
     dbus_bool_t data_set = q_dbus_server_set_data(server, server_slot, this, 0);
@@ -1647,7 +1644,7 @@ void QDBusConnectionPrivate::setPeer(DBusConnection *c, const QDBusErrorInternal
 
     connection = c;
     mode = PeerMode;
-    
+
     q_dbus_connection_set_exit_on_disconnect(connection, false);
     q_dbus_connection_set_watch_functions(connection,
                                         qDBusAddWatch,
diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp
index 9b61555..1fe80bd 100644
--- a/src/dbus/qdbusserver.cpp
+++ b/src/dbus/qdbusserver.cpp
@@ -74,7 +74,6 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent)
     QObject::connect(d, SIGNAL(newServerConnection(QDBusConnection)),
                      this, SIGNAL(newConnection(QDBusConnection)));
 
-    // server = q_dbus_server_listen( "unix:tmpdir=/tmp", &error);
     QDBusErrorInternal error;
     d->setServer(q_dbus_server_listen(address.toUtf8().constData(), error), error);
 }
@@ -113,11 +112,12 @@ QString QDBusServer::address() const
 
     return addr;
 }
+
 /*!
   \fn void QDBusServer::newConnection(const QDBusConnection &connection)
 
-  This signal is currently not used, but if and when it is
-  used, \a connection will be the new connection. 
+  This signal is emitted when a new client connection \a connection is
+  established to the server.
  */
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From 35a7a647faf66b281b9ca952252f90e530aa3afb Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:05 -0500
Subject: QtDBus: Fix QDBusServer to handle correctly new dbus connections

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusintegrator.cpp | 15 ++++++---------
 src/dbus/qdbusserver.cpp     |  6 ++++--
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index a1cb209..e09b155 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -384,18 +384,16 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v
 
     // keep the connection alive
     q_dbus_connection_ref(connection);
-    QDBusConnectionPrivate *d = new QDBusConnectionPrivate;
+    QDBusConnectionPrivate *d = static_cast<QDBusConnectionPrivate *>(data);
 
     // setPeer does the error handling for us
     QDBusErrorInternal error;
     d->setPeer(connection, error);
 
     QDBusConnection retval = QDBusConnectionPrivate::q(d);
-    d->setBusService(retval);
 
     // make QDBusServer emit the newConnection signal
-    QDBusConnectionPrivate *server_d = static_cast<QDBusConnectionPrivate *>(data);
-    server_d->serverConnection(retval);
+    d->serverConnection(retval);
 }
 
 } // extern "C"
@@ -1033,11 +1031,10 @@ void QDBusConnectionPrivate::closeConnection()
     mode = InvalidMode; // prevent reentrancy
     baseService.clear();
 
-    if (oldMode == ServerMode) {
-        if (server) {
-            q_dbus_server_disconnect(server);
-        }
-    } else if (oldMode == ClientMode || oldMode == PeerMode) {
+    if (server)
+        q_dbus_server_disconnect(server);
+
+    if (oldMode == ClientMode || oldMode == PeerMode) {
         if (connection) {
             q_dbus_connection_close(connection);
             // send the "close" message
diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp
index 1fe80bd..3189b4e 100644
--- a/src/dbus/qdbusserver.cpp
+++ b/src/dbus/qdbusserver.cpp
@@ -62,14 +62,16 @@ QT_BEGIN_NAMESPACE
 QDBusServer::QDBusServer(const QString &address, QObject *parent)
     : QObject(parent)
 {
+    if (address.isEmpty())
+        return;
+
     if (!qdbus_loadLibDBus()) {
         d = 0;
         return;
     }
     d = new QDBusConnectionPrivate(this);
 
-    if (address.isEmpty())
-        return;
+    d->name = QLatin1String("QDBusServer-") + QString::number(reinterpret_cast<qulonglong>(d));
 
     QObject::connect(d, SIGNAL(newServerConnection(QDBusConnection)),
                      this, SIGNAL(newConnection(QDBusConnection)));
-- 
cgit v0.12


From bc0bf6f84034267d1e15ca9ca31e6498e6d97bd3 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:06 -0500
Subject: QtDBus: Fix registering objects using path '/' in peer-to-peer
 connections

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp | 2 +-
 src/dbus/qdbusintegrator.cpp | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index a7ee5b9..f78d7da 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -814,7 +814,7 @@ void QDBusConnection::unregisterObject(const QString &path, UnregisterMode mode)
 
     // find the object
     while (node) {
-        if (pathComponents.count() == i) {
+        if (pathComponents.count() == i || !path.compare(QLatin1String("/"))) {
             // found it
             node->obj = 0;
             node->flags = 0;
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index e09b155..10f749b 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -430,6 +430,11 @@ static bool findObject(const QDBusConnectionPrivate::ObjectTreeNode *root,
                        const QString &fullpath, int &usedLength,
                        QDBusConnectionPrivate::ObjectTreeNode &result)
 {
+    if (!fullpath.compare(QLatin1String("/")) && root->obj) {
+        usedLength = 1;
+        result = *root;
+        return root;
+    }
     int start = 0;
     int length = fullpath.length();
     if (fullpath.at(0) == QLatin1Char('/'))
-- 
cgit v0.12


From fdf12afc9aaa1432f24817229863baaa68ec13ab Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:07 -0500
Subject: QtDBus: Fix empty service name in peer-to-peer connections

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusabstractinterface.cpp | 2 +-
 src/dbus/qdbusintegrator.cpp        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp
index e48e1c0..d15eb7d 100644
--- a/src/dbus/qdbusabstractinterface.cpp
+++ b/src/dbus/qdbusabstractinterface.cpp
@@ -107,7 +107,7 @@ bool QDBusAbstractInterfacePrivate::canMakeCalls() const
 {
     // recheck only if we have a wildcard (i.e. empty) service or path
     // if any are empty, set the error message according to QDBusUtil
-    if (service.isEmpty())
+    if (service.isEmpty() && connectionPrivate()->mode != QDBusConnectionPrivate::PeerMode)
         return QDBusUtil::checkBusName(service, QDBusUtil::EmptyNotAllowed, &lastError);
     if (path.isEmpty())
         return QDBusUtil::checkObjectPath(path, QDBusUtil::EmptyNotAllowed, &lastError);
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index 10f749b..269e885 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -2390,7 +2390,7 @@ void QDBusConnectionPrivate::unregisterServiceNoLock(const QString &serviceName)
 
 bool QDBusConnectionPrivate::isServiceRegisteredByThread(const QString &serviceName) const
 {
-    if (serviceName == baseService)
+    if (!serviceName.isEmpty() && serviceName == baseService)
         return true;
     QStringList copy = serviceNames;
     return copy.contains(serviceName);
-- 
cgit v0.12


From 7d4e64736774fb0d91f98978af91577461265815 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:08 -0500
Subject: QtDBus: Fix bus in peer-to-peer connections should not be used

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusintegrator.cpp | 58 +++++++++++++++++++++++---------------------
 1 file changed, 31 insertions(+), 27 deletions(-)

diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index 269e885..b8698de 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -2098,21 +2098,23 @@ void QDBusConnectionPrivate::connectSignal(const QString &key, const SignalHook
     matchRefCounts.insert(hook.matchRule, 1);
 
     if (connection) {
-        qDBusDebug("Adding rule: %s", hook.matchRule.constData());
-        q_dbus_bus_add_match(connection, hook.matchRule, NULL);
-
-        // Successfully connected the signal
-        // Do we need to watch for this name?
-        if (shouldWatchService(hook.service)) {
-            WatchedServicesHash::mapped_type &data = watchedServices[hook.service];
-            if (++data.refcount == 1) {
-                // we need to watch for this service changing
-                connectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
-                              QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
-                              this, SLOT(serviceOwnerChangedNoLock(QString,QString,QString)));
-                data.owner = getNameOwnerNoCache(hook.service);
-                qDBusDebug() << this << "Watching service" << hook.service << "for owner changes (current owner:"
-                             << data.owner << ")";
+        if (mode != QDBusConnectionPrivate::PeerMode) {
+            qDBusDebug("Adding rule: %s", hook.matchRule.constData());
+            q_dbus_bus_add_match(connection, hook.matchRule, NULL);
+
+            // Successfully connected the signal
+            // Do we need to watch for this name?
+            if (shouldWatchService(hook.service)) {
+                WatchedServicesHash::mapped_type &data = watchedServices[hook.service];
+                if (++data.refcount == 1) {
+                    // we need to watch for this service changing
+                    connectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
+                                  QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
+                                  this, SLOT(serviceOwnerChangedNoLock(QString,QString,QString)));
+                    data.owner = getNameOwnerNoCache(hook.service);
+                    qDBusDebug() << this << "Watching service" << hook.service << "for owner changes (current owner:"
+                                 << data.owner << ")";
+                }
             }
         }
     }
@@ -2176,18 +2178,20 @@ QDBusConnectionPrivate::disconnectSignal(SignalHookHash::Iterator &it)
 
     // we don't care about errors here
     if (connection && erase) {
-        qDBusDebug("Removing rule: %s", hook.matchRule.constData());
-        q_dbus_bus_remove_match(connection, hook.matchRule, NULL);
-
-        // Successfully disconnected the signal
-        // Were we watching for this name?
-        WatchedServicesHash::Iterator sit = watchedServices.find(hook.service);
-        if (sit != watchedServices.end()) {
-            if (--sit.value().refcount == 0) {
-                watchedServices.erase(sit);
-                disconnectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
-                              QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
-                              this, SLOT(_q_serviceOwnerChanged(QString,QString,QString)));
+        if (mode != QDBusConnectionPrivate::PeerMode) {
+            qDBusDebug("Removing rule: %s", hook.matchRule.constData());
+            q_dbus_bus_remove_match(connection, hook.matchRule, NULL);
+
+            // Successfully disconnected the signal
+            // Were we watching for this name?
+            WatchedServicesHash::Iterator sit = watchedServices.find(hook.service);
+            if (sit != watchedServices.end()) {
+                if (--sit.value().refcount == 0) {
+                    watchedServices.erase(sit);
+                    disconnectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
+                                  QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
+                                  this, SLOT(_q_serviceOwnerChanged(QString,QString,QString)));
+                }
             }
         }
 
-- 
cgit v0.12


From 9ac6b01ec67ead91143f7c722dbfab38f94dc8c3 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:09 -0500
Subject: QtDBus: Fix QDBusConnection::disconnectFromBus() for peer-to-peer
 connections

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index f78d7da..0d28c30 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -424,6 +424,9 @@ void QDBusConnection::disconnectFromBus(const QString &name)
 {
     if (_q_manager()) {
         QMutexLocker locker(&_q_manager()->mutex);
+        QDBusConnectionPrivate *d = _q_manager()->connection(name);
+        if(d && d->mode != QDBusConnectionPrivate::ClientMode)
+            return;
         _q_manager()->removeConnection(name);
     }
 }
-- 
cgit v0.12


From 0792182c396c531d8b9d660df97849ef094c1023 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:10 -0500
Subject: QtDBus: Add method QDBusConnection::connectToPeer()

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp | 34 ++++++++++++++++++++++++++++++++++
 src/dbus/qdbusconnection.h   |  1 +
 2 files changed, 35 insertions(+)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index 0d28c30..6df95ec 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -411,6 +411,40 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address,
 
     return retval;
 }
+/*!
+    \since 4.8
+
+    Opens a peer-to-peer connection on address \a address and associate with it the
+    connection name \a name. Returns a QDBusConnection object associated with that connection.
+*/
+QDBusConnection QDBusConnection::connectToPeer(const QString &address,
+                                               const QString &name)
+{
+//    Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection",
+//               "Cannot create connection without a Q[Core]Application instance");
+    if (!qdbus_loadLibDBus()){
+        QDBusConnectionPrivate *d = 0;
+        return QDBusConnection(d);
+    }
+
+    QMutexLocker locker(&_q_manager()->mutex);
+
+    QDBusConnectionPrivate *d = _q_manager()->connection(name);
+    if (d || name.isEmpty())
+        return QDBusConnection(d);
+
+    d = new QDBusConnectionPrivate;
+    // setPeer does the error handling for us
+    QDBusErrorInternal error;
+    DBusConnection *c = q_dbus_connection_open_private(address.toUtf8().constData(), error);
+
+    d->setPeer(c, error);
+    _q_manager()->setConnection(name, d);
+
+    QDBusConnection retval(d);
+
+    return retval;
+}
 
 /*!
     Closes the bus connection of name \a name.
diff --git a/src/dbus/qdbusconnection.h b/src/dbus/qdbusconnection.h
index 6ab0ea2..8aa0726 100644
--- a/src/dbus/qdbusconnection.h
+++ b/src/dbus/qdbusconnection.h
@@ -172,6 +172,7 @@ public:
 
     static QDBusConnection connectToBus(BusType type, const QString &name);
     static QDBusConnection connectToBus(const QString &address, const QString &name);
+    static QDBusConnection connectToPeer(const QString &address, const QString &name);
     static void disconnectFromBus(const QString &name);
 
     static QDBusConnection sessionBus();
-- 
cgit v0.12


From e6c46787ff5b8ac2bd700c35b6e04d7c835b1c23 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:10 -0500
Subject: QtDBus: Add method QDBusConnection::disconnectFromPeer()

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp | 21 +++++++++++++++++++++
 src/dbus/qdbusconnection.h   |  1 +
 2 files changed, 22 insertions(+)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index 6df95ec..dea7cf9 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -466,6 +466,27 @@ void QDBusConnection::disconnectFromBus(const QString &name)
 }
 
 /*!
+    \since 4.8
+
+    Closes the peer connection of name \a name.
+
+    Note that if there are still QDBusConnection objects associated
+    with the same connection, the connection will not be closed until
+    all references are dropped. However, no further references can be
+    created using the QDBusConnection constructor.
+*/
+void QDBusConnection::disconnectFromPeer(const QString &name)
+{
+    if (_q_manager()) {
+        QMutexLocker locker(&_q_manager()->mutex);
+        QDBusConnectionPrivate *d = _q_manager()->connection(name);
+        if(d && d->mode != QDBusConnectionPrivate::PeerMode)
+            return;
+        _q_manager()->removeConnection(name);
+    }
+}
+
+/*!
     Sends the \a message over this connection, without waiting for a
     reply. This is suitable for errors, signals, and return values as
     well as calls whose return values are not necessary.
diff --git a/src/dbus/qdbusconnection.h b/src/dbus/qdbusconnection.h
index 8aa0726..15e08a7 100644
--- a/src/dbus/qdbusconnection.h
+++ b/src/dbus/qdbusconnection.h
@@ -174,6 +174,7 @@ public:
     static QDBusConnection connectToBus(const QString &address, const QString &name);
     static QDBusConnection connectToPeer(const QString &address, const QString &name);
     static void disconnectFromBus(const QString &name);
+    static void disconnectFromPeer(const QString &name);
 
     static QDBusConnection sessionBus();
     static QDBusConnection systemBus();
-- 
cgit v0.12


From cb3bed20f66d36057db971e4feb75c9823cb19a8 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:11 -0500
Subject: QtDBus: Add unit tests for peer-to-peer connection

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 tests/auto/qdbusconnection/tst_qdbusconnection.cpp | 382 +++++++++++++++++++++
 1 file changed, 382 insertions(+)

diff --git a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
index 8e3a44b..dcd3d98 100644
--- a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
+++ b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
@@ -86,6 +86,7 @@ public slots:
 private slots:
     void noConnection();
     void connectToBus();
+    void connectToPeer();
     void connect();
     void send();
     void sendWithGui();
@@ -94,9 +95,13 @@ private slots:
 
     void registerObject_data();
     void registerObject();
+    void registerObjectPeer_data();
+    void registerObjectPeer();
     void registerObject2();
+    void registerObjectPeer2();
 
     void registerQObjectChildren();
+    void registerQObjectChildrenPeer();
 
     void callSelf();
     void callSelfByAnotherName_data();
@@ -111,6 +116,7 @@ private slots:
 public:
     QString serviceName() const { return "com.trolltech.Qt.Autotests.QDBusConnection"; }
     bool callMethod(const QDBusConnection &conn, const QString &path);
+    bool callMethodPeer(const QDBusConnection &conn, const QString &path);
 };
 
 class QDBusSpy: public QObject
@@ -259,6 +265,14 @@ void tst_QDBusConnection::connectToBus()
         QVERIFY(!con.lastError().isValid());
     }
 
+    QDBusConnection::disconnectFromPeer("bubu");
+
+    {
+        QDBusConnection con("bubu");
+        QVERIFY(con.isConnected());
+        QVERIFY(!con.lastError().isValid());
+    }
+
     QDBusConnection::disconnectFromBus("bubu");
 
     {
@@ -277,6 +291,65 @@ void tst_QDBusConnection::connectToBus()
     }
 }
 
+void tst_QDBusConnection::connectToPeer()
+{
+    {
+        QDBusConnection con = QDBusConnection::connectToPeer(
+                "", "newconn");
+        QVERIFY(!con.isConnected());
+        QVERIFY(con.lastError().isValid());
+    }
+
+    QDBusServer server("unix:tmpdir=/tmp", 0);
+
+    {
+        QDBusConnection con = QDBusConnection::connectToPeer(
+                "unix:abstract=/tmp/dbus-XXXXXXXXXX,guid=00000000000000000000000000000000", "newconn2");
+        QVERIFY(!con.isConnected());
+        QVERIFY(con.lastError().isValid());
+    }
+
+    {
+        QDBusConnection con = QDBusConnection::connectToPeer(
+                server.address(), "bubu");
+
+        QVERIFY(con.isConnected());
+        QVERIFY(!con.lastError().isValid());
+
+        QDBusConnection con2("foo");
+        QVERIFY(!con2.isConnected());
+        QVERIFY(!con2.lastError().isValid());
+
+        con2 = con;
+        QVERIFY(con.isConnected());
+        QVERIFY(con2.isConnected());
+        QVERIFY(!con.lastError().isValid());
+        QVERIFY(!con2.lastError().isValid());
+    }
+
+    {
+        QDBusConnection con("bubu");
+        QVERIFY(con.isConnected());
+        QVERIFY(!con.lastError().isValid());
+    }
+
+    QDBusConnection::disconnectFromBus("bubu");
+
+    {
+        QDBusConnection con("bubu");
+        QVERIFY(con.isConnected());
+        QVERIFY(!con.lastError().isValid());
+    }
+
+    QDBusConnection::disconnectFromPeer("bubu");
+
+    {
+        QDBusConnection con("bubu");
+        QVERIFY(!con.isConnected());
+        QVERIFY(!con.lastError().isValid());
+    }
+}
+
 void tst_QDBusConnection::registerObject_data()
 {
     QTest::addColumn<QString>("path");
@@ -308,6 +381,106 @@ void tst_QDBusConnection::registerObject()
     QVERIFY(!callMethod(con, path));
 }
 
+class MyServer : public QDBusServer
+{
+    Q_OBJECT
+public:
+    MyServer(QString path, QString addr, QObject* parent) : QDBusServer(addr, parent),
+                                                            m_path(path),
+                                                            m_conn("none")
+    {
+        connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
+    }
+
+    bool registerObject()
+    {
+        if( !m_conn.registerObject(m_path, &m_obj, QDBusConnection::ExportAllSlots) )
+            return false;
+        if(! (m_conn.objectRegisteredAt(m_path) == &m_obj))
+            return false;
+        return true;
+    }
+
+    void unregisterObject()
+    {
+        m_conn.unregisterObject(m_path);
+    }
+
+public slots:
+    void handleConnection(const QDBusConnection& c)
+    {
+        m_conn = c;
+        QVERIFY(isConnected());
+        QVERIFY(m_conn.isConnected());
+        QVERIFY(registerObject());
+    }
+
+private:
+    MyObject m_obj;
+    QString m_path;
+    QDBusConnection m_conn;
+};
+
+
+void tst_QDBusConnection::registerObjectPeer_data()
+{
+    QTest::addColumn<QString>("path");
+
+    QTest::newRow("/") << "/";
+    QTest::newRow("/p1") << "/p1";
+    QTest::newRow("/p2") << "/p2";
+    QTest::newRow("/p1/q") << "/p1/q";
+    QTest::newRow("/p1/q/r") << "/p1/q/r";
+}
+
+void tst_QDBusConnection::registerObjectPeer()
+{
+    QFETCH(QString, path);
+
+    MyServer server(path, "unix:tmpdir=/tmp", 0);
+
+    {
+        QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo");
+
+        QCoreApplication::processEvents();
+        QVERIFY(con.isConnected());
+
+        MyObject obj;
+        QVERIFY(callMethodPeer(con, path));
+        QCOMPARE(obj.path, path);
+    }
+
+    {
+        QDBusConnection con("foo");
+        QVERIFY(con.isConnected());
+        QVERIFY(callMethodPeer(con, path));
+    }
+
+    server.unregisterObject();
+
+    {
+        QDBusConnection con("foo");
+        QVERIFY(con.isConnected());
+        QVERIFY(!callMethodPeer(con, path));
+    }
+
+    server.registerObject();
+
+    {
+        QDBusConnection con("foo");
+        QVERIFY(con.isConnected());
+        QVERIFY(callMethodPeer(con, path));
+    }
+
+    QDBusConnection::disconnectFromPeer("foo");
+
+    {
+        QDBusConnection con("foo");
+        QVERIFY(!con.isConnected());
+        QVERIFY(!callMethodPeer(con, path));
+    }
+}
+
 void tst_QDBusConnection::registerObject2()
 {
     QDBusConnection con = QDBusConnection::sessionBus();
@@ -401,6 +574,134 @@ void tst_QDBusConnection::registerObject2()
     }
 }
 
+class MyServer2 : public QDBusServer
+{
+    Q_OBJECT
+public:
+    MyServer2(QString addr, QObject* parent) : QDBusServer(addr, parent),
+                                              m_conn("none")
+    {
+        connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
+    }
+
+    QDBusConnection connection()
+    {
+        return m_conn;
+    }
+
+public slots:
+    void handleConnection(const QDBusConnection& c)
+    {
+        m_conn = c;
+        QVERIFY(isConnected());
+        QVERIFY(m_conn.isConnected());
+    }
+
+private:
+    MyObject m_obj;
+    QDBusConnection m_conn;
+};
+
+void tst_QDBusConnection::registerObjectPeer2()
+{
+    MyServer2 server("unix:tmpdir=/tmp", 0);
+    QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo");
+    QCoreApplication::processEvents();
+    QVERIFY(con.isConnected());
+
+    QDBusConnection srv_con = server.connection();
+
+    // make sure nothing is using our paths:
+    QVERIFY(!callMethodPeer(srv_con, "/"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1"));
+    QVERIFY(!callMethodPeer(srv_con, "/p2"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/q"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/q/r"));
+
+    {
+        // register one object at root:
+        MyObject obj;
+        QVERIFY(con.registerObject("/", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(callMethodPeer(srv_con, "/"));
+        qDebug() << obj.path;
+        QCOMPARE(obj.path, QString("/"));
+    }
+    // make sure it's gone
+    QVERIFY(!callMethodPeer(srv_con, "/"));
+
+    {
+        // register one at an element:
+        MyObject obj;
+        QVERIFY(con.registerObject("/p1", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(!callMethodPeer(srv_con, "/"));
+        QVERIFY(callMethodPeer(srv_con, "/p1"));
+        qDebug() << obj.path;
+        QCOMPARE(obj.path, QString("/p1"));
+
+        // re-register it somewhere else
+        QVERIFY(con.registerObject("/p2", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(callMethodPeer(srv_con, "/p1"));
+        QCOMPARE(obj.path, QString("/p1"));
+        QVERIFY(callMethodPeer(srv_con, "/p2"));
+        QCOMPARE(obj.path, QString("/p2"));
+    }
+    // make sure it's gone
+    QVERIFY(!callMethodPeer(srv_con, "/p1"));
+    QVERIFY(!callMethodPeer(srv_con, "/p2"));
+
+    {
+        // register at a deep path
+        MyObject obj;
+        QVERIFY(con.registerObject("/p1/q/r", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(!callMethodPeer(srv_con, "/"));
+        QVERIFY(!callMethodPeer(srv_con, "/p1"));
+        QVERIFY(!callMethodPeer(srv_con, "/p1/q"));
+        QVERIFY(callMethodPeer(srv_con, "/p1/q/r"));
+        QCOMPARE(obj.path, QString("/p1/q/r"));
+    }
+    // make sure it's gone
+    QVERIFY(!callMethodPeer(srv_con, "/p1/q/r"));
+
+    {
+        MyObject obj;
+        QVERIFY(con.registerObject("/p1/q2", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2"));
+        QCOMPARE(obj.path, QString("/p1/q2"));
+
+        // try unregistering
+        con.unregisterObject("/p1/q2");
+        QVERIFY(!callMethodPeer(srv_con, "/p1/q2"));
+
+        // register it again
+        QVERIFY(con.registerObject("/p1/q2", &obj, QDBusConnection::ExportAllSlots));
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2"));
+        QCOMPARE(obj.path, QString("/p1/q2"));
+
+        // now try removing things around it:
+        con.unregisterObject("/p2");
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2")); // unrelated object shouldn't affect
+
+        con.unregisterObject("/p1");
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2")); // unregistering just the parent shouldn't affect it
+
+        con.unregisterObject("/p1/q2/r");
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2")); // unregistering non-existing child shouldn't affect it either
+
+        con.unregisterObject("/p1/q");
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2")); // unregistering sibling (before) shouldn't affect
+
+        con.unregisterObject("/p1/r");
+        QVERIFY(callMethodPeer(srv_con, "/p1/q2")); // unregistering sibling (after) shouldn't affect
+
+        // now remove it:
+        con.unregisterObject("/p1", QDBusConnection::UnregisterTree);
+        QVERIFY(!callMethodPeer(srv_con, "/p1/q2")); // we removed the full tree
+    }
+
+    QDBusConnection::disconnectFromPeer("foo");
+}
+
+
 void tst_QDBusConnection::registerQObjectChildren()
 {
     // make sure no one is there
@@ -456,6 +757,68 @@ void tst_QDBusConnection::registerQObjectChildren()
     QVERIFY(!callMethod(con, "/p1/c/cc"));
 }
 
+void tst_QDBusConnection::registerQObjectChildrenPeer()
+{
+    MyServer2 server("unix:tmpdir=/tmp", 0);
+    QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo");
+    QCoreApplication::processEvents();
+    QVERIFY(con.isConnected());
+
+    QDBusConnection srv_con = server.connection();
+
+    QVERIFY(!callMethodPeer(srv_con, "/p1"));
+
+    {
+        MyObject obj, *a, *b, *c, *cc;
+
+        a = new MyObject(&obj);
+        a->setObjectName("a");
+
+        b = new MyObject(&obj);
+        b->setObjectName("b");
+
+        c = new MyObject(&obj);
+        c->setObjectName("c");
+
+        cc = new MyObject(c);
+        cc->setObjectName("cc");
+
+        con.registerObject("/p1", &obj, QDBusConnection::ExportAllSlots |
+                           QDBusConnection::ExportChildObjects);
+
+        // make calls
+        QVERIFY(callMethodPeer(srv_con, "/p1"));
+        QCOMPARE(obj.callCount, 1);
+        QVERIFY(callMethodPeer(srv_con, "/p1/a"));
+        QCOMPARE(a->callCount, 1);
+        QVERIFY(callMethodPeer(srv_con, "/p1/b"));
+        QCOMPARE(b->callCount, 1);
+        QVERIFY(callMethodPeer(srv_con, "/p1/c"));
+        QCOMPARE(c->callCount, 1);
+        QVERIFY(callMethodPeer(srv_con, "/p1/c/cc"));
+        QCOMPARE(cc->callCount, 1);
+
+        QVERIFY(!callMethodPeer(srv_con, "/p1/d"));
+        QVERIFY(!callMethodPeer(srv_con, "/p1/c/abc"));
+
+        // pull an object, see if it goes away:
+        delete b;
+        QVERIFY(!callMethodPeer(srv_con, "/p1/b"));
+
+        delete c;
+        QVERIFY(!callMethodPeer(srv_con, "/p1/c"));
+        QVERIFY(!callMethodPeer(srv_con, "/p1/c/cc"));
+    }
+
+    QVERIFY(!callMethodPeer(srv_con, "/p1"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/a"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/b"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/c"));
+    QVERIFY(!callMethodPeer(srv_con, "/p1/c/cc"));
+
+    QDBusConnection::disconnectFromPeer("foo");
+}
+
 bool tst_QDBusConnection::callMethod(const QDBusConnection &conn, const QString &path)
 {
     QDBusMessage msg = QDBusMessage::createMethodCall(conn.baseService(), path, "", "method");
@@ -475,6 +838,25 @@ bool tst_QDBusConnection::callMethod(const QDBusConnection &conn, const QString
     return true;
 }
 
+bool tst_QDBusConnection::callMethodPeer(const QDBusConnection &conn, const QString &path)
+{
+    QDBusMessage msg = QDBusMessage::createMethodCall("", path, "", "method");
+    QDBusMessage reply = conn.call(msg, QDBus::BlockWithGui);
+
+    if (reply.type() != QDBusMessage::ReplyMessage)
+        return false;
+    if (MyObject::path == path) {
+        QTest::compare_helper(true, "COMPARE()", __FILE__, __LINE__);
+    } else {
+        QTest::compare_helper(false, "Compared values are not the same",
+                              QTest::toString(MyObject::path), QTest::toString(path),
+                              "MyObject::path", "path", __FILE__, __LINE__);
+        return false;
+    }
+
+    return true;
+}
+
 class TestObject : public QObject
 {
 Q_OBJECT
-- 
cgit v0.12


From 5be6cf0a6e306ed3a51ed5ba89317b1317544eea Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:12 -0500
Subject: QtDBus: Add default constructor to QDBusServer

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusserver.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/dbus/qdbusserver.h b/src/dbus/qdbusserver.h
index f101011..eedbe0f 100644
--- a/src/dbus/qdbusserver.h
+++ b/src/dbus/qdbusserver.h
@@ -61,7 +61,7 @@ class Q_DBUS_EXPORT QDBusServer: public QObject
 {
     Q_OBJECT
 public:
-    QDBusServer(const QString &address, QObject *parent = 0);
+    QDBusServer(const QString &address = "unix:tmpdir=/tmp", QObject *parent = 0);
 
     bool isConnected() const;
     QDBusError lastError() const;
-- 
cgit v0.12


From a25ec261a52685792527c77e4de0dee28e300bbb Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:13 -0500
Subject: QtDBus: Fix minor coding style issues

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp                       |  8 ++++----
 src/dbus/qdbusconnection_p.h                       |  2 +-
 tests/auto/qdbusconnection/tst_qdbusconnection.cpp |  2 +-
 tests/auto/qdbusinterface/tst_qdbusinterface.cpp   | 16 ++++++++--------
 4 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index dea7cf9..2384cf3 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -379,7 +379,7 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address,
 {
 //    Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection",
 //               "Cannot create connection without a Q[Core]Application instance");
-    if (!qdbus_loadLibDBus()){
+    if (!qdbus_loadLibDBus()) {
         QDBusConnectionPrivate *d = 0;
         return QDBusConnection(d);
     }
@@ -422,7 +422,7 @@ QDBusConnection QDBusConnection::connectToPeer(const QString &address,
 {
 //    Q_ASSERT_X(QCoreApplication::instance(), "QDBusConnection::addConnection",
 //               "Cannot create connection without a Q[Core]Application instance");
-    if (!qdbus_loadLibDBus()){
+    if (!qdbus_loadLibDBus()) {
         QDBusConnectionPrivate *d = 0;
         return QDBusConnection(d);
     }
@@ -459,7 +459,7 @@ void QDBusConnection::disconnectFromBus(const QString &name)
     if (_q_manager()) {
         QMutexLocker locker(&_q_manager()->mutex);
         QDBusConnectionPrivate *d = _q_manager()->connection(name);
-        if(d && d->mode != QDBusConnectionPrivate::ClientMode)
+        if (d && d->mode != QDBusConnectionPrivate::ClientMode)
             return;
         _q_manager()->removeConnection(name);
     }
@@ -480,7 +480,7 @@ void QDBusConnection::disconnectFromPeer(const QString &name)
     if (_q_manager()) {
         QMutexLocker locker(&_q_manager()->mutex);
         QDBusConnectionPrivate *d = _q_manager()->connection(name);
-        if(d && d->mode != QDBusConnectionPrivate::PeerMode)
+        if (d && d->mode != QDBusConnectionPrivate::PeerMode)
             return;
         _q_manager()->removeConnection(name);
     }
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
index 36f7c53..355a6e6 100644
--- a/src/dbus/qdbusconnection_p.h
+++ b/src/dbus/qdbusconnection_p.h
@@ -216,7 +216,7 @@ public:
 
     inline void serverConnection(const QDBusConnection &connection)
         { emit newServerConnection(connection); }
-    
+
 private:
     void checkThread();
     bool handleError(const QDBusErrorInternal &error);
diff --git a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
index dcd3d98..d4a9dab 100644
--- a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
+++ b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
@@ -579,7 +579,7 @@ class MyServer2 : public QDBusServer
     Q_OBJECT
 public:
     MyServer2(QString addr, QObject* parent) : QDBusServer(addr, parent),
-                                              m_conn("none")
+                                               m_conn("none")
     {
         connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
     }
diff --git a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
index 39f0677..ce11459 100644
--- a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
@@ -369,7 +369,7 @@ void tst_QDBusInterface::callMethod()
                          TEST_INTERFACE_NAME);
 
     MyObject::callCount = 0;
-   
+
     // call a SLOT method
     QDBusMessage reply = iface.call("ping", qVariantFromValue(QDBusVariant("foo")));
     QCOMPARE(MyObject::callCount, 1);
@@ -388,7 +388,7 @@ void tst_QDBusInterface::callMethod()
     dv = qdbus_cast<QDBusVariant>(v);
     QCOMPARE(dv.variant().type(), QVariant::String);
     QCOMPARE(dv.variant().toString(), QString("foo"));
-    
+
     // call an INVOKABLE method
     reply = iface.call("ping_invokable", qVariantFromValue(QDBusVariant("bar")));
     QCOMPARE(MyObject::callCount, 2);
@@ -416,7 +416,7 @@ void tst_QDBusInterface::invokeMethod()
                          TEST_INTERFACE_NAME);
 
     MyObject::callCount = 0;
-    
+
     // make the SLOT call without a return type
     QDBusVariant arg("foo");
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_ARG(QDBusVariant, arg)));
@@ -428,7 +428,7 @@ void tst_QDBusInterface::invokeMethod()
     QDBusVariant dv = qdbus_cast<QDBusVariant>(v);
     QCOMPARE(dv.variant().type(), QVariant::String);
     QCOMPARE(dv.variant().toString(), QString("foo"));
-    
+
     // make the INVOKABLE call without a return type
     QDBusVariant arg2("bar");
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable", Q_ARG(QDBusVariant, arg2)));
@@ -465,7 +465,7 @@ void tst_QDBusInterface::invokeMethodWithReturn()
 
     // verify that we got the reply as expected
     QCOMPARE(retArg.variant(), arg.variant());
-    
+
     // make the INVOKABLE call without a return type
     QDBusVariant arg2("bar");
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable", Q_RETURN_ARG(QDBusVariant, retArg), Q_ARG(QDBusVariant, arg2)));
@@ -490,7 +490,7 @@ void tst_QDBusInterface::invokeMethodWithMultiReturn()
 
     MyObject::callCount = 0;
     QDBusVariant retArg, retArg2;
-    
+
     // make the SLOT call without a return type
     QDBusVariant arg("foo"), arg2("bar");
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping",
@@ -515,7 +515,7 @@ void tst_QDBusInterface::invokeMethodWithMultiReturn()
     // verify that we got the replies as expected
     QCOMPARE(retArg.variant(), arg.variant());
     QCOMPARE(retArg2.variant(), arg2.variant());
-    
+
     // make the INVOKABLE call without a return type
     QDBusVariant arg3("hello"), arg4("world");
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable",
@@ -550,7 +550,7 @@ void tst_QDBusInterface::invokeMethodWithComplexReturn()
 
     MyObject::callCount = 0;
     QList<int> retArg;
-    
+
     // make the SLOT call without a return type
     QList<int> arg = QList<int>() << 42 << -47;
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QList<int>, retArg), Q_ARG(QList<int>, arg)));
-- 
cgit v0.12


From b9eb6a61392dd025745708e6a5d60a4f019ef32e Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:14 -0500
Subject: QtDBus: Skip bus name check for peer-to-peer connection

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusabstractinterface.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp
index d15eb7d..9e82c09 100644
--- a/src/dbus/qdbusabstractinterface.cpp
+++ b/src/dbus/qdbusabstractinterface.cpp
@@ -58,7 +58,7 @@
 QT_BEGIN_NAMESPACE
 
 static QDBusError checkIfValid(const QString &service, const QString &path,
-                               const QString &interface, bool isDynamic)
+                               const QString &interface, bool isDynamic, bool isPeer)
 {
     // We should be throwing exceptions here... oh well
     QDBusError error;
@@ -69,7 +69,7 @@ static QDBusError checkIfValid(const QString &service, const QString &path,
         // use assertion here because this should never happen, at all
         Q_ASSERT_X(!interface.isEmpty(), "QDBusAbstractInterface", "Interface name cannot be empty");
     }
-    if (!QDBusUtil::checkBusName(service, isDynamic ? QDBusUtil::EmptyNotAllowed : QDBusUtil::EmptyAllowed, &error))
+    if (!QDBusUtil::checkBusName(service, (isDynamic && !isPeer) ? QDBusUtil::EmptyNotAllowed : QDBusUtil::EmptyAllowed, &error))
         return error;
     if (!QDBusUtil::checkObjectPath(path, isDynamic ? QDBusUtil::EmptyNotAllowed : QDBusUtil::EmptyAllowed, &error))
         return error;
@@ -86,7 +86,8 @@ QDBusAbstractInterfacePrivate::QDBusAbstractInterfacePrivate(const QString &serv
                                                              const QDBusConnection& con,
                                                              bool isDynamic)
     : connection(con), service(serv), path(p), interface(iface),
-      lastError(checkIfValid(serv, p, iface, isDynamic)),
+      lastError(checkIfValid(serv, p, iface, isDynamic, (connectionPrivate() &&
+                                                         connectionPrivate()->mode == QDBusConnectionPrivate::PeerMode))),
       isValid(!lastError.isValid())
 {
     if (!isValid)
-- 
cgit v0.12


From c48dce786b99acb4bd85863d09df456c03471ef2 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:15 -0500
Subject: QtDBus: Register QDBusServer connection name in
 QDBusConnectionManager

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/dbus/qdbusconnection.cpp        | 27 +++---------
 src/dbus/qdbusconnectionmanager_p.h | 88 +++++++++++++++++++++++++++++++++++++
 src/dbus/qdbusserver.cpp            | 15 ++++++-
 src/dbus/qdbusserver.h              |  1 +
 4 files changed, 109 insertions(+), 22 deletions(-)
 create mode 100644 src/dbus/qdbusconnectionmanager_p.h

diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index 2384cf3..c8cf6ea 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -52,6 +52,7 @@
 #include "qdbusconnection_p.h"
 #include "qdbusinterface_p.h"
 #include "qdbusutil_p.h"
+#include "qdbusconnectionmanager_p.h"
 
 #include "qdbusthreaddebug_p.h"
 
@@ -59,27 +60,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class QDBusConnectionManager
-{
-public:
-    QDBusConnectionManager() {}
-    ~QDBusConnectionManager();
-
-    QDBusConnectionPrivate *connection(const QString &name) const;
-    void removeConnection(const QString &name);
-    void setConnection(const QString &name, QDBusConnectionPrivate *c);
-
-    QDBusConnectionPrivate *sender() const;
-    void setSender(const QDBusConnectionPrivate *s);
-
-    mutable QMutex mutex;
-private:
-    QHash<QString, QDBusConnectionPrivate *> connectionHash;
-
-    mutable QMutex senderMutex;
-    QString senderName; // internal; will probably change
-};
-
 Q_GLOBAL_STATIC(QDBusConnectionManager, _q_manager)
 
 QDBusConnectionPrivate *QDBusConnectionManager::sender() const
@@ -126,6 +106,11 @@ QDBusConnectionManager::~QDBusConnectionManager()
     connectionHash.clear();
 }
 
+QDBusConnectionManager* QDBusConnectionManager::instance()
+{
+    return _q_manager();
+}
+
 Q_DBUS_EXPORT void qDBusBindToApplication();
 void qDBusBindToApplication()
 {
diff --git a/src/dbus/qdbusconnectionmanager_p.h b/src/dbus/qdbusconnectionmanager_p.h
new file mode 100644
index 0000000..dd8b4aa
--- /dev/null
+++ b/src/dbus/qdbusconnectionmanager_p.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDBus module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the public API.  This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
+
+#ifndef QDBUSCONNECTIONMANAGER_P_H
+#define QDBUSCONNECTIONMANAGER_P_H
+
+#include "qdbusconnection_p.h"
+
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QDBusConnectionManager
+{
+public:
+    QDBusConnectionManager() {}
+    ~QDBusConnectionManager();
+    static QDBusConnectionManager* instance();
+
+    QDBusConnectionPrivate *connection(const QString &name) const;
+    void removeConnection(const QString &name);
+    void setConnection(const QString &name, QDBusConnectionPrivate *c);
+
+    QDBusConnectionPrivate *sender() const;
+    void setSender(const QDBusConnectionPrivate *s);
+
+    mutable QMutex mutex;
+private:
+    QHash<QString, QDBusConnectionPrivate *> connectionHash;
+
+    mutable QMutex senderMutex;
+    QString senderName; // internal; will probably change
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif
diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp
index 3189b4e..abc5cb3 100644
--- a/src/dbus/qdbusserver.cpp
+++ b/src/dbus/qdbusserver.cpp
@@ -41,6 +41,7 @@
 
 #include "qdbusserver.h"
 #include "qdbusconnection_p.h"
+#include "qdbusconnectionmanager_p.h"
 
 #ifndef QT_NO_DBUS
 
@@ -71,7 +72,8 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent)
     }
     d = new QDBusConnectionPrivate(this);
 
-    d->name = QLatin1String("QDBusServer-") + QString::number(reinterpret_cast<qulonglong>(d));
+    QMutexLocker locker(&QDBusConnectionManager::instance()->mutex);
+    QDBusConnectionManager::instance()->setConnection(QLatin1String("QDBusServer-") + QString::number(reinterpret_cast<qulonglong>(d)), d);
 
     QObject::connect(d, SIGNAL(newServerConnection(QDBusConnection)),
                      this, SIGNAL(newConnection(QDBusConnection)));
@@ -81,6 +83,17 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent)
 }
 
 /*!
+    Destructs a QDBusServer
+*/
+QDBusServer::~QDBusServer()
+{
+    if (QDBusConnectionManager::instance()) {
+        QMutexLocker locker(&QDBusConnectionManager::instance()->mutex);
+        QDBusConnectionManager::instance()->removeConnection(d->name);
+    }
+}
+
+/*!
     Returns true if this QDBusServer object is connected.
 
     If it isn't connected, you need to call the constructor again.
diff --git a/src/dbus/qdbusserver.h b/src/dbus/qdbusserver.h
index eedbe0f..fcb78bd 100644
--- a/src/dbus/qdbusserver.h
+++ b/src/dbus/qdbusserver.h
@@ -62,6 +62,7 @@ class Q_DBUS_EXPORT QDBusServer: public QObject
     Q_OBJECT
 public:
     QDBusServer(const QString &address = "unix:tmpdir=/tmp", QObject *parent = 0);
+    virtual ~QDBusServer();
 
     bool isConnected() const;
     QDBusError lastError() const;
-- 
cgit v0.12


From 041b89b3905a79a4493399c592797a6321aa29df Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:16 -0500
Subject: QtDBus: Add unit tests for QDBusAbstractInterface

Also fix xml in tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 .../com.trolltech.QtDBus.Pinger.xml                |   2 +-
 tests/auto/qdbusabstractinterface/interface.h      |   1 +
 .../qdbusabstractinterface.pro                     |  17 +-
 .../qdbusabstractinterface/qpinger/qpinger.cpp     | 131 +++++
 .../qdbusabstractinterface/qpinger/qpinger.pro     |   5 +
 tests/auto/qdbusabstractinterface/test/test.pro    |  13 +
 .../tst_qdbusabstractinterface.cpp                 | 573 +++++++++++++++++++++
 7 files changed, 730 insertions(+), 12 deletions(-)
 create mode 100644 tests/auto/qdbusabstractinterface/qpinger/qpinger.cpp
 create mode 100644 tests/auto/qdbusabstractinterface/qpinger/qpinger.pro
 create mode 100644 tests/auto/qdbusabstractinterface/test/test.pro

diff --git a/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml b/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
index fb2aab8..1667591 100644
--- a/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
+++ b/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
@@ -24,7 +24,7 @@
     </method>
     <method name="multiOutMethod">
        <arg type="s" direction="out"/>
-       <arg type="i" direction="out"/
+       <arg type="i" direction="out"/>
     </method>
   </interface>
 </node>
diff --git a/tests/auto/qdbusabstractinterface/interface.h b/tests/auto/qdbusabstractinterface/interface.h
index 9a14222..62f81af 100644
--- a/tests/auto/qdbusabstractinterface/interface.h
+++ b/tests/auto/qdbusabstractinterface/interface.h
@@ -84,6 +84,7 @@ class Interface: public QObject
     Q_PROPERTY(RegisteredType complexProp READ complexProp WRITE setComplexProp SCRIPTABLE true)
 
     friend class tst_QDBusAbstractInterface;
+    friend class PingerServer;
     QString m_stringProp;
     QDBusVariant m_variantProp;
     RegisteredType m_complexProp;
diff --git a/tests/auto/qdbusabstractinterface/qdbusabstractinterface.pro b/tests/auto/qdbusabstractinterface/qdbusabstractinterface.pro
index a4853b8..f9077b9 100644
--- a/tests/auto/qdbusabstractinterface/qdbusabstractinterface.pro
+++ b/tests/auto/qdbusabstractinterface/qdbusabstractinterface.pro
@@ -1,15 +1,10 @@
 load(qttest_p4)
-QT = core
-contains(QT_CONFIG,dbus): { 
-    SOURCES += tst_qdbusabstractinterface.cpp interface.cpp
-    HEADERS += interface.h
-    QT += dbus
-
-    # These are generated sources
-    # To regenerate, see the command-line at the top of the files
-    SOURCES += pinger.cpp
-    HEADERS += pinger.h
+contains(QT_CONFIG,dbus): {
+    TEMPLATE = subdirs
+    CONFIG += ordered
+    SUBDIRS = qpinger test
+} else {
+    SOURCES += ../qdbusmarshall/dummy.cpp
 }
-else:SOURCES += ../qdbusmarshall/dummy.cpp
 
 OTHER_FILES += com.trolltech.QtDBus.Pinger.xml
diff --git a/tests/auto/qdbusabstractinterface/qpinger/qpinger.cpp b/tests/auto/qdbusabstractinterface/qpinger/qpinger.cpp
new file mode 100644
index 0000000..3b605c8
--- /dev/null
+++ b/tests/auto/qdbusabstractinterface/qpinger/qpinger.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/QtCore>
+#include <QtDBus/QtDBus>
+#include "../interface.h"
+
+static const char serviceName[] = "com.trolltech.autotests.qpinger";
+static const char objectPath[] = "/com/trolltech/qpinger";
+//static const char *interfaceName = serviceName;
+
+class PingerServer : public QDBusServer
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.qpinger")
+public:
+    PingerServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
+        : QDBusServer(addr, parent),
+          m_conn("none")
+    {
+        connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
+        reset();
+    }
+
+public slots:
+    QString address() const
+    {
+        return QDBusServer::address();
+    }
+
+    bool isConnected() const
+    {
+        return m_conn.isConnected();
+    }
+
+    void reset()
+    {
+        targetObj.m_stringProp = "This is a test";
+        targetObj.m_variantProp = QDBusVariant(QVariant(42));
+        targetObj.m_complexProp = RegisteredType("This is a test");
+    }
+
+    void voidSignal()
+    {
+        emit targetObj.voidSignal();
+    }
+
+    void stringSignal(const QString& value)
+    {
+        emit targetObj.stringSignal(value);
+    }
+
+    void complexSignal(const QString& value)
+    {
+        RegisteredType reg(value);
+        emit targetObj.complexSignal(reg);
+    }
+
+private slots:
+    void handleConnection(const QDBusConnection& con)
+    {
+        m_conn = con;
+        m_conn.registerObject("/", &targetObj, QDBusConnection::ExportScriptableContents);
+    }
+
+private:
+    Interface targetObj;
+    QDBusConnection m_conn;
+};
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication app(argc, argv);
+
+    // register the meta types
+    qDBusRegisterMetaType<RegisteredType>();
+    qRegisterMetaType<UnregisteredType>();
+
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!con.isConnected())
+        exit(1);
+
+    if (!con.registerService(serviceName))
+        exit(2);
+
+    PingerServer server;
+    con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
+
+    printf("ready.\n");
+
+    return app.exec();
+}
+
+#include "qpinger.moc"
diff --git a/tests/auto/qdbusabstractinterface/qpinger/qpinger.pro b/tests/auto/qdbusabstractinterface/qpinger/qpinger.pro
new file mode 100644
index 0000000..27545bb
--- /dev/null
+++ b/tests/auto/qdbusabstractinterface/qpinger/qpinger.pro
@@ -0,0 +1,5 @@
+SOURCES = qpinger.cpp ../interface.cpp
+HEADERS = ../interface.h
+TARGET = qpinger
+QT += dbus
+QT -= gui
diff --git a/tests/auto/qdbusabstractinterface/test/test.pro b/tests/auto/qdbusabstractinterface/test/test.pro
new file mode 100644
index 0000000..98bcaa7
--- /dev/null
+++ b/tests/auto/qdbusabstractinterface/test/test.pro
@@ -0,0 +1,13 @@
+load(qttest_p4)
+SOURCES += ../tst_qdbusabstractinterface.cpp ../interface.cpp
+HEADERS += ../interface.h
+
+# These are generated sources
+# To regenerate, see the command-line at the top of the files
+SOURCES += ../pinger.cpp
+HEADERS += ../pinger.h
+
+TARGET = ../tst_qdbusabstractinterface
+
+QT = core
+QT += dbus
diff --git a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index e8ce1f9..6f93d8a 100644
--- a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -49,6 +49,10 @@
 #include "interface.h"
 #include "pinger.h"
 
+static const char serviceName[] = "com.trolltech.autotests.qpinger";
+static const char objectPath[] = "/com/trolltech/qpinger";
+static const char *interfaceName = serviceName;
+
 typedef QSharedPointer<com::trolltech::QtDBus::Pinger> Pinger;
 
 class tst_QDBusAbstractInterface: public QObject
@@ -66,22 +70,47 @@ class tst_QDBusAbstractInterface: public QObject
         return Pinger(new com::trolltech::QtDBus::Pinger(service, path, con));
     }
 
+    Pinger getPingerPeer(const QString &path = "/")
+    {
+        QDBusConnection con = QDBusConnection("peer");
+        if (!con.isConnected())
+            return Pinger();
+        return Pinger(new com::trolltech::QtDBus::Pinger("", path, con));
+    }
+
+    void resetServer()
+    {
+        QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "reset");
+        QDBusConnection::sessionBus().send(req);
+    }
+
 public:
     tst_QDBusAbstractInterface();
 
 private slots:
     void initTestCase();
+    void cleanupTestCase();
 
     void makeVoidCall();
     void makeStringCall();
     void makeComplexCall();
     void makeMultiOutCall();
 
+    void makeVoidCallPeer();
+    void makeStringCallPeer();
+    void makeComplexCallPeer();
+    void makeMultiOutCallPeer();
+
     void makeAsyncVoidCall();
     void makeAsyncStringCall();
     void makeAsyncComplexCall();
     void makeAsyncMultiOutCall();
 
+    void makeAsyncVoidCallPeer();
+    void makeAsyncStringCallPeer();
+    void makeAsyncComplexCallPeer();
+    void makeAsyncMultiOutCallPeer();
+
     void stringPropRead();
     void stringPropWrite();
     void variantPropRead();
@@ -89,6 +118,13 @@ private slots:
     void complexPropRead();
     void complexPropWrite();
 
+    void stringPropReadPeer();
+    void stringPropWritePeer();
+    void variantPropReadPeer();
+    void variantPropWritePeer();
+    void complexPropReadPeer();
+    void complexPropWritePeer();
+
     void stringPropDirectRead();
     void stringPropDirectWrite();
     void variantPropDirectRead();
@@ -96,6 +132,13 @@ private slots:
     void complexPropDirectRead();
     void complexPropDirectWrite();
 
+    void stringPropDirectReadPeer();
+    void stringPropDirectWritePeer();
+    void variantPropDirectReadPeer();
+    void variantPropDirectWritePeer();
+    void complexPropDirectReadPeer();
+    void complexPropDirectWritePeer();
+
     void getVoidSignal_data();
     void getVoidSignal();
     void getStringSignal_data();
@@ -103,16 +146,31 @@ private slots:
     void getComplexSignal_data();
     void getComplexSignal();
 
+    void getVoidSignalPeer_data();
+    void getVoidSignalPeer();
+    void getStringSignalPeer_data();
+    void getStringSignalPeer();
+    void getComplexSignalPeer_data();
+    void getComplexSignalPeer();
+
     void followSignal();
 
     void createErrors_data();
     void createErrors();
 
+    void createErrorsPeer_data();
+    void createErrorsPeer();
+
     void callErrors_data();
     void callErrors();
     void asyncCallErrors_data();
     void asyncCallErrors();
 
+    void callErrorsPeer_data();
+    void callErrorsPeer();
+    void asyncCallErrorsPeer_data();
+    void asyncCallErrorsPeer();
+
     void propertyReadErrors_data();
     void propertyReadErrors();
     void propertyWriteErrors_data();
@@ -121,8 +179,53 @@ private slots:
     void directPropertyReadErrors();
     void directPropertyWriteErrors_data();
     void directPropertyWriteErrors();
+
+    void propertyReadErrorsPeer_data();
+    void propertyReadErrorsPeer();
+    void propertyWriteErrorsPeer_data();
+    void propertyWriteErrorsPeer();
+    void directPropertyReadErrorsPeer_data();
+    void directPropertyReadErrorsPeer();
+    void directPropertyWriteErrorsPeer_data();
+    void directPropertyWriteErrorsPeer();
+private:
+    QProcess proc;
+};
+
+class WaitForQPinger: public QObject
+{
+    Q_OBJECT
+public:
+    WaitForQPinger();
+    bool ok();
+public Q_SLOTS:
+    void ownerChange(const QString &name)
+    {
+        if (name == serviceName)
+            loop.quit();
+    }
+
+private:
+    QEventLoop loop;
 };
 
+WaitForQPinger::WaitForQPinger()
+{
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!ok()) {
+        connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+                SLOT(ownerChange(QString)));
+        QTimer::singleShot(2000, &loop, SLOT(quit()));
+        loop.exec();
+    }
+}
+
+bool WaitForQPinger::ok()
+{
+    return QDBusConnection::sessionBus().isConnected() &&
+        QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
+}
+
 tst_QDBusAbstractInterface::tst_QDBusAbstractInterface()
 {
     // register the meta types
@@ -139,6 +242,39 @@ void tst_QDBusAbstractInterface::initTestCase()
     QDBusConnection con = QDBusConnection::sessionBus();
     QVERIFY(con.isConnected());
     con.registerObject("/", &targetObj, QDBusConnection::ExportScriptableContents);
+
+    // start peer server
+    #ifdef Q_OS_WIN
+    proc.start("qpinger");
+    #else
+    proc.start("./qpinger/qpinger");
+    #endif
+    QVERIFY(proc.waitForStarted());
+
+    WaitForQPinger w;
+    QVERIFY(w.ok());
+    //QTest::qWait(2000);
+
+    // get peer server address
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
+    QDBusMessage rpl = con.call(req);
+    QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+    QString address = rpl.arguments().at(0).toString();
+
+    // connect to peer server
+    QDBusConnection peercon = QDBusConnection::connectToPeer(address, "peer");
+    QVERIFY(peercon.isConnected());
+
+    QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "isConnected");
+    QDBusMessage rpl2 = con.call(req2);
+    QVERIFY(rpl2.type() == QDBusMessage::ReplyMessage);
+    QVERIFY(rpl2.arguments().at(0).toBool());
+}
+
+void tst_QDBusAbstractInterface::cleanupTestCase()
+{
+    proc.close();
+    proc.kill();
 }
 
 void tst_QDBusAbstractInterface::makeVoidCall()
@@ -184,6 +320,49 @@ void tst_QDBusAbstractInterface::makeMultiOutCall()
     QCOMPARE(value, expectedValue);
 }
 
+void tst_QDBusAbstractInterface::makeVoidCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusReply<void> r = p->voidMethod();
+    QVERIFY(r.isValid());
+}
+
+void tst_QDBusAbstractInterface::makeStringCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusReply<QString> r = p->stringMethod();
+    QVERIFY(r.isValid());
+    QCOMPARE(r.value(), targetObj.stringMethod());
+}
+
+void tst_QDBusAbstractInterface::makeComplexCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusReply<RegisteredType> r = p->complexMethod();
+    QVERIFY(r.isValid());
+    QCOMPARE(r.value(), targetObj.complexMethod());
+}
+
+void tst_QDBusAbstractInterface::makeMultiOutCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    int value;
+    QDBusReply<QString> r = p->multiOutMethod(value);
+    QVERIFY(r.isValid());
+
+    int expectedValue;
+    QCOMPARE(r.value(), targetObj.multiOutMethod(expectedValue));
+    QCOMPARE(value, expectedValue);
+}
+
 void tst_QDBusAbstractInterface::makeAsyncVoidCall()
 {
     Pinger p = getPinger();
@@ -230,6 +409,55 @@ void tst_QDBusAbstractInterface::makeAsyncMultiOutCall()
     QCOMPARE(r.argumentAt<1>(), expectedValue);
 }
 
+void tst_QDBusAbstractInterface::makeAsyncVoidCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusPendingReply<void> r = p->voidMethod();
+    r.waitForFinished();
+    QVERIFY(r.isValid());
+}
+void tst_QDBusAbstractInterface::makeAsyncStringCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusMessage reply = p->call(QDBus::BlockWithGui, QLatin1String("voidMethod"));
+    QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+
+    QDBusPendingReply<QString> r = p->stringMethod();
+    r.waitForFinished();
+    QVERIFY(r.isValid());
+    QCOMPARE(r.value(), targetObj.stringMethod());
+}
+
+void tst_QDBusAbstractInterface::makeAsyncComplexCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusPendingReply<RegisteredType> r = p->complexMethod();
+    r.waitForFinished();
+    QVERIFY(r.isValid());
+    QCOMPARE(r.value(), targetObj.complexMethod());
+}
+
+void tst_QDBusAbstractInterface::makeAsyncMultiOutCallPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QDBusPendingReply<QString, int> r = p->multiOutMethod();
+    r.waitForFinished();
+    QVERIFY(r.isValid());
+
+    int expectedValue;
+    QCOMPARE(r.value(), targetObj.multiOutMethod(expectedValue));
+    QCOMPARE(r.argumentAt<1>(), expectedValue);
+    QCoreApplication::instance()->processEvents();
+}
+
 void tst_QDBusAbstractInterface::stringPropRead()
 {
     Pinger p = getPinger();
@@ -295,6 +523,77 @@ void tst_QDBusAbstractInterface::complexPropWrite()
     QCOMPARE(targetObj.m_complexProp, expectedValue);
 }
 
+void tst_QDBusAbstractInterface::stringPropReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QString expectedValue = "This is a test";
+    QVariant v = p->property("stringProp");
+    QVERIFY(v.isValid());
+    QCOMPARE(v.toString(), expectedValue);
+}
+
+void tst_QDBusAbstractInterface::stringPropWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QString expectedValue = "This is a value";
+    QVERIFY(p->setProperty("stringProp", expectedValue));
+    QCOMPARE(targetObj.m_stringProp, expectedValue);
+}
+
+void tst_QDBusAbstractInterface::variantPropReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QDBusVariant expectedValue = QDBusVariant(QVariant(42));
+    QVariant v = p->property("variantProp");
+    QVERIFY(v.isValid());
+    QDBusVariant value = v.value<QDBusVariant>();
+    QCOMPARE(value.variant().userType(), expectedValue.variant().userType());
+    QCOMPARE(value.variant(), expectedValue.variant());
+}
+
+void tst_QDBusAbstractInterface::variantPropWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
+    QVERIFY(p->setProperty("variantProp", qVariantFromValue(expectedValue)));
+    QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
+}
+
+void tst_QDBusAbstractInterface::complexPropReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    RegisteredType expectedValue = RegisteredType("This is a test");
+    QVariant v = p->property("complexProp");
+    QVERIFY(v.userType() == qMetaTypeId<RegisteredType>());
+    QCOMPARE(v.value<RegisteredType>(), expectedValue);
+}
+
+void tst_QDBusAbstractInterface::complexPropWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    RegisteredType expectedValue = RegisteredType("This is a value");
+    QVERIFY(p->setProperty("complexProp", qVariantFromValue(expectedValue)));
+    QCOMPARE(targetObj.m_complexProp, expectedValue);
+}
+
 void tst_QDBusAbstractInterface::stringPropDirectRead()
 {
     Pinger p = getPinger();
@@ -353,6 +652,70 @@ void tst_QDBusAbstractInterface::complexPropDirectWrite()
     QCOMPARE(targetObj.m_complexProp, expectedValue);
 }
 
+void tst_QDBusAbstractInterface::stringPropDirectReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QString expectedValue = "This is a test";
+    QCOMPARE(p->stringProp(), expectedValue);
+}
+
+void tst_QDBusAbstractInterface::stringPropDirectWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QString expectedValue = "This is a value";
+    p->setStringProp(expectedValue);
+    QCOMPARE(targetObj.m_stringProp, expectedValue);
+}
+
+void tst_QDBusAbstractInterface::variantPropDirectReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QDBusVariant expectedValue = QDBusVariant(42);
+    QCOMPARE(p->variantProp().variant(), expectedValue.variant());
+}
+
+void tst_QDBusAbstractInterface::variantPropDirectWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    QDBusVariant expectedValue = QDBusVariant(Q_INT64_C(-47));
+    p->setVariantProp(expectedValue);
+    QCOMPARE(targetObj.m_variantProp.variant().userType(), expectedValue.variant().userType());
+    QCOMPARE(targetObj.m_variantProp.variant(), expectedValue.variant());
+}
+
+void tst_QDBusAbstractInterface::complexPropDirectReadPeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    RegisteredType expectedValue = RegisteredType("This is a test");
+    QCOMPARE(p->complexProp(), expectedValue);
+}
+
+void tst_QDBusAbstractInterface::complexPropDirectWritePeer()
+{
+    Pinger p = getPingerPeer();
+    QVERIFY2(p, "Not connected to D-Bus");
+    resetServer();
+
+    RegisteredType expectedValue = RegisteredType("This is a value");
+    p->setComplexProp(expectedValue);
+    QCOMPARE(targetObj.m_complexProp, expectedValue);
+}
+
 void tst_QDBusAbstractInterface::getVoidSignal_data()
 {
     QTest::addColumn<QString>("service");
@@ -437,6 +800,89 @@ void tst_QDBusAbstractInterface::getComplexSignal()
     QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
 }
 
+void tst_QDBusAbstractInterface::getVoidSignalPeer_data()
+{
+    QTest::addColumn<QString>("path");
+
+    QTest::newRow("specific") << "/";
+    QTest::newRow("wildcard") << QString();
+}
+
+void tst_QDBusAbstractInterface::getVoidSignalPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we need to connect the signal somewhere in order for D-Bus to enable the rules
+    QTestEventLoop::instance().connect(p.data(), SIGNAL(voidSignal()), SLOT(exitLoop()));
+    QSignalSpy s(p.data(), SIGNAL(voidSignal()));
+
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "voidSignal");
+    QVERIFY(QDBusConnection::sessionBus().send(req));
+    QTestEventLoop::instance().enterLoop(2);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+
+    QVERIFY(s.size() == 1);
+    QVERIFY(s.at(0).size() == 0);
+}
+
+void tst_QDBusAbstractInterface::getStringSignalPeer_data()
+{
+    getVoidSignalPeer_data();
+}
+
+void tst_QDBusAbstractInterface::getStringSignalPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we need to connect the signal somewhere in order for D-Bus to enable the rules
+    QTestEventLoop::instance().connect(p.data(), SIGNAL(stringSignal(QString)), SLOT(exitLoop()));
+    QSignalSpy s(p.data(), SIGNAL(stringSignal(QString)));
+
+    QString expectedValue = "Good morning";
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "stringSignal");
+    req << expectedValue;
+    QVERIFY(QDBusConnection::sessionBus().send(req));
+    QTestEventLoop::instance().enterLoop(2);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+
+    QVERIFY(s.size() == 1);
+    QVERIFY(s[0].size() == 1);
+    QCOMPARE(s[0][0].userType(), int(QVariant::String));
+    QCOMPARE(s[0][0].toString(), expectedValue);
+}
+
+void tst_QDBusAbstractInterface::getComplexSignalPeer_data()
+{
+    getVoidSignalPeer_data();
+}
+
+void tst_QDBusAbstractInterface::getComplexSignalPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we need to connect the signal somewhere in order for D-Bus to enable the rules
+    QTestEventLoop::instance().connect(p.data(), SIGNAL(complexSignal(RegisteredType)), SLOT(exitLoop()));
+    QSignalSpy s(p.data(), SIGNAL(complexSignal(RegisteredType)));
+
+    RegisteredType expectedValue("Good evening");
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "complexSignal");
+    req << "Good evening";
+    QVERIFY(QDBusConnection::sessionBus().send(req));
+    QTestEventLoop::instance().enterLoop(2);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+
+    QVERIFY(s.size() == 1);
+    QVERIFY(s[0].size() == 1);
+    QCOMPARE(s[0][0].userType(), qMetaTypeId<RegisteredType>());
+    QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
+}
+
 void tst_QDBusAbstractInterface::followSignal()
 {
     const QString serviceToFollow = "com.trolltech.tst_qdbusabstractinterface.FollowMe";
@@ -514,6 +960,24 @@ void tst_QDBusAbstractInterface::createErrors()
     QTEST(p->lastError().name(), "errorName");
 }
 
+void tst_QDBusAbstractInterface::createErrorsPeer_data()
+{
+    QTest::addColumn<QString>("path");
+    QTest::addColumn<QString>("errorName");
+
+    QTest::newRow("invalid-path") << "this isn't valid" << "com.trolltech.QtDBus.Error.InvalidObjectPath";
+}
+
+void tst_QDBusAbstractInterface::createErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    QVERIFY(!p->isValid());
+    QTEST(p->lastError().name(), "errorName");
+}
+
 void tst_QDBusAbstractInterface::callErrors_data()
 {
     createErrors_data();
@@ -556,6 +1020,43 @@ void tst_QDBusAbstractInterface::asyncCallErrors()
     QCOMPARE(p->lastError().name(), r.error().name());
 }
 
+void tst_QDBusAbstractInterface::callErrorsPeer_data()
+{
+    createErrorsPeer_data();
+    QTest::newRow("path-wildcard") << QString() << "com.trolltech.QtDBus.Error.InvalidObjectPath";
+}
+
+void tst_QDBusAbstractInterface::callErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to make this call:
+    QDBusReply<QString> r = p->stringMethod();
+    QVERIFY(!r.isValid());
+    QTEST(r.error().name(), "errorName");
+    QCOMPARE(p->lastError().name(), r.error().name());
+}
+
+void tst_QDBusAbstractInterface::asyncCallErrorsPeer_data()
+{
+    callErrorsPeer_data();
+}
+
+void tst_QDBusAbstractInterface::asyncCallErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to make this call:
+    QDBusPendingReply<QString> r = p->stringMethod();
+    QVERIFY(r.isError());
+    QTEST(r.error().name(), "errorName");
+    QCOMPARE(p->lastError().name(), r.error().name());
+}
+
 void tst_QDBusAbstractInterface::propertyReadErrors_data()
 {
     callErrors_data();
@@ -632,5 +1133,77 @@ void tst_QDBusAbstractInterface::directPropertyWriteErrors()
     QTEST(p->lastError().name(), "errorName");
 }
 
+void tst_QDBusAbstractInterface::propertyReadErrorsPeer_data()
+{
+    callErrorsPeer_data();
+}
+
+void tst_QDBusAbstractInterface::propertyReadErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to get this value:
+    QVariant v = p->property("stringProp");
+    QVERIFY(v.isNull());
+    QVERIFY(!v.isValid());
+    QTEST(p->lastError().name(), "errorName");
+}
+
+void tst_QDBusAbstractInterface::propertyWriteErrorsPeer_data()
+{
+    callErrorsPeer_data();
+}
+
+void tst_QDBusAbstractInterface::propertyWriteErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to get this value:
+    if (p->isValid())
+        QCOMPARE(int(p->lastError().type()), int(QDBusError::NoError));
+    QVERIFY(!p->setProperty("stringProp", ""));
+    QTEST(p->lastError().name(), "errorName");
+}
+
+void tst_QDBusAbstractInterface::directPropertyReadErrorsPeer_data()
+{
+    callErrorsPeer_data();
+}
+
+void tst_QDBusAbstractInterface::directPropertyReadErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to get this value:
+    QString v = p->stringProp();
+    QVERIFY(v.isNull());
+    QTEST(p->lastError().name(), "errorName");
+}
+
+void tst_QDBusAbstractInterface::directPropertyWriteErrorsPeer_data()
+{
+    callErrorsPeer_data();
+}
+
+void tst_QDBusAbstractInterface::directPropertyWriteErrorsPeer()
+{
+    QFETCH(QString, path);
+    Pinger p = getPingerPeer(path);
+    QVERIFY2(p, "Not connected to D-Bus");
+
+    // we shouldn't be able to get this value:
+    // but there's no direct way of verifying that the setting failed
+    if (p->isValid())
+        QCOMPARE(int(p->lastError().type()), int(QDBusError::NoError));
+    p->setStringProp("");
+    QTEST(p->lastError().name(), "errorName");
+}
+
 QTEST_MAIN(tst_QDBusAbstractInterface)
 #include "tst_qdbusabstractinterface.moc"
-- 
cgit v0.12


From 6d032e84de8238e555a191b04311ed6a811ddd87 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:17 -0500
Subject: QtDBus: Add unit tests for QDBusInterface

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 tests/auto/qdbusinterface/myobject.h              | 164 ++++++
 tests/auto/qdbusinterface/qdbusinterface.pro      |   7 +-
 tests/auto/qdbusinterface/qmyserver/qmyserver.cpp | 155 ++++++
 tests/auto/qdbusinterface/qmyserver/qmyserver.pro |   5 +
 tests/auto/qdbusinterface/test/test.pro           |   7 +
 tests/auto/qdbusinterface/tst_qdbusinterface.cpp  | 613 ++++++++++++++++++----
 6 files changed, 832 insertions(+), 119 deletions(-)
 create mode 100644 tests/auto/qdbusinterface/myobject.h
 create mode 100644 tests/auto/qdbusinterface/qmyserver/qmyserver.cpp
 create mode 100644 tests/auto/qdbusinterface/qmyserver/qmyserver.pro
 create mode 100644 tests/auto/qdbusinterface/test/test.pro

diff --git a/tests/auto/qdbusinterface/myobject.h b/tests/auto/qdbusinterface/myobject.h
new file mode 100644
index 0000000..68b8d1a
--- /dev/null
+++ b/tests/auto/qdbusinterface/myobject.h
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MYOBJECT_H
+#define MYOBJECT_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+
+Q_DECLARE_METATYPE(QVariantList)
+
+class MyObject: public QObject
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "com.trolltech.QtDBus.MyObject")
+    Q_CLASSINFO("D-Bus Introspection", ""
+"  <interface name=\"com.trolltech.QtDBus.MyObject\" >\n"
+"    <property access=\"readwrite\" type=\"i\" name=\"prop1\" />\n"
+"    <property name=\"complexProp\" type=\"ai\" access=\"readwrite\">\n"
+"      <annotation name=\"com.trolltech.QtDBus.QtTypeName\" value=\"QList&lt;int&gt;\"/>\n"
+"    </property>\n"
+"    <signal name=\"somethingHappened\" >\n"
+"      <arg direction=\"out\" type=\"s\" />\n"
+"    </signal>\n"
+"    <method name=\"ping\" >\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"ping\" />\n"
+"    </method>\n"
+"    <method name=\"ping_invokable\" >\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping_invokable\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"ping_invokable\" />\n"
+"    </method>\n"
+"    <method name=\"ping\" >\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping1\" />\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping2\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"pong1\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"pong2\" />\n"
+"    </method>\n"
+"    <method name=\"ping_invokable\" >\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping1_invokable\" />\n"
+"      <arg direction=\"in\" type=\"v\" name=\"ping2_invokable\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"pong1_invokable\" />\n"
+"      <arg direction=\"out\" type=\"v\" name=\"pong2_invokable\" />\n"
+"    </method>\n"
+"    <method name=\"ping\" >\n"
+"      <arg direction=\"in\" type=\"ai\" name=\"ping\" />\n"
+"      <arg direction=\"out\" type=\"ai\" name=\"ping\" />\n"
+"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
+"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
+"    </method>\n"
+"    <method name=\"ping_invokable\" >\n"
+"      <arg direction=\"in\" type=\"ai\" name=\"ping_invokable\" />\n"
+"      <arg direction=\"out\" type=\"ai\" name=\"ping_invokable\" />\n"
+"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
+"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
+"    </method>\n"
+"  </interface>\n"
+        "")
+    Q_PROPERTY(int prop1 READ prop1 WRITE setProp1)
+    Q_PROPERTY(QList<int> complexProp READ complexProp WRITE setComplexProp)
+
+public:
+    static int callCount;
+    static QVariantList callArgs;
+    MyObject()
+    {
+        QObject *subObject = new QObject(this);
+        subObject->setObjectName("subObject");
+    }
+
+    int m_prop1;
+    int prop1() const
+    {
+        ++callCount;
+        return m_prop1;
+    }
+    void setProp1(int value)
+    {
+        ++callCount;
+        m_prop1 = value;
+    }
+
+    QList<int> m_complexProp;
+    QList<int> complexProp() const
+    {
+        ++callCount;
+        return m_complexProp;
+    }
+    void setComplexProp(const QList<int> &value)
+    {
+        ++callCount;
+        m_complexProp = value;
+    }
+
+    Q_INVOKABLE void ping_invokable(QDBusMessage msg)
+    {
+        QDBusConnection sender = QDBusConnection::sender();
+        if (!sender.isConnected())
+            exit(1);
+
+        ++callCount;
+        callArgs = msg.arguments();
+
+        msg.setDelayedReply(true);
+        if (!sender.send(msg.createReply(callArgs)))
+            exit(1);
+    }
+
+public slots:
+
+    void ping(QDBusMessage msg)
+    {
+        QDBusConnection sender = QDBusConnection::sender();
+        if (!sender.isConnected())
+            exit(1);
+
+        ++callCount;
+        callArgs = msg.arguments();
+
+        msg.setDelayedReply(true);
+        if (!sender.send(msg.createReply(callArgs)))
+            exit(1);
+    }
+};
+
+#endif // INTERFACE_H
diff --git a/tests/auto/qdbusinterface/qdbusinterface.pro b/tests/auto/qdbusinterface/qdbusinterface.pro
index ac14ab7..0aca06c 100644
--- a/tests/auto/qdbusinterface/qdbusinterface.pro
+++ b/tests/auto/qdbusinterface/qdbusinterface.pro
@@ -1,10 +1,11 @@
 load(qttest_p4)
 QT = core
 contains(QT_CONFIG,dbus): {
-	SOURCES += tst_qdbusinterface.cpp
-	QT += dbus
+    TEMPLATE = subdirs
+    CONFIG += ordered
+    SUBDIRS = qmyserver test
 } else {
-	SOURCES += ../qdbusmarshall/dummy.cpp
+    SOURCES += ../qdbusmarshall/dummy.cpp
 }
 
 
diff --git a/tests/auto/qdbusinterface/qmyserver/qmyserver.cpp b/tests/auto/qdbusinterface/qmyserver/qmyserver.cpp
new file mode 100644
index 0000000..c68f7bf
--- /dev/null
+++ b/tests/auto/qdbusinterface/qmyserver/qmyserver.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/QtCore>
+#include <QtDBus/QtDBus>
+
+#include "../myobject.h"
+
+static const char serviceName[] = "com.trolltech.autotests.qmyserver";
+static const char objectPath[] = "/com/trolltech/qmyserver";
+//static const char *interfaceName = serviceName;
+
+int MyObject::callCount = 0;
+QVariantList MyObject::callArgs;
+
+class MyServer : public QDBusServer
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.qmyserver")
+
+public:
+    MyServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
+        : QDBusServer(addr, parent),
+          m_conn("none")
+    {
+        connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
+    }
+
+public slots:
+    QString address() const
+    {
+        return QDBusServer::address();
+    }
+
+    bool isConnected() const
+    {
+        return m_conn.isConnected();
+    }
+
+    void emitSignal(const QString &interface, const QString &name, const QString &arg)
+    {
+        QDBusMessage msg = QDBusMessage::createSignal("/", interface, name);
+        msg << arg;
+        m_conn.send(msg);
+    }
+
+    void reset()
+    {
+        MyObject::callCount = 0;
+        obj.m_complexProp.clear();
+    }
+
+    int callCount()
+    {
+        return MyObject::callCount;
+    }
+
+    QVariantList callArgs()
+    {
+        qDebug() << "callArgs" << MyObject::callArgs.count();
+        return MyObject::callArgs;
+    }
+
+    void setProp1(int val)
+    {
+        obj.m_prop1 = val;
+    }
+
+    int prop1()
+    {
+        return obj.m_prop1;
+    }
+
+    void setComplexProp(QList<int> val)
+    {
+        obj.m_complexProp = val;
+    }
+
+    QList<int> complexProp()
+    {
+        return obj.m_complexProp;
+    }
+
+
+private slots:
+    void handleConnection(const QDBusConnection& con)
+    {
+        m_conn = con;
+        m_conn.registerObject("/", &obj, QDBusConnection::ExportAllProperties
+                       | QDBusConnection::ExportAllSlots
+                       | QDBusConnection::ExportAllInvokables);
+    }
+
+private:
+    QDBusConnection m_conn;
+    MyObject obj;
+};
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication app(argc, argv);
+
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!con.isConnected())
+        exit(1);
+
+    if (!con.registerService(serviceName))
+        exit(2);
+
+    MyServer server;
+    con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
+
+    printf("ready.\n");
+
+    return app.exec();
+}
+
+#include "qmyserver.moc"
\ No newline at end of file
diff --git a/tests/auto/qdbusinterface/qmyserver/qmyserver.pro b/tests/auto/qdbusinterface/qmyserver/qmyserver.pro
new file mode 100644
index 0000000..f4fe02c
--- /dev/null
+++ b/tests/auto/qdbusinterface/qmyserver/qmyserver.pro
@@ -0,0 +1,5 @@
+SOURCES = qmyserver.cpp
+HEADERS = ../myobject.h
+TARGET = qmyserver
+QT += dbus
+QT -= gui
diff --git a/tests/auto/qdbusinterface/test/test.pro b/tests/auto/qdbusinterface/test/test.pro
new file mode 100644
index 0000000..3252188
--- /dev/null
+++ b/tests/auto/qdbusinterface/test/test.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+SOURCES += ../tst_qdbusinterface.cpp
+HEADERS += ../myobject.h
+TARGET = ../tst_qdbusinterface
+
+QT = core
+QT += dbus
diff --git a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
index ce11459..04b3d72 100644
--- a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp
@@ -40,6 +40,7 @@
 ****************************************************************************/
 /* -*- C++ -*-
  */
+
 #include <qcoreapplication.h>
 #include <qmetatype.h>
 #include <QtTest/QtTest>
@@ -47,125 +48,15 @@
 #include <QtDBus/QtDBus>
 
 #include "../qdbusmarshall/common.h"
-
-Q_DECLARE_METATYPE(QVariantList)
+#include "myobject.h"
 
 #define TEST_INTERFACE_NAME "com.trolltech.QtDBus.MyObject"
 #define TEST_SIGNAL_NAME "somethingHappened"
 
-class MyObject: public QObject
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "com.trolltech.QtDBus.MyObject")
-    Q_CLASSINFO("D-Bus Introspection", ""
-"  <interface name=\"com.trolltech.QtDBus.MyObject\" >\n"
-"    <property access=\"readwrite\" type=\"i\" name=\"prop1\" />\n"
-"    <property name=\"complexProp\" type=\"ai\" access=\"readwrite\">\n"
-"      <annotation name=\"com.trolltech.QtDBus.QtTypeName\" value=\"QList&lt;int&gt;\"/>\n"
-"    </property>\n"
-"    <signal name=\"somethingHappened\" >\n"
-"      <arg direction=\"out\" type=\"s\" />\n"
-"    </signal>\n"
-"    <method name=\"ping\" >\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"ping\" />\n"
-"    </method>\n"
-"    <method name=\"ping_invokable\" >\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping_invokable\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"ping_invokable\" />\n"
-"    </method>\n"
-"    <method name=\"ping\" >\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping1\" />\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping2\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"pong1\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"pong2\" />\n"
-"    </method>\n"
-"    <method name=\"ping_invokable\" >\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping1_invokable\" />\n"
-"      <arg direction=\"in\" type=\"v\" name=\"ping2_invokable\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"pong1_invokable\" />\n"
-"      <arg direction=\"out\" type=\"v\" name=\"pong2_invokable\" />\n"
-"    </method>\n"
-"    <method name=\"ping\" >\n"
-"      <arg direction=\"in\" type=\"ai\" name=\"ping\" />\n"
-"      <arg direction=\"out\" type=\"ai\" name=\"ping\" />\n"
-"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
-"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
-"    </method>\n"
-"    <method name=\"ping_invokable\" >\n"
-"      <arg direction=\"in\" type=\"ai\" name=\"ping_invokable\" />\n"
-"      <arg direction=\"out\" type=\"ai\" name=\"ping_invokable\" />\n"
-"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.In0\" value=\"QList&lt;int&gt;\"/>\n"
-"      <annotation name=\"com.trolltech.QtDBus.QtTypeName.Out0\" value=\"QList&lt;int&gt;\"/>\n"
-"    </method>\n"
-"  </interface>\n"
-        "")
-    Q_PROPERTY(int prop1 READ prop1 WRITE setProp1)
-    Q_PROPERTY(QList<int> complexProp READ complexProp WRITE setComplexProp)
-
-public:
-    static int callCount;
-    static QVariantList callArgs;
-    MyObject()
-    {
-        QObject *subObject = new QObject(this);
-        subObject->setObjectName("subObject");
-    }
-
-    int m_prop1;
-    int prop1() const
-    {
-        ++callCount;
-        return m_prop1;
-    }
-    void setProp1(int value)
-    {
-        ++callCount;
-        m_prop1 = value;
-    }
-
-    QList<int> m_complexProp;
-    QList<int> complexProp() const
-    {
-        ++callCount;
-        return m_complexProp;
-    }
-    void setComplexProp(const QList<int> &value)
-    {
-        ++callCount;
-        m_complexProp = value;
-    }
-
-    Q_INVOKABLE void ping_invokable(QDBusMessage msg)
-    {
-        QDBusConnection sender = QDBusConnection::sender();
-        if (!sender.isConnected())
-            exit(1);
-
-        ++callCount;
-        callArgs = msg.arguments();
-
-        msg.setDelayedReply(true);
-        if (!sender.send(msg.createReply(callArgs)))
-            exit(1);
-    }
-
-public slots:
-
-    void ping(QDBusMessage msg)
-    {
-        QDBusConnection sender = QDBusConnection::sender();
-        if (!sender.isConnected())
-            exit(1);
-
-        ++callCount;
-        callArgs = msg.arguments();
+static const char serviceName[] = "com.trolltech.autotests.qmyserver";
+static const char objectPath[] = "/com/trolltech/qmyserver";
+static const char *interfaceName = serviceName;
 
-        msg.setDelayedReply(true);
-        if (!sender.send(msg.createReply(callArgs)))
-            exit(1);
-    }
-};
 int MyObject::callCount = 0;
 QVariantList MyObject::callArgs;
 
@@ -228,10 +119,70 @@ void emitSignal(const QString &interface, const QString &name, const QString &ar
     QTest::qWait(1000);
 }
 
+void emitSignalPeer(const QString &interface, const QString &name, const QString &arg)
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "emitSignal");
+    req << interface;
+    req << name;
+    req << arg;
+    QDBusConnection::sessionBus().send(req);
+
+    QTest::qWait(1000);
+}
+
+int callCountPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "callCount");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return reply.arguments().at(0).toInt();
+}
+
+QVariantList callArgsPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "callArgs");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return qdbus_cast<QVariantList>(reply.arguments().at(0));
+}
+
+void setProp1Peer(int val)
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "setProp1");
+    req << val;
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+}
+
+int prop1Peer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "prop1");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return reply.arguments().at(0).toInt();
+}
+
+void setComplexPropPeer(QList<int> val)
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "setComplexProp");
+    req << qVariantFromValue(val);
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+}
+
+QList<int> complexPropPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "complexProp");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return qdbus_cast<QList<int> >(reply.arguments().at(0));
+}
+
+void resetPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "reset");
+    QDBusConnection::sessionBus().call(req);
+}
+
 class tst_QDBusInterface: public QObject
 {
     Q_OBJECT
     MyObject obj;
+
 public slots:
     void testServiceOwnerChanged(const QString &service)
     {
@@ -241,6 +192,7 @@ public slots:
 
 private slots:
     void initTestCase();
+    void cleanupTestCase();
 
     void notConnected();
     void notValid();
@@ -254,14 +206,63 @@ private slots:
     void invokeMethodWithMultiReturn();
     void invokeMethodWithComplexReturn();
 
+    void introspectPeer();
+    void callMethodPeer();
+    void invokeMethodPeer();
+    void invokeMethodWithReturnPeer();
+    void invokeMethodWithMultiReturnPeer();
+    void invokeMethodWithComplexReturnPeer();
+
     void signal();
+    void signalPeer();
 
     void propertyRead();
     void propertyWrite();
     void complexPropertyRead();
     void complexPropertyWrite();
+
+    void propertyReadPeer();
+    void propertyWritePeer();
+    void complexPropertyReadPeer();
+    void complexPropertyWritePeer();
+private:
+    QProcess proc;
 };
 
+class WaitForQMyServer: public QObject
+{
+    Q_OBJECT
+public:
+    WaitForQMyServer();
+    bool ok();
+public Q_SLOTS:
+    void ownerChange(const QString &name)
+    {
+        if (name == serviceName)
+            loop.quit();
+    }
+
+private:
+    QEventLoop loop;
+};
+
+WaitForQMyServer::WaitForQMyServer()
+{
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!ok()) {
+        connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+                SLOT(ownerChange(QString)));
+        QTimer::singleShot(2000, &loop, SLOT(quit()));
+        loop.exec();
+    }
+}
+
+bool WaitForQMyServer::ok()
+{
+    return QDBusConnection::sessionBus().isConnected() &&
+        QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
+}
+
 void tst_QDBusInterface::initTestCase()
 {
     QDBusConnection con = QDBusConnection::sessionBus();
@@ -271,6 +272,39 @@ void tst_QDBusInterface::initTestCase()
     con.registerObject("/", &obj, QDBusConnection::ExportAllProperties
                        | QDBusConnection::ExportAllSlots
                        | QDBusConnection::ExportAllInvokables);
+
+    // start peer server
+    #ifdef Q_OS_WIN
+    proc.start("qmyserver");
+    #else
+    proc.start("./qmyserver/qmyserver");
+    #endif
+    QVERIFY(proc.waitForStarted());
+
+    WaitForQMyServer w;
+    QVERIFY(w.ok());
+    //QTest::qWait(2000);
+
+    // get peer server address
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
+    QDBusMessage rpl = con.call(req);
+    QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+    QString address = rpl.arguments().at(0).toString();
+
+    // connect to peer server
+    QDBusConnection peercon = QDBusConnection::connectToPeer(address, "peer");
+    QVERIFY(peercon.isConnected());
+
+    QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "isConnected");
+    QDBusMessage rpl2 = con.call(req2);
+    QVERIFY(rpl2.type() == QDBusMessage::ReplyMessage);
+    QVERIFY(rpl2.arguments().at(0).toBool());
+}
+
+void tst_QDBusInterface::cleanupTestCase()
+{
+    proc.close();
+    proc.kill();
 }
 
 void tst_QDBusInterface::notConnected()
@@ -564,7 +598,7 @@ void tst_QDBusInterface::invokeMethodWithComplexReturn()
 
     // verify that we got the reply as expected
     QCOMPARE(retArg, arg);
-    
+
     // make the INVOKABLE call without a return type
     QList<int> arg2 = QList<int>() << 24 << -74;
     QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QList<int>, retArg), Q_ARG(QList<int>, arg2)));
@@ -580,6 +614,250 @@ void tst_QDBusInterface::invokeMethodWithComplexReturn()
     QCOMPARE(retArg, arg2);
 }
 
+void tst_QDBusInterface::introspectPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    const QMetaObject *mo = iface.metaObject();
+
+    QCOMPARE(mo->methodCount() - mo->methodOffset(), 7);
+    QVERIFY(mo->indexOfSignal(TEST_SIGNAL_NAME "(QString)") != -1);
+
+    QCOMPARE(mo->propertyCount() - mo->propertyOffset(), 2);
+    QVERIFY(mo->indexOfProperty("prop1") != -1);
+    QVERIFY(mo->indexOfProperty("complexProp") != -1);
+}
+
+void tst_QDBusInterface::callMethodPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+
+    // call a SLOT method
+    QDBusMessage reply = iface.call("ping", qVariantFromValue(QDBusVariant("foo")));
+    QCOMPARE(callCountPeer(), 1);
+    QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
+
+    // verify what the callee received
+    QVariantList callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    QVariant v = callArgs.at(0);
+    QDBusVariant dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("foo"));
+
+    // verify reply
+    QCOMPARE(reply.arguments().count(), 1);
+    v = reply.arguments().at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("foo"));
+
+    // call an INVOKABLE method
+    reply = iface.call("ping_invokable", qVariantFromValue(QDBusVariant("bar")));
+    QCOMPARE(callCountPeer(), 2);
+    QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
+
+    // verify what the callee received
+    callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    v = callArgs.at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("bar"));
+
+    // verify reply
+    QCOMPARE(reply.arguments().count(), 1);
+    v = reply.arguments().at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("bar"));
+}
+
+void tst_QDBusInterface::invokeMethodPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+
+    // make the SLOT call without a return type
+    QDBusVariant arg("foo");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_ARG(QDBusVariant, arg)));
+    QCOMPARE(callCountPeer(), 1);
+
+    // verify what the callee received
+    QVariantList callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    QVariant v = callArgs.at(0);
+    QDBusVariant dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("foo"));
+
+    // make the INVOKABLE call without a return type
+    QDBusVariant arg2("bar");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable", Q_ARG(QDBusVariant, arg2)));
+    QCOMPARE(callCountPeer(), 2);
+
+    // verify what the callee received
+    callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    v = callArgs.at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), QString("bar"));
+}
+
+void tst_QDBusInterface::invokeMethodWithReturnPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    QDBusVariant retArg;
+
+    // make the SLOT call without a return type
+    QDBusVariant arg("foo");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QDBusVariant, retArg), Q_ARG(QDBusVariant, arg)));
+    QCOMPARE(callCountPeer(), 1);
+
+    // verify what the callee received
+    QVariantList callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    QVariant v = callArgs.at(0);
+    QDBusVariant dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg.variant().toString());
+
+    // verify that we got the reply as expected
+    QCOMPARE(retArg.variant(), arg.variant());
+
+    // make the INVOKABLE call without a return type
+    QDBusVariant arg2("bar");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable", Q_RETURN_ARG(QDBusVariant, retArg), Q_ARG(QDBusVariant, arg2)));
+    QCOMPARE(callCountPeer(), 2);
+
+    // verify what the callee received
+    callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    v = callArgs.at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg2.variant().toString());
+
+    // verify that we got the reply as expected
+    QCOMPARE(retArg.variant(), arg2.variant());
+}
+
+void tst_QDBusInterface::invokeMethodWithMultiReturnPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    QDBusVariant retArg, retArg2;
+
+    // make the SLOT call without a return type
+    QDBusVariant arg("foo"), arg2("bar");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping",
+                                      Q_RETURN_ARG(QDBusVariant, retArg),
+                                      Q_ARG(QDBusVariant, arg),
+                                      Q_ARG(QDBusVariant, arg2),
+                                      Q_ARG(QDBusVariant&, retArg2)));
+    QCOMPARE(callCountPeer(), 1);
+
+    // verify what the callee received
+    QVariantList callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 2);
+    QVariant v = callArgs.at(0);
+    QDBusVariant dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg.variant().toString());
+
+    v = callArgs.at(1);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg2.variant().toString());
+
+    // verify that we got the replies as expected
+    QCOMPARE(retArg.variant(), arg.variant());
+    QCOMPARE(retArg2.variant(), arg2.variant());
+
+    // make the INVOKABLE call without a return type
+    QDBusVariant arg3("hello"), arg4("world");
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping_invokable",
+                                      Q_RETURN_ARG(QDBusVariant, retArg),
+                                      Q_ARG(QDBusVariant, arg3),
+                                      Q_ARG(QDBusVariant, arg4),
+                                      Q_ARG(QDBusVariant&, retArg2)));
+    QCOMPARE(callCountPeer(), 2);
+
+    // verify what the callee received
+    callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 2);
+    v = callArgs.at(0);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg3.variant().toString());
+
+    v = callArgs.at(1);
+    dv = qdbus_cast<QDBusVariant>(v);
+    QCOMPARE(dv.variant().type(), QVariant::String);
+    QCOMPARE(dv.variant().toString(), arg4.variant().toString());
+
+    // verify that we got the replies as expected
+    QCOMPARE(retArg.variant(), arg3.variant());
+    QCOMPARE(retArg2.variant(), arg4.variant());
+}
+
+void tst_QDBusInterface::invokeMethodWithComplexReturnPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    QList<int> retArg;
+
+    // make the SLOT call without a return type
+    QList<int> arg = QList<int>() << 42 << -47;
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QList<int>, retArg), Q_ARG(QList<int>, arg)));
+    QCOMPARE(callCountPeer(), 1);
+
+    // verify what the callee received
+    QVariantList callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    QVariant v = callArgs.at(0);
+    QCOMPARE(v.userType(), qMetaTypeId<QDBusArgument>());
+    QCOMPARE(qdbus_cast<QList<int> >(v), arg);
+
+    // verify that we got the reply as expected
+    QCOMPARE(retArg, arg);
+
+    // make the INVOKABLE call without a return type
+    QList<int> arg2 = QList<int>() << 24 << -74;
+    QVERIFY(QMetaObject::invokeMethod(&iface, "ping", Q_RETURN_ARG(QList<int>, retArg), Q_ARG(QList<int>, arg2)));
+    QCOMPARE(callCountPeer(), 2);
+
+    // verify what the callee received
+    callArgs = callArgsPeer();
+    QCOMPARE(callArgs.count(), 1);
+    v = callArgs.at(0);
+    QCOMPARE(v.userType(), qMetaTypeId<QDBusArgument>());
+    QCOMPARE(qdbus_cast<QList<int> >(v), arg2);
+
+    // verify that we got the reply as expected
+    QCOMPARE(retArg, arg2);
+}
+
 void tst_QDBusInterface::signal()
 {
     QDBusConnection con = QDBusConnection::sessionBus();
@@ -621,6 +899,47 @@ void tst_QDBusInterface::signal()
     }
 }
 
+void tst_QDBusInterface::signalPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    QString arg = "So long and thanks for all the fish";
+    {
+        Spy spy;
+        spy.connect(&iface, SIGNAL(somethingHappened(QString)), SLOT(spySlot(QString)));
+
+        emitSignalPeer(TEST_INTERFACE_NAME, TEST_SIGNAL_NAME, arg);
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.received, arg);
+    }
+
+    QDBusInterface iface2(QString(), QLatin1String("/"),
+                          TEST_INTERFACE_NAME, con);
+    {
+        Spy spy;
+        spy.connect(&iface, SIGNAL(somethingHappened(QString)), SLOT(spySlot(QString)));
+        spy.connect(&iface2, SIGNAL(somethingHappened(QString)), SLOT(spySlot(QString)));
+
+        emitSignalPeer(TEST_INTERFACE_NAME, TEST_SIGNAL_NAME, arg);
+        QCOMPARE(spy.count, 2);
+        QCOMPARE(spy.received, arg);
+    }
+
+    {
+        Spy spy, spy2;
+        spy.connect(&iface, SIGNAL(somethingHappened(QString)), SLOT(spySlot(QString)));
+        spy2.connect(&iface2, SIGNAL(somethingHappened(QString)), SLOT(spySlot(QString)));
+
+        emitSignalPeer(TEST_INTERFACE_NAME, TEST_SIGNAL_NAME, arg);
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.received, arg);
+        QCOMPARE(spy2.count, 1);
+        QCOMPARE(spy2.received, arg);
+    }
+}
+
 void tst_QDBusInterface::propertyRead()
 {
     QDBusConnection con = QDBusConnection::sessionBus();
@@ -683,7 +1002,69 @@ void tst_QDBusInterface::complexPropertyWrite()
     QCOMPARE(obj.m_complexProp, arg);
 }
 
+void tst_QDBusInterface::propertyReadPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    int arg = 42;
+    setProp1Peer(42);
+
+    QVariant v = iface.property("prop1");
+    QVERIFY(v.isValid());
+    QCOMPARE(v.userType(), int(QVariant::Int));
+    QCOMPARE(v.toInt(), arg);
+    QCOMPARE(callCountPeer(), 1);
+}
+
+void tst_QDBusInterface::propertyWritePeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    int arg = 42;
+    setProp1Peer(0);
+
+    QVERIFY(iface.setProperty("prop1", arg));
+    QCOMPARE(callCountPeer(), 1);
+    QCOMPARE(prop1Peer(), arg);
+}
+
+void tst_QDBusInterface::complexPropertyReadPeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    QList<int> arg = QList<int>() << 42 << -47;
+    setComplexPropPeer(arg);
+
+    QVariant v = iface.property("complexProp");
+    QVERIFY(v.isValid());
+    QCOMPARE(v.userType(), qMetaTypeId<QList<int> >());
+    QCOMPARE(v.value<QList<int> >(), arg);
+    QCOMPARE(callCountPeer(), 1);
+}
+
+void tst_QDBusInterface::complexPropertyWritePeer()
+{
+    QDBusConnection con("peer");
+    QDBusInterface iface(QString(), QLatin1String("/"),
+                         TEST_INTERFACE_NAME, con);
+
+    resetPeer();
+    QList<int> arg = QList<int>() << -47 << 42;
+
+    QVERIFY(iface.setProperty("complexProp", qVariantFromValue(arg)));
+    QCOMPARE(callCountPeer(), 1);
+    QCOMPARE(complexPropPeer(), arg);
+}
+
 QTEST_MAIN(tst_QDBusInterface)
 
 #include "tst_qdbusinterface.moc"
-
-- 
cgit v0.12


From 4c8c5ef3866723124fe8cf2c8bdd3b846549b129 Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@gmail.com>
Date: Mon, 18 Apr 2011 11:21:18 -0500
Subject: QtDBus: Add unit tests for QDBusAbstractAdaptor

Merge-request: 2343
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 tests/auto/qdbusabstractadaptor/myobject.h         |  286 +++++
 .../qdbusabstractadaptor/qdbusabstractadaptor.pro  |    9 +-
 .../qdbusabstractadaptor/qmyserver/qmyserver.cpp   |  167 +++
 .../qdbusabstractadaptor/qmyserver/qmyserver.pro   |    5 +
 tests/auto/qdbusabstractadaptor/test/test.pro      |    7 +
 .../tst_qdbusabstractadaptor.cpp                   | 1091 ++++++++++++++------
 6 files changed, 1240 insertions(+), 325 deletions(-)
 create mode 100644 tests/auto/qdbusabstractadaptor/myobject.h
 create mode 100644 tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.cpp
 create mode 100644 tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.pro
 create mode 100644 tests/auto/qdbusabstractadaptor/test/test.pro

diff --git a/tests/auto/qdbusabstractadaptor/myobject.h b/tests/auto/qdbusabstractadaptor/myobject.h
new file mode 100644
index 0000000..7353fa6
--- /dev/null
+++ b/tests/auto/qdbusabstractadaptor/myobject.h
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MYOBJECT_H
+#define MYOBJECT_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+
+extern const char *slotSpy;
+extern QString valueSpy;
+
+class QDBusSignalSpy: public QObject
+{
+    Q_OBJECT
+
+public slots:
+    void slot(const QDBusMessage &msg)
+    {
+        ++count;
+        interface = msg.interface();
+        name = msg.member();
+        signature = msg.signature();
+        path = msg.path();
+        value.clear();
+        if (msg.arguments().count())
+            value = msg.arguments().at(0);
+    }
+
+public:
+    QDBusSignalSpy() : count(0) { }
+
+    int count;
+    QString interface;
+    QString name;
+    QString signature;
+    QString path;
+    QVariant value;
+};
+
+class Interface1: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "local.Interface1")
+public:
+    Interface1(QObject *parent) : QDBusAbstractAdaptor(parent)
+    { }
+};
+
+class Interface2: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "local.Interface2")
+    Q_PROPERTY(QString prop1 READ prop1)
+    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2 SCRIPTABLE true)
+    Q_PROPERTY(QUrl nonDBusProperty READ nonDBusProperty)
+public:
+    Interface2(QObject *parent) : QDBusAbstractAdaptor(parent)
+    { setAutoRelaySignals(true); }
+
+    QString prop1() const
+    { return QLatin1String("QString Interface2::prop1() const"); }
+
+    QString prop2() const
+    { return QLatin1String("QString Interface2::prop2() const"); }
+
+    void setProp2(const QString &value)
+    {
+        slotSpy = "void Interface2::setProp2(const QString &)";
+        valueSpy = value;
+    }
+
+    QUrl nonDBusProperty() const
+    { return QUrl(); }
+
+    void emitSignal(const QString &, const QVariant &)
+    { emit signal(); }
+
+public slots:
+    void method()
+    {
+        slotSpy = "void Interface2::method()";
+    }
+
+    Q_SCRIPTABLE void scriptableMethod()
+    {
+        slotSpy = "void Interface2::scriptableMethod()";
+    }
+
+signals:
+    void signal();
+};
+
+class Interface3: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "local.Interface3")
+    Q_PROPERTY(QString prop1 READ prop1)
+    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2)
+    Q_PROPERTY(QString interface3prop READ interface3prop)
+public:
+    Interface3(QObject *parent) : QDBusAbstractAdaptor(parent)
+    { setAutoRelaySignals(true); }
+
+    QString prop1() const
+    { return QLatin1String("QString Interface3::prop1() const"); }
+
+    QString prop2() const
+    { return QLatin1String("QString Interface3::prop2() const"); }
+
+    void setProp2(const QString &value)
+    {
+        slotSpy = "void Interface3::setProp2(const QString &)";
+        valueSpy = value;
+    }
+
+    QString interface3prop() const
+    { return QLatin1String("QString Interface3::interface3prop() const"); }
+
+    void emitSignal(const QString &name, const QVariant &value)
+    {
+        if (name == "signalVoid")
+            emit signalVoid();
+        else if (name == "signalInt")
+            emit signalInt(value.toInt());
+        else if (name == "signalString")
+            emit signalString(value.toString());
+    }
+
+public slots:
+    void methodVoid() { slotSpy = "void Interface3::methodVoid()"; }
+    void methodInt(int) { slotSpy = "void Interface3::methodInt(int)"; }
+    void methodString(QString) { slotSpy = "void Interface3::methodString(QString)"; }
+
+    int methodStringString(const QString &s, QString &out)
+    {
+        slotSpy = "int Interface3::methodStringString(const QString &, QString &)";
+        out = s;
+        return 42;
+    }
+
+signals:
+    void signalVoid();
+    void signalInt(int);
+    void signalString(const QString &);
+};
+
+class Interface4: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "local.Interface4")
+    Q_PROPERTY(QString prop1 READ prop1)
+    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2)
+    Q_PROPERTY(QString interface4prop READ interface4prop)
+public:
+    Interface4(QObject *parent) : QDBusAbstractAdaptor(parent)
+    { setAutoRelaySignals(true); }
+
+    QString prop1() const
+    { return QLatin1String("QString Interface4::prop1() const"); }
+
+    QString prop2() const
+    { return QLatin1String("QString Interface4::prop2() const"); }
+
+    QString interface4prop() const
+    { return QLatin1String("QString Interface4::interface4prop() const"); }
+
+    void setProp2(const QString &value)
+    {
+        slotSpy = "void Interface4::setProp2(const QString &)";
+        valueSpy = value;
+    }
+
+    void emitSignal(const QString &, const QVariant &value)
+    {
+        switch (value.type())
+        {
+        case QVariant::Invalid:
+            emit signal();
+            break;
+        case QVariant::Int:
+            emit signal(value.toInt());
+            break;
+        case QVariant::String:
+            emit signal(value.toString());
+            break;
+        default:
+            break;
+        }
+    }
+
+public slots:
+    void method() { slotSpy = "void Interface4::method()"; }
+    void method(int) { slotSpy = "void Interface4::method(int)"; }
+    void method(QString) { slotSpy = "void Interface4::method(QString)"; }
+
+signals:
+    void signal();
+    void signal(int);
+    void signal(const QString &);
+};
+
+class MyObject: public QObject
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "local.MyObject")
+public:
+    Interface1 *if1;
+    Interface2 *if2;
+    Interface3 *if3;
+    Interface4 *if4;
+
+    MyObject(int n = 4)
+        : if1(0), if2(0), if3(0), if4(0)
+    {
+        switch (n)
+        {
+        case 4:
+            if4 = new Interface4(this);
+        case 3:
+            if3 = new Interface3(this);
+        case 2:
+            if2 = new Interface2(this);
+        case 1:
+            if1 = new Interface1(this);
+        }
+    }
+
+    void emitSignal(const QString &name, const QVariant &value)
+    {
+        if (name == "scriptableSignalVoid")
+            emit scriptableSignalVoid();
+        else if (name == "scriptableSignalInt")
+            emit scriptableSignalInt(value.toInt());
+        else if (name == "scriptableSignalString")
+            emit scriptableSignalString(value.toString());
+        else if (name == "nonScriptableSignalVoid")
+            emit nonScriptableSignalVoid();
+    }
+
+signals:
+    Q_SCRIPTABLE void scriptableSignalVoid();
+    Q_SCRIPTABLE void scriptableSignalInt(int);
+    Q_SCRIPTABLE void scriptableSignalString(QString);
+    void nonScriptableSignalVoid();
+};
+
+#endif // MYOBJECT_H
\ No newline at end of file
diff --git a/tests/auto/qdbusabstractadaptor/qdbusabstractadaptor.pro b/tests/auto/qdbusabstractadaptor/qdbusabstractadaptor.pro
index 16358c5..c3e3f7f 100644
--- a/tests/auto/qdbusabstractadaptor/qdbusabstractadaptor.pro
+++ b/tests/auto/qdbusabstractadaptor/qdbusabstractadaptor.pro
@@ -1,10 +1,9 @@
 load(qttest_p4)
 QT = core
 contains(QT_CONFIG,dbus): {
-	SOURCES += tst_qdbusabstractadaptor.cpp
-	QT += dbus
+    TEMPLATE = subdirs
+    CONFIG += ordered
+    SUBDIRS = qmyserver test
 } else {
-	SOURCES += ../qdbusmarshall/dummy.cpp
+    SOURCES += ../qdbusmarshall/dummy.cpp
 }
-
-
diff --git a/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.cpp b/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.cpp
new file mode 100644
index 0000000..238bc38
--- /dev/null
+++ b/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.cpp
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/QtCore>
+#include <QtDBus/QtDBus>
+
+#include "../myobject.h"
+
+static const char serviceName[] = "com.trolltech.autotests.qmyserver";
+static const char objectPath[] = "/com/trolltech/qmyserver";
+//static const char *interfaceName = serviceName;
+
+const char *slotSpy;
+QString valueSpy;
+
+Q_DECLARE_METATYPE(QDBusConnection::RegisterOptions)
+
+class MyServer : public QDBusServer
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "com.trolltech.autotests.qmyserver")
+
+public:
+    MyServer(QString addr = "unix:tmpdir=/tmp", QObject* parent = 0)
+        : QDBusServer(addr, parent),
+          m_conn("none"),
+          obj(NULL)
+    {
+        connect(this, SIGNAL(newConnection(const QDBusConnection&)), SLOT(handleConnection(const QDBusConnection&)));
+    }
+
+    ~MyServer()
+    {
+        if (obj)
+            obj->deleteLater();
+    }
+
+public slots:
+    QString address() const
+    {
+        return QDBusServer::address();
+    }
+
+    bool isConnected() const
+    {
+        return m_conn.isConnected();
+    }
+
+    void emitSignal(const QString& interface, const QString& name, const QDBusVariant& parameter)
+    {
+        if (interface.endsWith('2'))
+            obj->if2->emitSignal(name, parameter.variant());
+        else if (interface.endsWith('3'))
+            obj->if3->emitSignal(name, parameter.variant());
+        else if (interface.endsWith('4'))
+            obj->if4->emitSignal(name, parameter.variant());
+        else
+            obj->emitSignal(name, parameter.variant());
+    }
+
+    void emitSignal2(const QString& interface, const QString& name)
+    {
+        if (interface.endsWith('2'))
+            obj->if2->emitSignal(name, QVariant());
+        else if (interface.endsWith('3'))
+            obj->if3->emitSignal(name, QVariant());
+        else if (interface.endsWith('4'))
+            obj->if4->emitSignal(name, QVariant());
+        else
+            obj->emitSignal(name, QVariant());
+    }
+
+    void newMyObject(int nInterfaces = 4)
+    {
+        if (obj)
+            obj->deleteLater();
+        obj = new MyObject(nInterfaces);
+    }
+
+    void registerMyObject(const QString & path, int options)
+    {
+        m_conn.registerObject(path, obj, (QDBusConnection::RegisterOptions)options);
+    }
+
+    QString slotSpyServer()
+    {
+        return QLatin1String(slotSpy);
+    }
+
+    QString valueSpyServer()
+    {
+        return valueSpy;
+    }
+
+    void clearValueSpy()
+    {
+        valueSpy.clear();
+    }
+
+private slots:
+    void handleConnection(const QDBusConnection& con)
+    {
+        m_conn = con;
+    }
+
+private:
+    QDBusConnection m_conn;
+    MyObject* obj;
+};
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication app(argc, argv);
+
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!con.isConnected())
+        exit(1);
+
+    if (!con.registerService(serviceName))
+        exit(2);
+
+    MyServer server;
+    con.registerObject(objectPath, &server, QDBusConnection::ExportAllSlots);
+
+    printf("ready.\n");
+
+    return app.exec();
+}
+
+#include "qmyserver.moc"
\ No newline at end of file
diff --git a/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.pro b/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.pro
new file mode 100644
index 0000000..f4fe02c
--- /dev/null
+++ b/tests/auto/qdbusabstractadaptor/qmyserver/qmyserver.pro
@@ -0,0 +1,5 @@
+SOURCES = qmyserver.cpp
+HEADERS = ../myobject.h
+TARGET = qmyserver
+QT += dbus
+QT -= gui
diff --git a/tests/auto/qdbusabstractadaptor/test/test.pro b/tests/auto/qdbusabstractadaptor/test/test.pro
new file mode 100644
index 0000000..014a9e8
--- /dev/null
+++ b/tests/auto/qdbusabstractadaptor/test/test.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+SOURCES += ../tst_qdbusabstractadaptor.cpp
+HEADERS += ../myobject.h
+TARGET = ../tst_qdbusabstractadaptor
+
+QT = core
+QT += dbus
diff --git a/tests/auto/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp b/tests/auto/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
index a64b3d2..9250350 100644
--- a/tests/auto/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
+++ b/tests/auto/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
@@ -46,6 +46,11 @@
 #include <QtDBus>
 
 #include "../qdbusmarshall/common.h"
+#include "myobject.h"
+
+static const char serviceName[] = "com.trolltech.autotests.qmyserver";
+static const char objectPath[] = "/com/trolltech/qmyserver";
+static const char *interfaceName = serviceName;
 
 const char *slotSpy;
 QString valueSpy;
@@ -73,273 +78,6 @@ namespace QTest {
 }
 QT_END_NAMESPACE
 
-class tst_QDBusAbstractAdaptor: public QObject
-{
-    Q_OBJECT
-
-private slots:
-    void initTestCase() { commonInit(); }
-    void methodCalls_data();
-    void methodCalls();
-    void methodCallScriptable();
-    void signalEmissions_data();
-    void signalEmissions();
-    void sameSignalDifferentPaths();
-    void sameObjectDifferentPaths();
-    void scriptableSignalOrNot();
-    void overloadedSignalEmission_data();
-    void overloadedSignalEmission();
-    void readProperties();
-    void readPropertiesInvalidInterface();
-    void readPropertiesEmptyInterface_data();
-    void readPropertiesEmptyInterface();
-    void readAllProperties();
-    void readAllPropertiesInvalidInterface();
-    void readAllPropertiesEmptyInterface_data();
-    void readAllPropertiesEmptyInterface();
-    void writeProperties();
-
-    void typeMatching_data();
-    void typeMatching();
-
-    void methodWithMoreThanOneReturnValue();
-};
-
-class QDBusSignalSpy: public QObject
-{
-    Q_OBJECT
-
-public slots:
-    void slot(const QDBusMessage &msg)
-    {
-        ++count;
-        interface = msg.interface();
-        name = msg.member();
-        signature = msg.signature();
-        path = msg.path();
-        value.clear();
-        if (msg.arguments().count())
-            value = msg.arguments().at(0);
-    }
-
-public:
-    QDBusSignalSpy() : count(0) { }
-
-    int count;
-    QString interface;
-    QString name;
-    QString signature;
-    QString path;
-    QVariant value;
-};
-
-class Interface1: public QDBusAbstractAdaptor
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "local.Interface1")
-public:
-    Interface1(QObject *parent) : QDBusAbstractAdaptor(parent)
-    { }
-};
-
-class Interface2: public QDBusAbstractAdaptor
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "local.Interface2")
-    Q_PROPERTY(QString prop1 READ prop1)
-    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2 SCRIPTABLE true)
-    Q_PROPERTY(QUrl nonDBusProperty READ nonDBusProperty)
-public:
-    Interface2(QObject *parent) : QDBusAbstractAdaptor(parent)
-    { setAutoRelaySignals(true); }
-
-    QString prop1() const
-    { return QLatin1String("QString Interface2::prop1() const"); }
-
-    QString prop2() const
-    { return QLatin1String("QString Interface2::prop2() const"); }
-
-    void setProp2(const QString &value)
-    {
-        slotSpy = "void Interface2::setProp2(const QString &)";
-        valueSpy = value;
-    }
-
-    QUrl nonDBusProperty() const
-    { return QUrl(); }
-
-    void emitSignal(const QString &, const QVariant &)
-    { emit signal(); }
-
-public slots:
-    void method()
-    {
-        slotSpy = "void Interface2::method()";
-    }
-
-    Q_SCRIPTABLE void scriptableMethod()
-    {
-        slotSpy = "void Interface2::scriptableMethod()";
-    }
-
-signals:
-    void signal();
-};
-
-class Interface3: public QDBusAbstractAdaptor
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "local.Interface3")
-    Q_PROPERTY(QString prop1 READ prop1)
-    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2)
-    Q_PROPERTY(QString interface3prop READ interface3prop)
-public:
-    Interface3(QObject *parent) : QDBusAbstractAdaptor(parent)
-    { setAutoRelaySignals(true); }
-
-    QString prop1() const
-    { return QLatin1String("QString Interface3::prop1() const"); }
-
-    QString prop2() const
-    { return QLatin1String("QString Interface3::prop2() const"); }
-
-    void setProp2(const QString &value)
-    {
-        slotSpy = "void Interface3::setProp2(const QString &)";
-        valueSpy = value;
-    }
-
-    QString interface3prop() const
-    { return QLatin1String("QString Interface3::interface3prop() const"); }
-
-    void emitSignal(const QString &name, const QVariant &value)
-    {
-        if (name == "signalVoid")
-            emit signalVoid();
-        else if (name == "signalInt")
-            emit signalInt(value.toInt());
-        else if (name == "signalString")
-            emit signalString(value.toString());
-    }
-
-public slots:
-    void methodVoid() { slotSpy = "void Interface3::methodVoid()"; }
-    void methodInt(int) { slotSpy = "void Interface3::methodInt(int)"; }
-    void methodString(QString) { slotSpy = "void Interface3::methodString(QString)"; }
-
-    int methodStringString(const QString &s, QString &out)
-    {
-        slotSpy = "int Interface3::methodStringString(const QString &, QString &)";
-        out = s;
-        return 42;
-    }
-
-signals:
-    void signalVoid();
-    void signalInt(int);
-    void signalString(const QString &);
-};
-
-class Interface4: public QDBusAbstractAdaptor
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "local.Interface4")
-    Q_PROPERTY(QString prop1 READ prop1)
-    Q_PROPERTY(QString prop2 READ prop2 WRITE setProp2)
-    Q_PROPERTY(QString interface4prop READ interface4prop)
-public:
-    Interface4(QObject *parent) : QDBusAbstractAdaptor(parent)
-    { setAutoRelaySignals(true); }
-
-    QString prop1() const
-    { return QLatin1String("QString Interface4::prop1() const"); }
-
-    QString prop2() const
-    { return QLatin1String("QString Interface4::prop2() const"); }
-
-    QString interface4prop() const
-    { return QLatin1String("QString Interface4::interface4prop() const"); }
-
-    void setProp2(const QString &value)
-    {
-        slotSpy = "void Interface4::setProp2(const QString &)";
-        valueSpy = value;
-    }
-
-    void emitSignal(const QString &, const QVariant &value)
-    {
-        switch (value.type())
-        {
-        case QVariant::Invalid:
-            emit signal();
-            break;
-        case QVariant::Int:
-            emit signal(value.toInt());
-            break;
-        case QVariant::String:
-            emit signal(value.toString());
-            break;
-        default:
-            break;
-        }
-    }
-
-public slots:
-    void method() { slotSpy = "void Interface4::method()"; }
-    void method(int) { slotSpy = "void Interface4::method(int)"; }
-    void method(QString) { slotSpy = "void Interface4::method(QString)"; }
-
-signals:
-    void signal();
-    void signal(int);
-    void signal(const QString &);
-};
-
-class MyObject: public QObject
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "local.MyObject")
-public:
-    Interface1 *if1;
-    Interface2 *if2;
-    Interface3 *if3;
-    Interface4 *if4;
-
-    MyObject(int n = 4)
-        : if1(0), if2(0), if3(0), if4(0)
-    {
-        switch (n)
-        {
-        case 4:
-            if4 = new Interface4(this);
-        case 3:
-            if3 = new Interface3(this);
-        case 2:
-            if2 = new Interface2(this);
-        case 1:
-            if1 = new Interface1(this);
-        }
-    }
-
-    void emitSignal(const QString &name, const QVariant &value)
-    {
-        if (name == "scriptableSignalVoid")
-            emit scriptableSignalVoid();
-        else if (name == "scriptableSignalInt")
-            emit scriptableSignalInt(value.toInt());
-        else if (name == "scriptableSignalString")
-            emit scriptableSignalString(value.toString());
-        else if (name == "nonScriptableSignalVoid")
-            emit nonScriptableSignalVoid();
-    }
-
-signals:
-    Q_SCRIPTABLE void scriptableSignalVoid();
-    Q_SCRIPTABLE void scriptableSignalInt(int);
-    Q_SCRIPTABLE void scriptableSignalString(QString);
-    void nonScriptableSignalVoid();
-};
-
 class TypesInterface: public QDBusAbstractAdaptor
 {
     Q_OBJECT
@@ -593,6 +331,191 @@ public slots:
     }
 };
 
+void newMyObjectPeer(int nInterfaces = 4)
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "newMyObject");
+    req << nInterfaces;
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+}
+
+void registerMyObjectPeer(const QString & path, QDBusConnection::RegisterOptions options = QDBusConnection::ExportAdaptors)
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "registerMyObject");
+    req << path;
+    req << (int)options;
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+}
+
+void emitSignalPeer(const QString &interface, const QString &name, const QVariant &parameter)
+{
+    if (parameter.isValid())
+    {
+        QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "emitSignal");
+        req << interface;
+        req << name;
+        req << QVariant::fromValue(QDBusVariant(parameter));
+        QDBusConnection::sessionBus().send(req);
+    }
+    else
+    {
+        QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "emitSignal2");
+        req << interface;
+        req << name;
+        QDBusConnection::sessionBus().send(req);
+    }
+
+    QTest::qWait(1000);
+}
+
+const char* slotSpyPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "slotSpyServer");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return reply.arguments().at(0).toString().toLatin1().data();
+}
+
+QString valueSpyPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "valueSpyServer");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+    return reply.arguments().at(0).toString();
+}
+
+void clearValueSpyPeer()
+{
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "clearValueSpy");
+    QDBusMessage reply = QDBusConnection::sessionBus().call(req);
+}
+
+class tst_QDBusAbstractAdaptor: public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+
+    void methodCalls_data();
+    void methodCalls();
+    void methodCallScriptable();
+    void signalEmissions_data();
+    void signalEmissions();
+    void sameSignalDifferentPaths();
+    void sameObjectDifferentPaths();
+    void scriptableSignalOrNot();
+    void overloadedSignalEmission_data();
+    void overloadedSignalEmission();
+    void readProperties();
+    void readPropertiesInvalidInterface();
+    void readPropertiesEmptyInterface_data();
+    void readPropertiesEmptyInterface();
+    void readAllProperties();
+    void readAllPropertiesInvalidInterface();
+    void readAllPropertiesEmptyInterface_data();
+    void readAllPropertiesEmptyInterface();
+    void writeProperties();
+
+    void methodCallsPeer_data();
+    void methodCallsPeer();
+    void methodCallScriptablePeer();
+    void signalEmissionsPeer_data();
+    void signalEmissionsPeer();
+    void sameSignalDifferentPathsPeer();
+    void sameObjectDifferentPathsPeer();
+    void scriptableSignalOrNotPeer();
+    void overloadedSignalEmissionPeer_data();
+    void overloadedSignalEmissionPeer();
+    void readPropertiesPeer();
+    void readPropertiesInvalidInterfacePeer();
+    void readPropertiesEmptyInterfacePeer_data();
+    void readPropertiesEmptyInterfacePeer();
+    void readAllPropertiesPeer();
+    void readAllPropertiesInvalidInterfacePeer();
+    void readAllPropertiesEmptyInterfacePeer_data();
+    void readAllPropertiesEmptyInterfacePeer();
+    void writePropertiesPeer();
+
+    void typeMatching_data();
+    void typeMatching();
+
+    void methodWithMoreThanOneReturnValue();
+    void methodWithMoreThanOneReturnValuePeer();
+private:
+    QProcess proc;
+};
+
+class WaitForQMyServer: public QObject
+{
+    Q_OBJECT
+public:
+    WaitForQMyServer();
+    bool ok();
+public Q_SLOTS:
+    void ownerChange(const QString &name)
+    {
+        if (name == serviceName)
+            loop.quit();
+    }
+
+private:
+    QEventLoop loop;
+};
+
+WaitForQMyServer::WaitForQMyServer()
+{
+    QDBusConnection con = QDBusConnection::sessionBus();
+    if (!ok()) {
+        connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+                SLOT(ownerChange(QString)));
+        QTimer::singleShot(2000, &loop, SLOT(quit()));
+        loop.exec();
+    }
+}
+
+bool WaitForQMyServer::ok()
+{
+    return QDBusConnection::sessionBus().isConnected() &&
+        QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
+}
+
+void tst_QDBusAbstractAdaptor::initTestCase()
+{
+    commonInit();
+
+    // start peer server
+    #ifdef Q_OS_WIN
+    proc.start("qmyserver");
+    #else
+    proc.start("./qmyserver/qmyserver");
+    #endif
+    QVERIFY(proc.waitForStarted());
+
+    WaitForQMyServer w;
+    QVERIFY(w.ok());
+    //QTest::qWait(2000);
+
+    // get peer server address
+    QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
+    QDBusMessage rpl = QDBusConnection::sessionBus().call(req);
+    QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+    QString address = rpl.arguments().at(0).toString();
+
+    // connect to peer server
+    QDBusConnection peercon = QDBusConnection::connectToPeer(address, "peer");
+    QVERIFY(peercon.isConnected());
+
+    QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "isConnected");
+    QDBusMessage rpl2 = QDBusConnection::sessionBus().call(req2);
+    QVERIFY(rpl2.type() == QDBusMessage::ReplyMessage);
+    QVERIFY(rpl2.arguments().at(0).toBool());
+}
+
+void tst_QDBusAbstractAdaptor::cleanupTestCase()
+{
+    proc.close();
+    proc.kill();
+}
+
 void tst_QDBusAbstractAdaptor::methodCalls_data()
 {
     QTest::addColumn<int>("nInterfaces");
@@ -1151,71 +1074,577 @@ void tst_QDBusAbstractAdaptor::writeProperties()
     }
 }
 
-#if 0
-void tst_QDBusAbstractAdaptor::adaptorIntrospection_data()
+void tst_QDBusAbstractAdaptor::methodCallsPeer_data()
 {
     methodCalls_data();
 }
 
-void tst_QDBusAbstractAdaptor::adaptorIntrospection()
+void tst_QDBusAbstractAdaptor::methodCallsPeer()
 {
-    QDBusConnection con = QDBus::sessionBus();
+    QDBusConnection con("peer");
     QVERIFY(con.isConnected());
 
-    QObject obj;
-    con.registerObject("/", &obj);
-
-    QFETCH(int, nInterfaces);
-    switch (nInterfaces)
     {
-    case 4:
-        new Interface4(&obj);
-    case 3:
-        new Interface3(&obj);
-    case 2:
-        new Interface2(&obj);
-    case 1:
-        new Interface1(&obj);
+        // must fail: no object
+        QDBusInterface if1(QString(), "/", "local.Interface1", con);
+        QCOMPARE(if1.call(QDBus::BlockWithGui, "method").type(), QDBusMessage::ErrorMessage);
     }
 
-    QDBusObject dobj = con.findObject(con.baseService(), "/");
-    QVERIFY(dobj.isValid());
+    QFETCH(int, nInterfaces);
+    newMyObjectPeer(nInterfaces);
+    registerMyObjectPeer("/");
 
-    QString xml = dobj.introspect();
-    QVERIFY(!xml.isEmpty());
+    QDBusInterface if1(QString(), "/", "local.Interface1", con);
+    QDBusInterface if2(QString(), "/", "local.Interface2", con);
+    QDBusInterface if3(QString(), "/", "local.Interface3", con);
+    QDBusInterface if4(QString(), "/", "local.Interface4", con);
 
-    QStringList interfaces = dobj.interfaces();
-    QCOMPARE(interfaces.count(), nInterfaces + 2);
-    switch (nInterfaces)
-    {
-    case 4: {
-        QVERIFY(interfaces.contains("local.Interface4"));
-        QDBusInterface iface(dobj, "local.Interface4");
-        QCOMPARE(iface.methodData(), Interface4::methodData);
-        QCOMPARE(iface.signalData(), Interface4::signalData);
-        QCOMPARE(iface.propertyData(), Interface4::propertyData);
-    }
-    case 3: {
-        QVERIFY(interfaces.contains("local.Interface3"));
-        QDBusInterface iface(dobj, "local.Interface3");
-        QCOMPARE(iface.methodData(), Interface3::methodData);
-        QCOMPARE(iface.signalData(), Interface3::signalData);
-        QCOMPARE(iface.propertyData(), Interface3::propertyData);
-    }
-    case 2: {
-        QVERIFY(interfaces.contains("local.Interface2"));
-        QDBusInterface iface(dobj, "local.Interface2");
-        QCOMPARE(iface.methodData(), Interface2::methodData);
-        QCOMPARE(iface.signalData(), Interface2::signalData);
-        QCOMPARE(iface.propertyData(), Interface2::propertyData);
-    }
-    case 1: {
-        QVERIFY(interfaces.contains("local.Interface1"));
-        QDBusInterface iface(dobj, "local.Interface1");
-        QCOMPARE(iface.methodData(), Interface1::methodData);
-        QCOMPARE(iface.signalData(), Interface1::signalData);
-        QCOMPARE(iface.propertyData(), Interface1::propertyData);
-    }
+    // must fail: no such method
+    QCOMPARE(if1.call(QDBus::BlockWithGui, "method").type(), QDBusMessage::ErrorMessage);
+    if (!nInterfaces--)
+        return;
+    if (!nInterfaces--)
+        return;
+
+    // simple call: one such method exists
+    QCOMPARE(if2.call(QDBus::BlockWithGui, "method").type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface2::method()");
+    if (!nInterfaces--)
+        return;
+
+    // multiple methods in multiple interfaces, no name overlap
+    QCOMPARE(if1.call(QDBus::BlockWithGui, "methodVoid").type(), QDBusMessage::ErrorMessage);
+    QCOMPARE(if1.call(QDBus::BlockWithGui, "methodInt").type(), QDBusMessage::ErrorMessage);
+    QCOMPARE(if1.call(QDBus::BlockWithGui, "methodString").type(), QDBusMessage::ErrorMessage);
+    QCOMPARE(if2.call(QDBus::BlockWithGui, "methodVoid").type(), QDBusMessage::ErrorMessage);
+    QCOMPARE(if2.call(QDBus::BlockWithGui, "methodInt").type(), QDBusMessage::ErrorMessage);
+    QCOMPARE(if2.call(QDBus::BlockWithGui, "methodString").type(), QDBusMessage::ErrorMessage);
+
+    QCOMPARE(if3.call(QDBus::BlockWithGui, "methodVoid").type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface3::methodVoid()");
+    QCOMPARE(if3.call(QDBus::BlockWithGui, "methodInt", 42).type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface3::methodInt(int)");
+    QCOMPARE(if3.call(QDBus::BlockWithGui, "methodString", QString("")).type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface3::methodString(QString)");
+
+    if (!nInterfaces--)
+        return;
+
+    // method overloading: different interfaces
+    QCOMPARE(if4.call(QDBus::BlockWithGui, "method").type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface4::method()");
+
+    // method overloading: different parameters
+    QCOMPARE(if4.call(QDBus::BlockWithGui, "method.i", 42).type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface4::method(int)");
+    QCOMPARE(if4.call(QDBus::BlockWithGui, "method.s", QString()).type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface4::method(QString)");
+}
+
+void tst_QDBusAbstractAdaptor::methodCallScriptablePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer(2);
+    registerMyObjectPeer("/");
+
+    QDBusInterface if2(QString(), "/", "local.Interface2", con);
+
+    QCOMPARE(if2.call(QDBus::BlockWithGui,"scriptableMethod").type(), QDBusMessage::ReplyMessage);
+    QCOMPARE(slotSpyPeer(), "void Interface2::scriptableMethod()");
+}
+
+void tst_QDBusAbstractAdaptor::signalEmissionsPeer_data()
+{
+    signalEmissions_data();
+}
+
+void tst_QDBusAbstractAdaptor::signalEmissionsPeer()
+{
+    QFETCH(QString, interface);
+    QFETCH(QString, name);
+    QFETCH(QVariant, parameter);
+
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer(3);
+    registerMyObjectPeer("/", QDBusConnection::ExportAdaptors
+                            | QDBusConnection::ExportScriptableSignals);
+
+    // connect all signals and emit only one
+    {
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/", "local.Interface2", "signal",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.Interface3", "signalVoid",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.Interface3", "signalInt",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.Interface3", "signalString",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.MyObject", "scriptableSignalVoid",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.MyObject", "scriptableSignalInt",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.MyObject", "scriptableSignalString",
+                    &spy, SLOT(slot(QDBusMessage)));
+
+        emitSignalPeer(interface, name, parameter);
+
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.interface, interface);
+        QCOMPARE(spy.name, name);
+        QTEST(spy.signature, "signature");
+        QCOMPARE(spy.value, parameter);
+    }
+
+    // connect one signal and emit them all
+    {
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/", interface, name, &spy, SLOT(slot(QDBusMessage)));
+        emitSignalPeer("local.Interface2", "signal", QVariant());
+        emitSignalPeer("local.Interface3", "signalVoid", QVariant());
+        emitSignalPeer("local.Interface3", "signalInt", QVariant(1));
+        emitSignalPeer("local.Interface3", "signalString", QVariant("foo"));
+        emitSignalPeer("local.MyObject", "scriptableSignalVoid", QVariant());
+        emitSignalPeer("local.MyObject", "scriptableSignalInt", QVariant(1));
+        emitSignalPeer("local.MyObject", "scriptableSignalString", QVariant("foo"));
+
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.interface, interface);
+        QCOMPARE(spy.name, name);
+        QTEST(spy.signature, "signature");
+        QCOMPARE(spy.value, parameter);
+    }
+}
+
+void tst_QDBusAbstractAdaptor::sameSignalDifferentPathsPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer(2);
+
+    registerMyObjectPeer("/p1");
+    registerMyObjectPeer("/p2");
+
+    QDBusSignalSpy spy;
+    con.connect(QString(), "/p1", "local.Interface2", "signal", &spy, SLOT(slot(QDBusMessage)));
+    emitSignalPeer("local.Interface2", QString(), QVariant());
+    QTest::qWait(200);
+
+    QCOMPARE(spy.count, 1);
+    QCOMPARE(spy.interface, QString("local.Interface2"));
+    QCOMPARE(spy.name, QString("signal"));
+    QVERIFY(spy.signature.isEmpty());
+
+    // now connect the other one
+    spy.count = 0;
+    con.connect(QString(), "/p2", "local.Interface2", "signal", &spy, SLOT(slot(QDBusMessage)));
+    emitSignalPeer("local.Interface2", QString(), QVariant());
+    QTest::qWait(200);
+
+    QCOMPARE(spy.count, 2);
+}
+
+void tst_QDBusAbstractAdaptor::sameObjectDifferentPathsPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer(2);
+
+    registerMyObjectPeer("/p1");
+    registerMyObjectPeer("/p2", 0); // don't export anything
+
+    QDBusSignalSpy spy;
+    con.connect(QString(), "/p1", "local.Interface2", "signal", &spy, SLOT(slot(QDBusMessage)));
+    con.connect(QString(), "/p2", "local.Interface2", "signal", &spy, SLOT(slot(QDBusMessage)));
+    emitSignalPeer("local.Interface2", QString(), QVariant());
+    QTest::qWait(200);
+
+    QCOMPARE(spy.count, 1);
+    QCOMPARE(spy.interface, QString("local.Interface2"));
+    QCOMPARE(spy.name, QString("signal"));
+    QVERIFY(spy.signature.isEmpty());
+}
+
+void tst_QDBusAbstractAdaptor::scriptableSignalOrNotPeer()
+{
+    QDBusConnection con("peer");;
+    QVERIFY(con.isConnected());
+
+    {
+        newMyObjectPeer(0);
+
+        registerMyObjectPeer("/p1", QDBusConnection::ExportScriptableSignals);
+        registerMyObjectPeer("/p2", 0); // don't export anything
+
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/p1", "local.MyObject", "scriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/p2", "local.MyObject", "scriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/p1", "local.MyObject", "nonScriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/p2", "local.MyObject", "nonScriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        emitSignalPeer("local.MyObject", "scriptableSignalVoid", QVariant());
+        emitSignalPeer("local.MyObject", "nonScriptableSignalVoid", QVariant());
+        QTest::qWait(200);
+
+        QCOMPARE(spy.count, 1);     // only /p1 must have emitted
+        QCOMPARE(spy.interface, QString("local.MyObject"));
+        QCOMPARE(spy.name, QString("scriptableSignalVoid"));
+        QCOMPARE(spy.path, QString("/p1"));
+        QVERIFY(spy.signature.isEmpty());
+    }
+
+    {
+        newMyObjectPeer(0);
+
+        registerMyObjectPeer("/p1", QDBusConnection::ExportScriptableSignals);
+        registerMyObjectPeer("/p2", QDBusConnection::ExportScriptableSignals
+                                | QDBusConnection::ExportNonScriptableSignals);
+
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/p1", "local.MyObject", "nonScriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/p2", "local.MyObject", "nonScriptableSignalVoid", &spy, SLOT(slot(QDBusMessage)));
+        emitSignalPeer("local.MyObject", "nonScriptableSignalVoid", QVariant());
+        QTest::qWait(200);
+
+        QCOMPARE(spy.count, 1);     // only /p2 must have emitted now
+        QCOMPARE(spy.interface, QString("local.MyObject"));
+        QCOMPARE(spy.name, QString("nonScriptableSignalVoid"));
+        QCOMPARE(spy.path, QString("/p2"));
+        QVERIFY(spy.signature.isEmpty());
+    }
+
+    {
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/p1", "local.MyObject", "destroyed", &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/p2", "local.MyObject", "destroyed", &spy, SLOT(slot(QDBusMessage)));
+
+        {
+            newMyObjectPeer(0);
+
+            registerMyObjectPeer("/p1", QDBusConnection::ExportScriptableSignals);
+            registerMyObjectPeer("/p2", QDBusConnection::ExportScriptableSignals
+                                    | QDBusConnection::ExportNonScriptableSignals);
+        } // <--- QObject emits the destroyed(QObject*) signal at this point
+
+        QTest::qWait(200);
+
+        QCOMPARE(spy.count, 0);
+    }
+}
+
+void tst_QDBusAbstractAdaptor::overloadedSignalEmissionPeer_data()
+{
+    overloadedSignalEmission_data();
+}
+
+void tst_QDBusAbstractAdaptor::overloadedSignalEmissionPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QString interface = "local.Interface4";
+    QString name = "signal";
+    QFETCH(QVariant, parameter);
+    //QDBusInterface *if4 = new QDBusInterface(QString(), "/", interface, con);
+
+    // connect all signals and emit only one
+    {
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/", "local.Interface4", "signal", "",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.Interface4", "signal", "i",
+                    &spy, SLOT(slot(QDBusMessage)));
+        con.connect(QString(), "/", "local.Interface4", "signal", "s",
+                    &spy, SLOT(slot(QDBusMessage)));
+
+        emitSignalPeer(interface, name, parameter);
+
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.interface, interface);
+        QCOMPARE(spy.name, name);
+        QTEST(spy.signature, "signature");
+        QCOMPARE(spy.value, parameter);
+    }
+
+    QFETCH(QString, signature);
+    // connect one signal and emit them all
+    {
+        QDBusSignalSpy spy;
+        con.connect(QString(), "/", interface, name, signature, &spy, SLOT(slot(QDBusMessage)));
+        emitSignalPeer("local.Interface4", "signal", QVariant());
+        emitSignalPeer("local.Interface4", "signal", QVariant(1));
+        emitSignalPeer("local.Interface4", "signal", QVariant("foo"));
+
+        QCOMPARE(spy.count, 1);
+        QCOMPARE(spy.interface, interface);
+        QCOMPARE(spy.name, name);
+        QTEST(spy.signature, "signature");
+        QCOMPARE(spy.value, parameter);
+    }
+}
+
+void tst_QDBusAbstractAdaptor::readPropertiesPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+    for (int i = 2; i <= 4; ++i) {
+        QString name = QString("Interface%1").arg(i);
+
+        for (int j = 1; j <= 2; ++j) {
+            QString propname = QString("prop%1").arg(j);
+            QDBusReply<QVariant> reply =
+                properties.call(QDBus::BlockWithGui, "Get", "local." + name, propname);
+            QVariant value = reply;
+
+            QCOMPARE(value.userType(), int(QVariant::String));
+            QCOMPARE(value.toString(), QString("QString %1::%2() const").arg(name, propname));
+        }
+    }
+}
+
+void tst_QDBusAbstractAdaptor::readPropertiesInvalidInterfacePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+
+    // test an invalid interface:
+    QDBusReply<QVariant> reply = properties.call(QDBus::BlockWithGui, "Get", "local.DoesntExist", "prop1");
+    QVERIFY(!reply.isValid());
+}
+
+void tst_QDBusAbstractAdaptor::readPropertiesEmptyInterfacePeer_data()
+{
+    readPropertiesEmptyInterface_data();
+}
+
+void tst_QDBusAbstractAdaptor::readPropertiesEmptyInterfacePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+
+    QFETCH(QVariantMap, expectedProperties);
+    QFETCH(bool, existing);
+
+    QVariantMap::ConstIterator it = expectedProperties.constBegin();
+    for ( ; it != expectedProperties.constEnd(); ++it) {
+        QDBusReply<QVariant> reply = properties.call(QDBus::BlockWithGui, "Get", "", it.key());
+
+        if (existing) {
+            QVERIFY2(reply.isValid(), qPrintable(it.key()));
+        } else {
+            QVERIFY2(!reply.isValid(), qPrintable(it.key()));
+            continue;
+        }
+
+        QCOMPARE(int(reply.value().type()), int(QVariant::String));
+        if (it.value().isValid())
+            QCOMPARE(reply.value().toString(), it.value().toString());
+    }
+}
+
+void tst_QDBusAbstractAdaptor::readAllPropertiesPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+    for (int i = 2; i <= 4; ++i) {
+        QString name = QString("Interface%1").arg(i);
+        QDBusReply<QVariantMap> reply =
+            properties.call(QDBus::BlockWithGui, "GetAll", "local." + name);
+
+        for (int j = 1; j <= 2; ++j) {
+            QString propname = QString("prop%1").arg(j);
+            QVERIFY2(reply.value().contains(propname),
+                     qPrintable(propname + " on " + name));
+            QVariant value = reply.value().value(propname);
+
+            QCOMPARE(value.userType(), int(QVariant::String));
+            QCOMPARE(value.toString(), QString("QString %1::%2() const").arg(name, propname));
+        }
+    }
+}
+
+void tst_QDBusAbstractAdaptor::readAllPropertiesInvalidInterfacePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+
+    // test an invalid interface:
+    QDBusReply<QVariantMap> reply = properties.call(QDBus::BlockWithGui, "GetAll", "local.DoesntExist");
+    QVERIFY(!reply.isValid());
+}
+
+void tst_QDBusAbstractAdaptor::readAllPropertiesEmptyInterfacePeer_data()
+{
+    readAllPropertiesEmptyInterface_data();
+}
+
+void tst_QDBusAbstractAdaptor::readAllPropertiesEmptyInterfacePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+
+    QDBusReply<QVariantMap> reply = properties.call(QDBus::BlockWithGui, "GetAll", "");
+    QVERIFY(reply.isValid());
+
+    QVariantMap allprops = reply;
+
+    QFETCH(QVariantMap, expectedProperties);
+    QFETCH(bool, existing);
+
+    QVariantMap::ConstIterator it = expectedProperties.constBegin();
+    if (existing) {
+        for ( ; it != expectedProperties.constEnd(); ++it) {
+            QVERIFY2(allprops.contains(it.key()), qPrintable(it.key()));
+
+            QVariant propvalue = allprops.value(it.key());
+            QVERIFY2(!propvalue.isNull(), qPrintable(it.key()));
+            QVERIFY2(propvalue.isValid(), qPrintable(it.key()));
+
+            QString stringvalue = propvalue.toString();
+            QVERIFY2(!stringvalue.isEmpty(), qPrintable(it.key()));
+
+            if (it.value().isValid())
+                QCOMPARE(stringvalue, it.value().toString());
+
+            // remove this property from the map
+            allprops.remove(it.key());
+        }
+
+        QVERIFY2(allprops.isEmpty(),
+                 qPrintable(QStringList(allprops.keys()).join(" ")));
+    } else {
+        for ( ; it != expectedProperties.constEnd(); ++it)
+            QVERIFY2(!allprops.contains(it.key()), qPrintable(it.key()));
+    }
+}
+
+void tst_QDBusAbstractAdaptor::writePropertiesPeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QDBusInterface properties(QString(), "/", "org.freedesktop.DBus.Properties", con);
+    for (int i = 2; i <= 4; ++i) {
+        QString name = QString("Interface%1").arg(i);
+
+        clearValueSpyPeer();
+        properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop1"),
+                        qVariantFromValue(QDBusVariant(name)));
+        QVERIFY(valueSpyPeer().isEmpty()); // call mustn't have succeeded
+
+        properties.call(QDBus::BlockWithGui, "Set", "local." + name, QString("prop2"),
+                        qVariantFromValue(QDBusVariant(name)));
+        QCOMPARE(valueSpyPeer(), name);
+        QCOMPARE(QString(slotSpyPeer()), QString("void %1::setProp2(const QString &)").arg(name));
+    }
+}
+
+#if 0
+void tst_QDBusAbstractAdaptor::adaptorIntrospection_data()
+{
+    methodCalls_data();
+}
+
+void tst_QDBusAbstractAdaptor::adaptorIntrospection()
+{
+    QDBusConnection con = QDBus::sessionBus();
+    QVERIFY(con.isConnected());
+
+    QObject obj;
+    con.registerObject("/", &obj);
+
+    QFETCH(int, nInterfaces);
+    switch (nInterfaces)
+    {
+    case 4:
+        new Interface4(&obj);
+    case 3:
+        new Interface3(&obj);
+    case 2:
+        new Interface2(&obj);
+    case 1:
+        new Interface1(&obj);
+    }
+
+    QDBusObject dobj = con.findObject(con.baseService(), "/");
+    QVERIFY(dobj.isValid());
+
+    QString xml = dobj.introspect();
+    QVERIFY(!xml.isEmpty());
+
+    QStringList interfaces = dobj.interfaces();
+    QCOMPARE(interfaces.count(), nInterfaces + 2);
+    switch (nInterfaces)
+    {
+    case 4: {
+        QVERIFY(interfaces.contains("local.Interface4"));
+        QDBusInterface iface(dobj, "local.Interface4");
+        QCOMPARE(iface.methodData(), Interface4::methodData);
+        QCOMPARE(iface.signalData(), Interface4::signalData);
+        QCOMPARE(iface.propertyData(), Interface4::propertyData);
+    }
+    case 3: {
+        QVERIFY(interfaces.contains("local.Interface3"));
+        QDBusInterface iface(dobj, "local.Interface3");
+        QCOMPARE(iface.methodData(), Interface3::methodData);
+        QCOMPARE(iface.signalData(), Interface3::signalData);
+        QCOMPARE(iface.propertyData(), Interface3::propertyData);
+    }
+    case 2: {
+        QVERIFY(interfaces.contains("local.Interface2"));
+        QDBusInterface iface(dobj, "local.Interface2");
+        QCOMPARE(iface.methodData(), Interface2::methodData);
+        QCOMPARE(iface.signalData(), Interface2::signalData);
+        QCOMPARE(iface.propertyData(), Interface2::propertyData);
+    }
+    case 1: {
+        QVERIFY(interfaces.contains("local.Interface1"));
+        QDBusInterface iface(dobj, "local.Interface1");
+        QCOMPARE(iface.methodData(), Interface1::methodData);
+        QCOMPARE(iface.signalData(), Interface1::signalData);
+        QCOMPARE(iface.propertyData(), Interface1::propertyData);
+    }
     }
 }
 
@@ -1438,6 +1867,28 @@ void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValue()
     QCOMPARE(qdbus_cast<QString>(reply.arguments().at(1)), testString);
 }
 
+void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValuePeer()
+{
+    QDBusConnection con("peer");
+    QVERIFY(con.isConnected());
+
+    newMyObjectPeer();
+    registerMyObjectPeer("/");
+
+    QString testString = "This is a test string.";
+
+    QDBusInterface remote(QString(), "/", "local.Interface3", con);
+    QDBusMessage reply = remote.call(QDBus::BlockWithGui, "methodStringString", testString);
+    QVERIFY(reply.arguments().count() == 2);
+
+    QDBusReply<int> intreply = reply;
+    QVERIFY(intreply.isValid());
+    QCOMPARE(intreply.value(), 42);
+
+    QCOMPARE(reply.arguments().at(1).userType(), int(QVariant::String));
+    QCOMPARE(qdbus_cast<QString>(reply.arguments().at(1)), testString);
+}
+
 QTEST_MAIN(tst_QDBusAbstractAdaptor)
 
 #include "tst_qdbusabstractadaptor.moc"
-- 
cgit v0.12


From 8bc3b7cc5d7ee52962e06a1d4fdbbfb439cfa416 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 19 Apr 2011 12:15:21 +0100
Subject: Fix qfile autotest hanging in CI system

The test machine is configured to pop up dialogs in case of CRT
assertion failures. The CRT has a debug assert whenever an invalid
file handle is used, while the test is expecting to get the EBADF
return code.
Due to some behaviour change in windows 7 (maybe SP1), we need to
call _CrtSetReportMode in addition to setting an error handler.

Reviewed-By: mread
---
 tests/auto/qfile/tst_qfile.cpp | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp
index 79539c9..688a92d 100644
--- a/tests/auto/qfile/tst_qfile.cpp
+++ b/tests/auto/qfile/tst_qfile.cpp
@@ -3294,13 +3294,18 @@ public:
     static void ignore_invalid_parameter(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t) {}
     AutoIgnoreInvalidParameter()
     {
-        old = _set_invalid_parameter_handler(ignore_invalid_parameter);
+        oldHandler = _set_invalid_parameter_handler(ignore_invalid_parameter);
+        //also disable the abort/retry/ignore popup
+        oldReportMode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
     }
     ~AutoIgnoreInvalidParameter()
     {
-        _set_invalid_parameter_handler(old);
+        //restore previous settings
+        _set_invalid_parameter_handler(oldHandler);
+        _CrtSetReportMode(_CRT_ASSERT, oldReportMode);
     }
-    _invalid_parameter_handler old;
+    _invalid_parameter_handler oldHandler;
+    int oldReportMode;
 #endif
 };
 
-- 
cgit v0.12


From 5888b7d01c05c03bc06a6672a4a8be30bc4192f5 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Tue, 19 Apr 2011 14:37:05 +0100
Subject: Fix compile error with QT_NO_OPENSSL

---
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index 146d2f3..f509cea 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -93,7 +93,9 @@ Q_DECLARE_METATYPE(QNetworkReply::NetworkError)
 Q_DECLARE_METATYPE(QBuffer*)
 Q_DECLARE_METATYPE(QHttpMultiPart *)
 Q_DECLARE_METATYPE(QList<QFile*>) // for multiparts
+#ifndef QT_NO_OPENSSL
 Q_DECLARE_METATYPE(QSslConfiguration)
+#endif
 
 class QNetworkReplyPtr: public QSharedPointer<QNetworkReply>
 {
-- 
cgit v0.12


From 7a9ed6a1983e318bfb14f0b2db41b3a4e1415529 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Tue, 19 Apr 2011 11:38:06 +0200
Subject: QNetworkCookie: do not access date string out of bounds

---
 src/network/access/qnetworkcookie.cpp            | 2 +-
 tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp
index c2a6925..52eb345 100644
--- a/src/network/access/qnetworkcookie.cpp
+++ b/src/network/access/qnetworkcookie.cpp
@@ -737,7 +737,7 @@ static QDateTime parseDateString(const QByteArray &dateString)
         // 4 digit Year
         if (isNum
             && year == -1
-            && dateString.length() >= at + 3) {
+            && dateString.length() > at + 3) {
             if (isNumber(dateString[at + 1])
                 && isNumber(dateString[at + 2])
                 && isNumber(dateString[at + 3])) {
diff --git a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
index 91dfe47..e0c477b 100644
--- a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -707,6 +707,7 @@ void tst_QNetworkCookie::parseMultipleCookies_data()
     cookie.setDomain("!@#$%^&*();:."); // the ';' is actually problematic, because it is a separator
     list = QList<QNetworkCookie>();
     QTest::newRow("domain-non-alpha-numeric") << "NonAlphNumDomName=NonAlphNumDomValue; domain=!@#$%^&*()" << list;
+    QTest::newRow("expiration-3digit1") << "a=b; expires=123" << list; // used to ASSERT
 }
 
 void tst_QNetworkCookie::parseMultipleCookies()
-- 
cgit v0.12