From 9a5b72eb64d698aff507d5c2b2ea6d19bda0b65e Mon Sep 17 00:00:00 2001
From: Gareth Stockwell <ext-gareth.stockwell@nokia.com>
Date: Tue, 9 Nov 2010 14:39:27 +0000
Subject: Send WinIdChange event when winId is set to zero

This allows an observer to get a notification just before the window
handle owned by a native widget is destroyed.  Note that, at the
point when the event is sent, the widget's internalWinId() will
return the new value, but the old native window handle will not
be destroyed until after the event handler is run.

Task-number: QTMOBILITY-645
Reviewed-by: sroedal
---
 dist/changes-4.7.2         | 8 ++++++--
 src/gui/kernel/qwidget.cpp | 9 ++-------
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/dist/changes-4.7.2 b/dist/changes-4.7.2
index 49bdd8e..a18a237 100644
--- a/dist/changes-4.7.2
+++ b/dist/changes-4.7.2
@@ -45,8 +45,12 @@ QtCore
 QtGui
 -----
 
- - foo
-    * bar
+ - QWidget
+    * [QTMOBILITY-645] Send WinIdChange event when winId is set to zero.
+	  The window handle of a native widget may be set to zero in two
+	  situations: (i) temporarily, during reparenting and (ii) during
+	  widget destruction.  Previously, no WinIdChange event was sent in
+	  either of these cases; now, it is sent in both cases.
 
 QtDBus
 ------
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index e22ec55..cbf4886 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -1673,13 +1673,8 @@ void QWidgetPrivate::setWinId(WId id)                // set widget identifier
     }
 
     if(oldWinId != id) {
-        // Do not emit an event when the old winId is destroyed.  This only
-        // happens (a) during widget destruction, and (b) immediately prior
-        // to creation of a new winId, for example as a result of re-parenting.
-        if(id != 0) {
-            QEvent e(QEvent::WinIdChange);
-            QCoreApplication::sendEvent(q, &e);
-        }
+        QEvent e(QEvent::WinIdChange);
+        QCoreApplication::sendEvent(q, &e);
     }
 }
 
-- 
cgit v0.12


From d16fcbc6d6b00770a5106027c24ed7cf7e92c1d5 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 11 Nov 2010 17:27:01 +0000
Subject: SSL: Fix for systemCaCertificates being called first on symbian

On symbian, thread names must be unique (actually kernel object names)
When a thread exits, there may still be open handles, for example a
debugger or RUndertaker so the thread name cannot be reused immediately.

S60 has an RUndertaker instance in a background thread, which is used
to display the "application closed" messages when a crash happens.
Until that thread has run and checked the thread exit to see if it was
a crash or not, the thread remains open.

When systemCaCertificates is called as the first API call, it calls itself
via ensureinitialised() to set the default CA certs. This double call
should be addressed by QTBUG-15218.

In any case, QSslSocket::systemCaCertificates() is intended to refresh
from the system - if application code calls it too quickly in succession it
could also trigger this bug.

Task-number: QTBUG-15126
Reviewed-by: Markus Goetz
---
 src/network/ssl/qsslsocket_openssl.cpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 426b07a..f4bd423 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -659,8 +659,16 @@ TInt CSymbianCertificateRetriever::ThreadEntryPoint(TAny* aParams)
 
 void CSymbianCertificateRetriever::ConstructL()
 {
-    User::LeaveIfError(iThread.Create(_L("CertWorkerThread"),
-        CSymbianCertificateRetriever::ThreadEntryPoint, 16384, NULL, this));
+    TInt err;
+    int i=0;
+    QString name(QLatin1String("CertWorkerThread-%1"));
+    //recently closed thread names remain in use for a while until all handles have been closed
+    //including users of RUndertaker
+    do {
+        err = iThread.Create(qt_QString2TPtrC(name.arg(i++)),
+            CSymbianCertificateRetriever::ThreadEntryPoint, 16384, NULL, this);
+    } while (err == KErrAlreadyExists);
+    User::LeaveIfError(err);
 }
 
 void CSymbianCertificateRetriever::DoCancel()
-- 
cgit v0.12


From 924be25253471ababfcf560a6ca098543838c0aa Mon Sep 17 00:00:00 2001
From: Jason McDonald <jason.mcdonald@nokia.com>
Date: Fri, 12 Nov 2010 13:23:41 +1000
Subject: Bump Qt version to 4.7.2.

Reviewed-by: Trust Me
---
 src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri    | 4 ++--
 src/corelib/global/qglobal.h                           | 4 ++--
 src/plugins/qpluginbase.pri                            | 2 +-
 src/qbase.pri                                          | 2 +-
 tests/auto/selftests/expected_cmptest.txt              | 2 +-
 tests/auto/selftests/expected_crashes_3.txt            | 2 +-
 tests/auto/selftests/expected_longstring.txt           | 2 +-
 tests/auto/selftests/expected_maxwarnings.txt          | 2 +-
 tests/auto/selftests/expected_skip.txt                 | 2 +-
 tools/assistant/tools/assistant/doc/assistant.qdocconf | 2 +-
 tools/qdoc3/doc/files/qt.qdocconf                      | 8 ++++----
 tools/qdoc3/test/assistant.qdocconf                    | 4 ++--
 tools/qdoc3/test/designer.qdocconf                     | 4 ++--
 tools/qdoc3/test/linguist.qdocconf                     | 4 ++--
 tools/qdoc3/test/qdeclarative.qdocconf                 | 8 ++++----
 tools/qdoc3/test/qmake.qdocconf                        | 4 ++--
 tools/qdoc3/test/qt-build-docs.qdocconf                | 8 ++++----
 tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf          | 8 ++++----
 tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf          | 8 ++++----
 tools/qdoc3/test/qt.qdocconf                           | 8 ++++----
 tools/qdoc3/test/qt_ja_JP.qdocconf                     | 8 ++++----
 tools/qdoc3/test/qt_zh_CN.qdocconf                     | 8 ++++----
 22 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri b/src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri
index f2282f8..b98617f 100644
--- a/src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri
+++ b/src/3rdparty/webkit/WebKit/qt/qt_webkit_version.pri
@@ -1,5 +1,5 @@
-QT_WEBKIT_VERSION = 4.7.1
+QT_WEBKIT_VERSION = 4.7.2
 QT_WEBKIT_MAJOR_VERSION = 4
 QT_WEBKIT_MINOR_VERSION = 7
-QT_WEBKIT_PATCH_VERSION = 1
+QT_WEBKIT_PATCH_VERSION = 2
 QT_CONFIG += webkit
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 35607d5..b148a1d 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -44,11 +44,11 @@
 
 #include <stddef.h>
 
-#define QT_VERSION_STR   "4.7.1"
+#define QT_VERSION_STR   "4.7.2"
 /*
    QT_VERSION is (major << 16) + (minor << 8) + patch.
 */
-#define QT_VERSION 0x040701
+#define QT_VERSION 0x040702
 /*
    can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
 */
diff --git a/src/plugins/qpluginbase.pri b/src/plugins/qpluginbase.pri
index 84009d8..7cbffe0 100644
--- a/src/plugins/qpluginbase.pri
+++ b/src/plugins/qpluginbase.pri
@@ -1,6 +1,6 @@
 TEMPLATE = lib
 isEmpty(QT_MAJOR_VERSION) {
-   VERSION=4.7.1
+   VERSION=4.7.2
 } else {
    VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}
 }
diff --git a/src/qbase.pri b/src/qbase.pri
index 4217618..af18af8 100644
--- a/src/qbase.pri
+++ b/src/qbase.pri
@@ -4,7 +4,7 @@ INCLUDEPATH *= $$QMAKE_INCDIR_QT/$$TARGET #just for today to have some compat
 isEmpty(QT_ARCH):!isEmpty(ARCH):QT_ARCH=$$ARCH #another compat that will rot for change #215700
 TEMPLATE	= lib
 isEmpty(QT_MAJOR_VERSION) {
-   VERSION=4.7.1
+   VERSION=4.7.2
 } else {
    VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}
 }
diff --git a/tests/auto/selftests/expected_cmptest.txt b/tests/auto/selftests/expected_cmptest.txt
index 7f3aa9a..fccaca3 100644
--- a/tests/auto/selftests/expected_cmptest.txt
+++ b/tests/auto/selftests/expected_cmptest.txt
@@ -1,5 +1,5 @@
 ********* Start testing of tst_Cmptest *********
-Config: Using QTest library 4.7.1, Qt 4.7.1
+Config: Using QTest library 4.7.2, Qt 4.7.2
 PASS   : tst_Cmptest::initTestCase()
 PASS   : tst_Cmptest::compare_boolfuncs()
 PASS   : tst_Cmptest::compare_pointerfuncs()
diff --git a/tests/auto/selftests/expected_crashes_3.txt b/tests/auto/selftests/expected_crashes_3.txt
index 7ded525..2558f68 100644
--- a/tests/auto/selftests/expected_crashes_3.txt
+++ b/tests/auto/selftests/expected_crashes_3.txt
@@ -1,5 +1,5 @@
 ********* Start testing of tst_Crashes *********
-Config: Using QTest library 4.7.1, Qt 4.7.1
+Config: Using QTest library 4.7.2, Qt 4.7.2
 PASS   : tst_Crashes::initTestCase()
 QFATAL : tst_Crashes::crash() Received signal 11
 FAIL!  : tst_Crashes::crash() Received a fatal error.
diff --git a/tests/auto/selftests/expected_longstring.txt b/tests/auto/selftests/expected_longstring.txt
index 9ad6f56..c56244b 100644
--- a/tests/auto/selftests/expected_longstring.txt
+++ b/tests/auto/selftests/expected_longstring.txt
@@ -1,5 +1,5 @@
 ********* Start testing of tst_LongString *********
-Config: Using QTest library 4.7.1, Qt 4.7.1
+Config: Using QTest library 4.7.2, Qt 4.7.2
 PASS   : tst_LongString::initTestCase()
 FAIL!  : tst_LongString::failWithLongString() Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui.
 
diff --git a/tests/auto/selftests/expected_maxwarnings.txt b/tests/auto/selftests/expected_maxwarnings.txt
index 949da13..7846435 100644
--- a/tests/auto/selftests/expected_maxwarnings.txt
+++ b/tests/auto/selftests/expected_maxwarnings.txt
@@ -1,5 +1,5 @@
 ********* Start testing of MaxWarnings *********
-Config: Using QTest library 4.7.1, Qt 4.7.1
+Config: Using QTest library 4.7.2, Qt 4.7.2
 PASS   : MaxWarnings::initTestCase()
 QWARN  : MaxWarnings::warn() 0
 QWARN  : MaxWarnings::warn() 1
diff --git a/tests/auto/selftests/expected_skip.txt b/tests/auto/selftests/expected_skip.txt
index 1f5bf7b..5c9e497 100644
--- a/tests/auto/selftests/expected_skip.txt
+++ b/tests/auto/selftests/expected_skip.txt
@@ -1,5 +1,5 @@
 ********* Start testing of tst_Skip *********
-Config: Using QTest library 4.7.1, Qt 4.7.1
+Config: Using QTest library 4.7.2, Qt 4.7.2
 PASS   : tst_Skip::initTestCase()
 SKIP   : tst_Skip::test() skipping all
    Loc: [/home/user/depot/qt-git/mainline/tests/auto/selftests/skip/tst_skip.cpp(68)]
diff --git a/tools/assistant/tools/assistant/doc/assistant.qdocconf b/tools/assistant/tools/assistant/doc/assistant.qdocconf
index 26cdafb..57abeae 100644
--- a/tools/assistant/tools/assistant/doc/assistant.qdocconf
+++ b/tools/assistant/tools/assistant/doc/assistant.qdocconf
@@ -12,5 +12,5 @@ HTML.footer = "<p /><address><hr /><div align=\"center\">\n" \
               "<table width=\"100%\" cellspacing=\"0\" border=\"0\"><tr class=\"address\">\n" \
               "<td width=\"30%\" align=\"left\">Copyright &copy; 2010 Nokia Corporation and/or its subsidiary(-ies)</td>\n" \
               "<td width=\"40%\" align=\"center\">Trademarks</td>\n" \
-              "<td width=\"30%\" align=\"right\"><div align=\"right\">Qt 4.7.1</div></td>\n" \
+              "<td width=\"30%\" align=\"right\"><div align=\"right\">Qt 4.7.2</div></td>\n" \
               "</tr></table></div></address>"
diff --git a/tools/qdoc3/doc/files/qt.qdocconf b/tools/qdoc3/doc/files/qt.qdocconf
index 4546c7a..44cfbc1 100644
--- a/tools/qdoc3/doc/files/qt.qdocconf
+++ b/tools/qdoc3/doc/files/qt.qdocconf
@@ -22,7 +22,7 @@ edition.DesktopLight.groups       = -graphicsview-api
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.indexTitle          = Qt Reference Documentation
 qhp.Qt.indexRoot           =
@@ -36,9 +36,9 @@ qhp.Qt.extraFiles          = classic.css \
                              images/dynamiclayouts-example.png \
                              images/stylesheet-coffee-plastique.png
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 qhp.Qt.subprojects         = classes overviews examples
 qhp.Qt.subprojects.classes.title = Classes
 qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
diff --git a/tools/qdoc3/test/assistant.qdocconf b/tools/qdoc3/test/assistant.qdocconf
index 74b68df..0e9a2a8 100644
--- a/tools/qdoc3/test/assistant.qdocconf
+++ b/tools/qdoc3/test/assistant.qdocconf
@@ -13,7 +13,7 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = Assistant
 
 qhp.Assistant.file                = assistant.qhp
-qhp.Assistant.namespace           = com.trolltech.assistant.471
+qhp.Assistant.namespace           = com.trolltech.assistant.472
 qhp.Assistant.virtualFolder       = qdoc
 qhp.Assistant.indexTitle          = Qt Assistant Manual
 qhp.Assistant.extraFiles          = images/bg_l.png \
@@ -50,7 +50,7 @@ qhp.Assistant.extraFiles          = images/bg_l.png \
 			     	    style/style_ie8.css \
 			     	    style/style.css
 
-qhp.Assistant.filterAttributes    = qt 4.7.1 tools assistant
+qhp.Assistant.filterAttributes    = qt 4.7.2 tools assistant
 qhp.Assistant.customFilters.Assistant.name = Qt Assistant Manual
 qhp.Assistant.customFilters.Assistant.filterAttributes = qt tools assistant
 qhp.Assistant.subprojects         = manual examples
diff --git a/tools/qdoc3/test/designer.qdocconf b/tools/qdoc3/test/designer.qdocconf
index ab66792..637399b 100644
--- a/tools/qdoc3/test/designer.qdocconf
+++ b/tools/qdoc3/test/designer.qdocconf
@@ -13,7 +13,7 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = Designer
 
 qhp.Designer.file                = designer.qhp
-qhp.Designer.namespace           = com.trolltech.designer.471
+qhp.Designer.namespace           = com.trolltech.designer.472
 qhp.Designer.virtualFolder       = qdoc
 qhp.Designer.indexTitle          = Qt Designer Manual
 qhp.Designer.extraFiles          = images/bg_l.png \
@@ -50,7 +50,7 @@ qhp.Designer.extraFiles          = images/bg_l.png \
 									style/style_ie8.css \
                              	    style/style.css
 
-qhp.Designer.filterAttributes    = qt 4.7.1 tools designer
+qhp.Designer.filterAttributes    = qt 4.7.2 tools designer
 qhp.Designer.customFilters.Designer.name = Qt Designer Manual
 qhp.Designer.customFilters.Designer.filterAttributes = qt tools designer
 qhp.Designer.subprojects         = manual examples
diff --git a/tools/qdoc3/test/linguist.qdocconf b/tools/qdoc3/test/linguist.qdocconf
index 0d920e2..8ee298e 100644
--- a/tools/qdoc3/test/linguist.qdocconf
+++ b/tools/qdoc3/test/linguist.qdocconf
@@ -13,7 +13,7 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = Linguist
 
 qhp.Linguist.file                = linguist.qhp
-qhp.Linguist.namespace           = com.trolltech.linguist.471
+qhp.Linguist.namespace           = com.trolltech.linguist.472
 qhp.Linguist.virtualFolder       = qdoc
 qhp.Linguist.indexTitle          = Qt Linguist Manual
 qhp.Linguist.extraFiles          = images/bg_l.png \
@@ -50,7 +50,7 @@ qhp.Linguist.extraFiles          = images/bg_l.png \
 									style/style_ie8.css \
                              	    style/style.css
 
-qhp.Linguist.filterAttributes    = qt 4.7.1 tools linguist
+qhp.Linguist.filterAttributes    = qt 4.7.2 tools linguist
 qhp.Linguist.customFilters.Linguist.name = Qt Linguist Manual
 qhp.Linguist.customFilters.Linguist.filterAttributes = qt tools linguist
 qhp.Linguist.subprojects         = manual examples
diff --git a/tools/qdoc3/test/qdeclarative.qdocconf b/tools/qdoc3/test/qdeclarative.qdocconf
index 9aaebcb..e68a935 100644
--- a/tools/qdoc3/test/qdeclarative.qdocconf
+++ b/tools/qdoc3/test/qdeclarative.qdocconf
@@ -21,7 +21,7 @@ edition.DesktopLight.groups       = -graphicsview-api
 qhp.projects            = Qml
 
 qhp.Qml.file                = qml.qhp
-qhp.Qml.namespace           = com.trolltech.qml.471
+qhp.Qml.namespace           = com.trolltech.qml.472
 qhp.Qml.virtualFolder       = qdoc
 qhp.Qml.indexTitle          = Qml Reference
 
@@ -61,9 +61,9 @@ qhp.Qml.extraFiles            = images/bg_l.png \
                              style/style_ie8.css \
                              style/style.css
 
-qhp.Qml.filterAttributes    = qt 4.7.1 qtrefdoc
-qhp.Qml.customFilters.Qt.name = Qt 4.7.1
-qhp.Qml.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qml.filterAttributes    = qt 4.7.2 qtrefdoc
+qhp.Qml.customFilters.Qt.name = Qt 4.7.2
+qhp.Qml.customFilters.Qt.filterAttributes = qt 4.7.2
 qhp.Qml.subprojects         = classes
 qhp.Qml.subprojects.classes.title = Elements
 qhp.Qml.subprojects.classes.indexTitle = Qml Elements
diff --git a/tools/qdoc3/test/qmake.qdocconf b/tools/qdoc3/test/qmake.qdocconf
index be2e9d3..b5bc96c 100644
--- a/tools/qdoc3/test/qmake.qdocconf
+++ b/tools/qdoc3/test/qmake.qdocconf
@@ -13,7 +13,7 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = qmake
 
 qhp.qmake.file                = qmake.qhp
-qhp.qmake.namespace           = com.trolltech.qmake.471
+qhp.qmake.namespace           = com.trolltech.qmake.472
 qhp.qmake.virtualFolder       = qdoc
 qhp.qmake.indexTitle          = QMake Manual
 qhp.qmake.extraFiles          = images/bg_l.png \
@@ -50,7 +50,7 @@ qhp.qmake.extraFiles          = images/bg_l.png \
                              style/style_ie8.css \
                              style/style.css
 
-qhp.qmake.filterAttributes    = qt 4.7.1 tools qmake
+qhp.qmake.filterAttributes    = qt 4.7.2 tools qmake
 qhp.qmake.customFilters.qmake.name = qmake Manual
 qhp.qmake.customFilters.qmake.filterAttributes = qt tools qmake
 qhp.qmake.subprojects         = manual
diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf
index dcabeb4..5fae2f6 100644
--- a/tools/qdoc3/test/qt-build-docs.qdocconf
+++ b/tools/qdoc3/test/qt-build-docs.qdocconf
@@ -15,7 +15,7 @@ naturallanguage         = en_US
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.indexTitle          = Qt Reference Documentation
 qhp.Qt.indexRoot           =
@@ -59,9 +59,9 @@ qhp.Qt.extraFiles          = index.html \
 
 
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 qhp.Qt.subprojects         = classes overviews examples
 qhp.Qt.subprojects.classes.title = Classes
 qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
diff --git a/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf
index 7e28fa2..24696d5 100644
--- a/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf
+++ b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf
@@ -17,15 +17,15 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.title               = Qt
 qhp.Qt.indexTitle          = Qt
 qhp.Qt.selectors           = fake:example
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc ja_JP
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc ja_JP
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 
 # Files not referenced in any qdoc file (last four are needed by qtdemo)
 # See also extraimages.HTML
diff --git a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf
index cfcc76d..7789bf7 100644
--- a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf
+++ b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf
@@ -17,15 +17,15 @@ indexes                 = $QT_BUILD_TREE/doc-build/html-qt/qt.index
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.title               = 教程
 qhp.Qt.indexTitle          = 教程
 qhp.Qt.selectors           = fake:example
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc zh_CN
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc zh_CN
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 
 # Files not referenced in any qdoc file (last four are needed by qtdemo)
 # See also extraimages.HTML
diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf
index ea97205..8998751 100644
--- a/tools/qdoc3/test/qt.qdocconf
+++ b/tools/qdoc3/test/qt.qdocconf
@@ -17,7 +17,7 @@ naturallanguage         = en_US
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.indexTitle          = Qt Reference Documentation
 qhp.Qt.indexRoot           =
@@ -59,9 +59,9 @@ qhp.Qt.extraFiles          = index.html \
                  style/style_ie8.css \
                  style/style.css
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 qhp.Qt.subprojects         = classes overviews examples
 qhp.Qt.subprojects.classes.title = Classes
 qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
diff --git a/tools/qdoc3/test/qt_ja_JP.qdocconf b/tools/qdoc3/test/qt_ja_JP.qdocconf
index 32bba06..a5c348c 100644
--- a/tools/qdoc3/test/qt_ja_JP.qdocconf
+++ b/tools/qdoc3/test/qt_ja_JP.qdocconf
@@ -19,15 +19,15 @@ indexes                 = $QTDIR/doc/html/qt.index
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.title               = Qt
 qhp.Qt.indexTitle          = Qt
 qhp.Qt.selectors           = fake:example
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc ja_JP
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc ja_JP
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 
 # Files not referenced in any qdoc file (last four are needed by qtdemo)
 # See also extraimages.HTML
diff --git a/tools/qdoc3/test/qt_zh_CN.qdocconf b/tools/qdoc3/test/qt_zh_CN.qdocconf
index 40d3d5a..25f96b8 100644
--- a/tools/qdoc3/test/qt_zh_CN.qdocconf
+++ b/tools/qdoc3/test/qt_zh_CN.qdocconf
@@ -19,15 +19,15 @@ indexes                 = $QTDIR/doc/html/qt.index
 qhp.projects            = Qt
 
 qhp.Qt.file                = qt.qhp
-qhp.Qt.namespace           = com.trolltech.qt.471
+qhp.Qt.namespace           = com.trolltech.qt.472
 qhp.Qt.virtualFolder       = qdoc
 qhp.Qt.title               = 教程
 qhp.Qt.indexTitle          = 教程
 qhp.Qt.selectors           = fake:example
 
-qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc zh_CN
-qhp.Qt.customFilters.Qt.name = Qt 4.7.1
-qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
+qhp.Qt.filterAttributes    = qt 4.7.2 qtrefdoc zh_CN
+qhp.Qt.customFilters.Qt.name = Qt 4.7.2
+qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.2
 
 # Files not referenced in any qdoc file (last four are needed by qtdemo)
 # See also extraimages.HTML
-- 
cgit v0.12


From 16575f7aef840b6aae0dc767468ab713fbcfd7a6 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Tue, 9 Nov 2010 16:39:20 +0200
Subject: Localize .loc and .pkg content based on TRANSLATIONS

If developer specifies "CONFIG += localize_deployment" in .pro file,
the generated .loc and .pkg will now use translatable strings from
.ts files defined in TRANSLATIONS. The .ts files must have an
underscore and Qt language code at the end of the filename body
to be compatible with deployment localization. E.g. myapp_en.ts.

Running lupdate will generate these entries into .ts files:
- Application short caption
- Application long caption
- Package name
- Smart installer package name

Task-number: QTBUG-13917
Reviewed-by: Oswald Buddenhagen
Reviewed-by: Janne Anttila
Reviewed-by: axis
---
 demos/symbianpkgrules.pri                          |   5 +-
 doc/src/development/qmake-manual.qdoc              |   8 +
 examples/symbianpkgrules.pri                       |   5 +-
 .../common/symbian/appCaptionForTranslation.cpp    |  46 ++
 .../common/symbian/packageNameForTranslation.cpp   |  47 +++
 mkspecs/common/symbian/symbian.conf                |  63 ++-
 mkspecs/features/default_post.prf                  |  10 +
 mkspecs/features/symbian/default_post.prf          |  12 +
 mkspecs/features/symbian/localize_deployment.prf   |  82 ++++
 mkspecs/features/symbian/qt.prf                    |   6 +-
 mkspecs/features/symbian/sis_targets.prf           |  26 +-
 qmake/generators/symbian/symbian_makefile.h        |  10 +-
 qmake/generators/symbian/symbiancommon.cpp         | 467 ++++++++++++---------
 qmake/generators/symbian/symbiancommon.h           |  35 +-
 qmake/generators/symbian/symmake.cpp               |  37 +-
 qmake/generators/symbian/symmake.h                 |   5 +-
 qmake/generators/symbian/symmake_abld.cpp          |  10 +-
 qmake/generators/symbian/symmake_sbsv2.cpp         |  13 +-
 src/s60installs/s60installs.pro                    |   8 +-
 tools/linguist/lupdate/main.cpp                    |   4 +
 20 files changed, 638 insertions(+), 261 deletions(-)
 create mode 100644 mkspecs/common/symbian/appCaptionForTranslation.cpp
 create mode 100644 mkspecs/common/symbian/packageNameForTranslation.cpp
 create mode 100644 mkspecs/features/symbian/localize_deployment.prf

diff --git a/demos/symbianpkgrules.pri b/demos/symbianpkgrules.pri
index c9cc492..ef6dfd8 100644
--- a/demos/symbianpkgrules.pri
+++ b/demos/symbianpkgrules.pri
@@ -2,12 +2,13 @@
 
 RSS_RULES ="group_name=\"QtDemos\";"
 
+nokiaVendor = "Nokia, Qt"
 vendorinfo = \
     "; Localised Vendor name" \
-    "%{\"Nokia, Qt\"}" \
+    "%{$$addLanguageDependentPkgItem(nokiaVendor)}" \
     " " \
     "; Unique Vendor name" \
-    ":\"Nokia, Qt\"" \
+    ":\"$$nokiaVendor\"" \
     " "
 
 demos_deployment.pkg_prerules += vendorinfo
diff --git a/doc/src/development/qmake-manual.qdoc b/doc/src/development/qmake-manual.qdoc
index 6531d25..c0ed940 100644
--- a/doc/src/development/qmake-manual.qdoc
+++ b/doc/src/development/qmake-manual.qdoc
@@ -1294,6 +1294,14 @@
          test sections in generated bld.inf instead of their regular sections.
          Note that this only affects automatically generated bld.inf content;
          the content added via \c BLD_INF_RULES variable is not affected.
+    \row \o localize_deployment \o Makes \c lupdate tool add fields for
+         application captions and package file names into generated \c{.ts}
+         files. Qmake generates properly localized \c{.loc} and \c{.pkg} files
+         based on available translations. Translation file name bodies must
+         end with underscore and the language code for deployment localization
+         to work. E.g. \c{myapp_en.ts}.
+         \bold{Note:} All languages supported by Qt are not supported by Symbian,
+         so some \c{.ts} files may be ignored by qmake.
     \endtable
 
     These options have an effect on Linux/Unix platforms:
diff --git a/examples/symbianpkgrules.pri b/examples/symbianpkgrules.pri
index 0f615c7..fe9b487 100644
--- a/examples/symbianpkgrules.pri
+++ b/examples/symbianpkgrules.pri
@@ -2,12 +2,13 @@
 
 RSS_RULES ="group_name=\"QtExamples\";"
 
+nokiaVendor = "Nokia, Qt"
 vendorinfo = \
     "; Localised Vendor name" \
-    "%{\"Nokia, Qt\"}" \
+    "%{$$addLanguageDependentPkgItem(nokiaVendor)}" \
     " " \
     "; Unique Vendor name" \
-    ":\"Nokia, Qt\"" \
+    ":\"$$nokiaVendor\"" \
     " "
 
 examples_deployment.pkg_prerules += vendorinfo
diff --git a/mkspecs/common/symbian/appCaptionForTranslation.cpp b/mkspecs/common/symbian/appCaptionForTranslation.cpp
new file mode 100644
index 0000000..c295147
--- /dev/null
+++ b/mkspecs/common/symbian/appCaptionForTranslation.cpp
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** 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 qmake spec 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$
+**
+****************************************************************************/
+
+//: Application short caption, currently only relevant for application projects in Symbian.
+QT_TRANSLATE_NOOP("QtApplicationCaptions", "Application short caption")
+
+//: Application long caption, currently only relevant for application projects in Symbian.
+QT_TRANSLATE_NOOP("QtApplicationCaptions", "Application long caption")
diff --git a/mkspecs/common/symbian/packageNameForTranslation.cpp b/mkspecs/common/symbian/packageNameForTranslation.cpp
new file mode 100644
index 0000000..bc4a7f4
--- /dev/null
+++ b/mkspecs/common/symbian/packageNameForTranslation.cpp
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** 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 qmake spec 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$
+**
+****************************************************************************/
+
+//: Installation package name, currently only relevant for Symbian projects that deploy something.
+QT_TRANSLATE_NOOP("QtPackageNames", "Package name")
+
+//: Smart installer installation package name, currently only relevant for Symbian projects that
+//: deploy something.
+QT_TRANSLATE_NOOP("QtPackageNames", "Smart installer package name")
diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf
index 69188a8..f8586b0 100644
--- a/mkspecs/common/symbian/symbian.conf
+++ b/mkspecs/common/symbian/symbian.conf
@@ -130,6 +130,17 @@ QMAKE_LIBS_QT_ENTRY     = -lqtmain$${QT_LIBINFIX}.lib
 QMAKE_LIBS_NO_QT_ENTRY  = -llibcrt0.lib
 QMAKE_LIBS_NO_QT_ENTRY_GCCE  = -llibcrt0_gcce.lib
 
+# List of languages that have a Symbian language code mapping provided in localize_deployment.prf
+SYMBIAN_SUPPORTED_LANGUAGES = \
+    af sq am ar hy bn bg my be ca \
+    hr cs da nl en et fi fr gd ka \
+    de el gu he hi hu is id ga it \
+    ja kn kk ko lo lv lt mk ms ml \
+    mr mo mn nb pl pt pa ro ru sr \
+    si sk sl so es sw sv tl ta te \
+    th bo ti tr tk uk ur vi cy zu \
+    nn
+
 # These directories must match what configure uses for QT_INSTALL_PLUGINS and QT_INSTALL_IMPORTS
 QT_PLUGINS_BASE_DIR = /resource/qt$${QT_LIBINFIX}/plugins
 QT_IMPORTS_BASE_DIR = /resource/qt/imports
@@ -194,17 +205,6 @@ isEmpty(S60_VERSION) {
 # multiple language compatible dependency statements him/herself.
 
 default_deployment.pkg_prerules += pkg_depends_webkit pkg_depends_qt pkg_platform_dependencies
-
-# Supports S60 3.1, 3.2, 5.0, Symbian^3, and Symbian^4 by default
-pkg_platform_dependencies = \
-    "; Default HW/platform dependencies" \
-    "[0x102032BE],0,0,0,{\"S60ProductID\"}" \
-    "[0x102752AE],0,0,0,{\"S60ProductID\"}" \
-    "[0x1028315F],0,0,0,{\"S60ProductID\"}" \
-    "[0x20022E6D],0,0,0,{\"S60ProductID\"}" \
-    "[0x20032DE7],0,0,0,{\"S60ProductID\"}" \
-    " "
-
 DEPLOYMENT += default_deployment default_bin_deployment default_resource_deployment default_reg_deployment
 
 defineReplace(symbianRemoveSpecialCharacters) {
@@ -225,3 +225,44 @@ defineReplace(symbianRemoveSpecialCharacters) {
     return ($$fixedStr)
 }
 
+# Determines translations that are Symbian supported
+defineTest(matchSymbianLanguages) {
+    SYMBIAN_MATCHED_LANGUAGES =
+    SYMBIAN_MATCHED_TRANSLATIONS =
+
+    # Cannot parse .ts file for language here, so detect it from filename.
+    # Allow two and three character language and country codes.
+    for(translation, TRANSLATIONS) {
+        language = $$replace(translation, "^(.*/)?[^/]+_(([^_]{2,3}_)?[^_]{2,3})\\.ts$", \\2)
+        contains(SYMBIAN_SUPPORTED_LANGUAGES, $$language) {
+            SYMBIAN_MATCHED_LANGUAGES += $$language
+            SYMBIAN_MATCHED_TRANSLATIONS += $$translation
+        }
+    }
+
+    isEmpty(SYMBIAN_MATCHED_LANGUAGES): SYMBIAN_MATCHED_LANGUAGES = en
+
+    export(SYMBIAN_MATCHED_LANGUAGES)
+    export(SYMBIAN_MATCHED_TRANSLATIONS)
+}
+
+# Symbian pkg files that define multiple languages require a language specific string to be
+# defined for various items, even though the string often needs to be same for all languages.
+# This replacement method will generate correct string for such cases based on TRANSLATIONS
+# variable.
+defineReplace(addLanguageDependentPkgItem) {
+    localize_deployment:!isEmpty(TRANSLATIONS):isEmpty(SYMBIAN_MATCHED_LANGUAGES) {
+        matchSymbianLanguages()
+    }
+
+    pkgItem = $$eval($$1)
+    pkgLanguageList =
+
+    for(dummyItem, SYMBIAN_MATCHED_LANGUAGES) {
+        pkgLanguageList += "\"$$pkgItem\""
+    }
+
+    isEmpty(pkgLanguageList): pkgLanguageList = "\"$$pkgItem\""
+
+    return($$join(pkgLanguageList,",",,))
+}
diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf
index 09c6587..9fb9f10 100644
--- a/mkspecs/features/default_post.prf
+++ b/mkspecs/features/default_post.prf
@@ -110,3 +110,13 @@ QMAKE_LIBDIR += $$QMAKE_LIBDIR_POST
     }
     QMAKE_EXTRA_TARGETS += check
 }
+
+# Add special translation sources for projects that require them.
+# Note 1: Since lupdate will not parse regular config scopes right, contains checks are used instead.
+# Note 2: Checking for last value of TEMPLATE is used instead of simple contains check because
+#         lupdate doesn't respect "-=" variable assignments and therefore always finds "app"
+#         as the first value of TEMPLATE variable.
+contains(CONFIG, lupdate_run):contains(CONFIG, localize_deployment) {
+    equals($$list($$last(TEMPLATE)), app): SOURCES += $$[QT_INSTALL_DATA]/mkspecs/common/symbian/appCaptionForTranslation.cpp
+    SOURCES += $$[QT_INSTALL_DATA]/mkspecs/common/symbian/packageNameForTranslation.cpp
+}
diff --git a/mkspecs/features/symbian/default_post.prf b/mkspecs/features/symbian/default_post.prf
index d9ff03d..ec6ecd0 100644
--- a/mkspecs/features/symbian/default_post.prf
+++ b/mkspecs/features/symbian/default_post.prf
@@ -52,3 +52,15 @@ isEmpty(TARGET.UID2) {
         }
     }
 }
+
+# Supports S60 3.1, 3.2, 5.0, Symbian^3, and Symbian^4 by default
+platform_product_id = S60ProductID
+platform_product_id = $$addLanguageDependentPkgItem(platform_product_id)
+pkg_platform_dependencies = \
+    "; Default HW/platform dependencies" \
+    "[0x102032BE],0,0,0,{$$platform_product_id}" \
+    "[0x102752AE],0,0,0,{$$platform_product_id}" \
+    "[0x1028315F],0,0,0,{$$platform_product_id}" \
+    "[0x20022E6D],0,0,0,{$$platform_product_id}" \
+    "[0x20032DE7],0,0,0,{$$platform_product_id}" \
+    " "
diff --git a/mkspecs/features/symbian/localize_deployment.prf b/mkspecs/features/symbian/localize_deployment.prf
new file mode 100644
index 0000000..5f52dbc
--- /dev/null
+++ b/mkspecs/features/symbian/localize_deployment.prf
@@ -0,0 +1,82 @@
+SYMBIAN_LANG.af = 34            #Afrikaans
+SYMBIAN_LANG.sq = 35            #Albanian
+SYMBIAN_LANG.am = 36            #Amharic
+SYMBIAN_LANG.ar = 37            #Arabic
+SYMBIAN_LANG.hy = 38            #Armenian
+SYMBIAN_LANG.bn = 41            #Bengali
+SYMBIAN_LANG.bg = 42            #Bulgarian
+SYMBIAN_LANG.my = 43            #Burmese
+SYMBIAN_LANG.be = 40            #Byelorussian
+SYMBIAN_LANG.ca = 44            #Catalan
+SYMBIAN_LANG.hr = 45            #Croatian
+SYMBIAN_LANG.cs = 25            #Czech
+SYMBIAN_LANG.da = 07            #Danish
+SYMBIAN_LANG.nl = 18            #Dutch
+SYMBIAN_LANG.en = 01            #English(UK)
+SYMBIAN_LANG.et = 49            #Estonian
+SYMBIAN_LANG.fi = 09            #Finnish
+SYMBIAN_LANG.fr = 02            #French
+SYMBIAN_LANG.gd = 52            #Gaelic
+SYMBIAN_LANG.ka = 53            #Georgian
+SYMBIAN_LANG.de = 03            #German
+SYMBIAN_LANG.el = 54            #Greek
+SYMBIAN_LANG.gu = 56            #Gujarati
+SYMBIAN_LANG.he = 57            #Hebrew
+SYMBIAN_LANG.hi = 58            #Hindi
+SYMBIAN_LANG.hu = 17            #Hungarian
+SYMBIAN_LANG.is = 15            #Icelandic
+SYMBIAN_LANG.id = 59            #Indonesian
+SYMBIAN_LANG.ga = 60            #Irish
+SYMBIAN_LANG.it = 05            #Italian
+SYMBIAN_LANG.ja = 32            #Japanese
+SYMBIAN_LANG.kn = 62            #Kannada
+SYMBIAN_LANG.kk = 63            #Kazakh
+SYMBIAN_LANG.ko = 65            #Korean
+SYMBIAN_LANG.lo = 66            #Laothian
+SYMBIAN_LANG.lv = 67            #Latvian
+SYMBIAN_LANG.lt = 68            #Lithuanian
+SYMBIAN_LANG.mk = 69            #Macedonian
+SYMBIAN_LANG.ms = 70            #Malay
+SYMBIAN_LANG.ml = 71            #Malayalam
+SYMBIAN_LANG.mr = 72            #Marathi
+SYMBIAN_LANG.mo = 73            #Moldavian
+SYMBIAN_LANG.mn = 74            #Mongolian
+SYMBIAN_LANG.nb = 08            #Norwegian
+SYMBIAN_LANG.pl = 27            #Polish
+SYMBIAN_LANG.pt = 13            #Portuguese
+SYMBIAN_LANG.pa = 77            #Punjabi
+SYMBIAN_LANG.ro = 78            #Romanian
+SYMBIAN_LANG.ru = 16            #Russian
+SYMBIAN_LANG.sr = 79            #Serbian
+SYMBIAN_LANG.si = 80            #Singhalese
+SYMBIAN_LANG.sk = 26            #Slovak
+SYMBIAN_LANG.sl = 28            #Slovenian
+SYMBIAN_LANG.so = 81            #Somali
+SYMBIAN_LANG.es = 04            #Spanish
+SYMBIAN_LANG.sw = 84            #Swahili
+SYMBIAN_LANG.sv = 06            #Swedish
+SYMBIAN_LANG.tl = 39            #Tagalog
+SYMBIAN_LANG.ta = 87            #Tamil
+SYMBIAN_LANG.te = 88            #Telugu
+SYMBIAN_LANG.th = 33            #Thai
+SYMBIAN_LANG.bo = 89            #Tibetan
+SYMBIAN_LANG.ti = 90            #Tigrinya
+SYMBIAN_LANG.tr = 14            #Turkish
+SYMBIAN_LANG.tk = 92            #Turkmen
+SYMBIAN_LANG.uk = 93            #Ukrainian
+SYMBIAN_LANG.ur = 94            #Urdu
+SYMBIAN_LANG.vi = 96            #Vietnamese
+SYMBIAN_LANG.cy = 97            #Welsh
+SYMBIAN_LANG.zu = 98            #Zulu
+SYMBIAN_LANG.nn = 75            #Nynorsk
+
+isEmpty(SYMBIAN_MATCHED_LANGUAGES) {
+    matchSymbianLanguages()
+}
+
+!isEmpty(SYMBIAN_MATCHED_TRANSLATIONS) {
+    # Generate dependencies to .ts files for pkg files
+    template_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+    installer_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+    stub_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+}
diff --git a/mkspecs/features/symbian/qt.prf b/mkspecs/features/symbian/qt.prf
index b5d3d98..c8f97aa 100644
--- a/mkspecs/features/symbian/qt.prf
+++ b/mkspecs/features/symbian/qt.prf
@@ -25,9 +25,10 @@ INCLUDEPATH = $$PREPEND_INCLUDEPATH $$INCLUDEPATH
 # Note: Qt libs package with full capabilities has UID3 of 0x2001E61C,
 #       while self-signed version typically has temporary UID3 of 0xE001E61C.
 contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C):isEmpty(QT_LIBINFIX) {
+    qt_pkg_name = Qt
     pkg_depends_qt += \
         "; Default dependency to Qt libraries" \
-        "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION},  {\"Qt\"}"
+        "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(qt_pkg_name)}"
 
     # Projects linking to webkit need dependency to webkit
     contains(QT, webkit): {
@@ -38,9 +39,10 @@ contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0
             QT_WEBKIT_PATCH_VERSION = $${QT_PATCH_VERSION}
         }
 
+        webkit_pkg_name = QtWebKit
         pkg_depends_webkit += \
             "; Dependency to Qt Webkit" \
-            "(0x200267C2), $${QT_WEBKIT_MAJOR_VERSION}, $${QT_WEBKIT_MINOR_VERSION}, $${QT_WEBKIT_PATCH_VERSION},  {\"QtWebKit\"}"
+            "(0x200267C2), $${QT_WEBKIT_MAJOR_VERSION}, $${QT_WEBKIT_MINOR_VERSION}, $${QT_WEBKIT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(webkit_pkg_name)}"
     } else {
         default_deployment.pkg_prerules -= pkg_depends_webkit
     }
diff --git a/mkspecs/features/symbian/sis_targets.prf b/mkspecs/features/symbian/sis_targets.prf
index e838e10..ad81803 100644
--- a/mkspecs/features/symbian/sis_targets.prf
+++ b/mkspecs/features/symbian/sis_targets.prf
@@ -12,6 +12,17 @@ else:!equals(DEPLOYMENT, default_deployment) {
 equals(GENERATE_SIS_TARGETS, true) {
 
     baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
+    template_pkg_target.target = $${baseTarget}_template.pkg
+    template_pkg_target.depends += $$_PRO_FILE_
+    template_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+    installer_pkg_target.target = $${baseTarget}_installer.pkg
+    installer_pkg_target.depends += $$_PRO_FILE_
+    installer_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+    stub_pkg_target.target = $${baseTarget}_stub.pkg
+    stub_pkg_target.depends += $$_PRO_FILE_
+    stub_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+    QMAKE_EXTRA_TARGETS += template_pkg_target installer_pkg_target stub_pkg_target
+
 
     symbian-abld|symbian-sbsv2 {
         symbian-sbsv2 {
@@ -35,6 +46,7 @@ equals(GENERATE_SIS_TARGETS, true) {
                               , \
                                   $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
                               )
+        sis_target.depends += $${baseTarget}_template.pkg
 
         ok_sis_target.target = ok_sis
         ok_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
@@ -54,6 +66,7 @@ equals(GENERATE_SIS_TARGETS, true) {
                               , \
                                   $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
                               )
+        unsigned_sis_target.depends += $${baseTarget}_template.pkg
 
         ok_unsigned_sis_target.target = ok_unsigned_sis
         ok_unsigned_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET)
@@ -67,7 +80,7 @@ equals(GENERATE_SIS_TARGETS, true) {
                                         , \
                                             $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
                                         )
-        installer_sis_target.depends = sis
+        installer_sis_target.depends = $${baseTarget}_installer.pkg sis
 
         ok_installer_sis_target.target = ok_installer_sis
         ok_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
@@ -79,7 +92,7 @@ equals(GENERATE_SIS_TARGETS, true) {
                                         , \
                                             $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
                                         )
-        unsigned_installer_sis_target.depends = unsigned_sis
+        unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
 
         ok_unsigned_installer_sis_target.target = ok_unsigned_installer_sis
         ok_unsigned_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
@@ -104,6 +117,7 @@ equals(GENERATE_SIS_TARGETS, true) {
                                    , \
                                        $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
                                    )
+        stub_sis_target.depends += $${baseTarget}_stub.pkg
 
         ok_stub_sis_target.target = ok_stub_sis
         ok_stub_sis_target.commands = createpackage -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \
@@ -154,11 +168,11 @@ equals(GENERATE_SIS_TARGETS, true) {
         sis_target.target = sis
         sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
                                   - $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
-        sis_target.depends = first
+        sis_target.depends = first $${baseTarget}_template.pkg
 
         unsigned_sis_target.target = unsigned_sis
         unsigned_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg
-        unsigned_sis_target.depends = first
+        unsigned_sis_target.depends = first $${baseTarget}_template.pkg
 
         target_sis_target.target = $${sis_destdir}/$${baseTarget}.sis
         target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
@@ -166,11 +180,11 @@ equals(GENERATE_SIS_TARGETS, true) {
         installer_sis_target.target = installer_sis
         installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
                                             $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
-        installer_sis_target.depends = sis
+        installer_sis_target.depends = $${baseTarget}_installer.pkg sis
 
         unsigned_installer_sis_target.target = unsigned_installer_sis
         unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
-        unsigned_installer_sis_target.depends = unsigned_sis
+        unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
 
         !isEmpty(sis_destdir):!equals(sis_destdir, "."):!equals(sis_destdir, "./") {
             sis_target.commands += && $$QMAKE_MOVE $${baseTarget}.sis $$sis_destdir
diff --git a/qmake/generators/symbian/symbian_makefile.h b/qmake/generators/symbian/symbian_makefile.h
index 94f0145..28a6206 100644
--- a/qmake/generators/symbian/symbian_makefile.h
+++ b/qmake/generators/symbian/symbian_makefile.h
@@ -79,18 +79,18 @@ public:
             }
         }
 
+        SymbianLocalizationList symbianLocalizationList;
+        parseTsFiles(&symbianLocalizationList);
+
         if (generatePkg) {
-            generatePkgFile(iconFile, false);
+            generatePkgFile(iconFile, false, symbianLocalizationList);
         }
 
-        // Get the application translations and convert to symbian OS lang code, i.e. decical number
-        QStringList symbianLangCodes = symbianLangCodesFromTsFiles();
-
         if (targetType == TypeExe) {
             if (!this->project->values("CONFIG").contains("no_icon", Qt::CaseInsensitive)) {
                 writeRegRssFile(userRssRules);
                 writeRssFile(numberOfIcons, iconFile);
-                writeLocFile(symbianLangCodes);
+                writeLocFile(symbianLocalizationList);
             }
         }
 
diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 9d4f27e..2244a98 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -41,6 +41,7 @@
 
 #include "symbiancommon.h"
 #include <qdebug.h>
+#include <qxmlstream.h>
 
 // Included from tools/shared
 #include <symbian/epocroot.h>
@@ -151,7 +152,9 @@ QString romPath(const QString& path)
     return QLatin1String("z:") + path;
 }
 
-void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocBuild)
+void SymbianCommonGenerator::generatePkgFile(const QString &iconFile,
+                                             bool epocBuild,
+                                             const SymbianLocalizationList &symbianLocalizationList)
 {
     QMakeProject *project = generator->project;
     QString pkgFilename = Option::output_dir + QLatin1Char('/') +
@@ -270,8 +273,17 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocB
 
     // Apply some defaults if specific data does not exist in PKG pre-rules
     if (languageRules.isEmpty()) {
-        // language, (*** hardcoded to english atm, should be parsed from TRANSLATIONS)
-        languageRules << "; Language\n&EN\n\n";
+        if (symbianLocalizationList.isEmpty()) {
+            languageRules << "; Language\n&EN\n\n";
+        } else {
+            QStringList langCodes;
+            SymbianLocalizationListIterator iter(symbianLocalizationList);
+            while (iter.hasNext()) {
+                const SymbianLocalization &loc = iter.next();
+                langCodes << loc.symbianLanguageCode;
+            }
+            languageRules << QString("; Languages\n&%1\n\n").arg(langCodes.join(","));
+        }
     } else if (headerRules.isEmpty()) {
         // In case user defines langs, he must take care also about SIS header
         fprintf(stderr, "Warning: If language is defined with DEPLOYMENT pkg_prerules, also the SIS header must be defined\n");
@@ -320,12 +332,14 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocB
 
     // Package header
     QString sisHeader = "; SIS header: name, uid, version\n#{\"%1\"},(%2),%3\n\n";
-    QString visualTarget = project->values("DEPLOYMENT.display_name").join(" ");
-    if (visualTarget.isEmpty())
-        visualTarget = generator->escapeFilePath(project->first("TARGET"));
 
-    visualTarget = removePathSeparators(visualTarget);
-    QString wrapperTarget = visualTarget + " installer";
+    QString defaultVisualTarget = project->values("DEPLOYMENT.display_name").join(" ");
+    if (defaultVisualTarget.isEmpty())
+        defaultVisualTarget = generator->escapeFilePath(project->first("TARGET"));
+    defaultVisualTarget = removePathSeparators(defaultVisualTarget);
+
+    QString visualTarget = generatePkgNameForHeader(symbianLocalizationList, defaultVisualTarget, false);
+    QString wrapperTarget = generatePkgNameForHeader(symbianLocalizationList, defaultVisualTarget, true);
 
     if (installerSisHeader.startsWith("0x", Qt::CaseInsensitive)) {
         tw << sisHeader.arg(wrapperTarget).arg(installerSisHeader).arg(applicationVersion);
@@ -344,7 +358,13 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocB
 
     // Vendor name
     if (!containsStartWithItem('%', vendorRules)) {
-        vendorRules << "; Default localized vendor name\n%{\"Vendor\"}\n\n";
+        QString vendorStr = QLatin1String("\"Vendor\",");
+        QString locVendors = vendorStr;
+        for (int i = 1; i < symbianLocalizationList.size(); i++) {
+            locVendors.append(vendorStr);
+        }
+        locVendors.chop(1);
+        vendorRules << QString("; Default localized vendor name\n%{%1}\n\n").arg(locVendors);
     }
     if (!containsStartWithItem(':', vendorRules)) {
         vendorRules << "; Default unique vendor name\n:\"Vendor\"\n\n";
@@ -385,6 +405,13 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocB
         t << manufacturerStr << endl;
     }
 
+    // ### FIXME: remove epocBuild check once makefile based mkspecs support localized resource generation
+    if (epocBuild && symbianLocalizationList.size()) {
+        // Add localized resources to DEPLOYMENT if default resource deployment is done
+        addLocalizedResourcesToDeployment("default_resource_deployment.sources", symbianLocalizationList);
+        addLocalizedResourcesToDeployment("default_reg_deployment.sources", symbianLocalizationList);
+    }
+
     // deploy files specified by DEPLOYMENT variable
     QString remoteTestPath;
     QString zDir;
@@ -633,12 +660,9 @@ void SymbianCommonGenerator::writeRssFile(QString &numberOfIcons, QString &iconF
     }
 }
 
-void SymbianCommonGenerator::writeLocFile(QStringList &symbianLangCodes)
+void SymbianCommonGenerator::writeLocFile(const SymbianLocalizationList &symbianLocalizationList)
 {
-    QString filename(fixedTarget);
-    if (!Option::output_dir.isEmpty())
-        filename = Option::output_dir + '/' + filename;
-    filename.append(".loc");
+    QString filename = generateLocFileName();
     QFile ft(filename);
     if (ft.open(QIODevice::WriteOnly)) {
         generatedFiles << ft.fileName();
@@ -658,11 +682,22 @@ void SymbianCommonGenerator::writeLocFile(QStringList &symbianLangCodes)
         t << "#ifdef LANGUAGE_SC" << endl;
         t << "#define STRING_r_short_caption \"" << displayName  << "\"" << endl;
         t << "#define STRING_r_caption \"" << displayName  << "\"" << endl;
-        foreach(QString lang, symbianLangCodes) {
-            t << "#elif defined LANGUAGE_" << lang << endl;
-            t << "#define STRING_r_short_caption \"" << displayName  << "\"" << endl;
-            t << "#define STRING_r_caption \"" << displayName  << "\"" << endl;
+
+        SymbianLocalizationListIterator iter(symbianLocalizationList);
+        while (iter.hasNext()) {
+            const SymbianLocalization &loc = iter.next();
+            QString shortCaption = loc.shortCaption;
+            QString longCaption = loc.longCaption;
+            if (shortCaption.isEmpty())
+                shortCaption = displayName;
+            if (longCaption.isEmpty())
+                longCaption = displayName;
+
+            t << "#elif defined LANGUAGE_" << loc.symbianLanguageCode << endl;
+            t << "#define STRING_r_short_caption \"" << shortCaption << "\"" << endl;
+            t << "#define STRING_r_caption \"" << longCaption << "\"" << endl;
         }
+
         t << "#else" << endl;
         t << "#define STRING_r_short_caption \"" << displayName  << "\"" << endl;
         t << "#define STRING_r_caption \"" << displayName  << "\"" << endl;
@@ -803,195 +838,49 @@ void SymbianCommonGenerator::writeCustomDefFile()
     }
 }
 
-QStringList SymbianCommonGenerator::symbianLangCodesFromTsFiles()
+void SymbianCommonGenerator::parseTsFiles(SymbianLocalizationList *symbianLocalizationList)
 {
-    QStringList tsfiles;
-    QStringList symbianLangCodes;
-    tsfiles << generator->project->values("TRANSLATIONS");
+    if (!generator->project->isActiveConfig("localize_deployment")) {
+        return;
+    }
 
-    fillQt2S60LangMapTable();
+    QStringList symbianTsFiles;
 
-    foreach(QString file, tsfiles) {
-        int extIndex = file.lastIndexOf(".");
-        int langIndex = file.lastIndexOf("_", (extIndex - file.length()));
-        langIndex += 1;
-        QString qtlang = file.mid(langIndex, extIndex - langIndex);
-        QString s60lang = qt2S60LangMapTable.value(qtlang, QString("SC"));
+    symbianTsFiles << generator->project->values("SYMBIAN_MATCHED_TRANSLATIONS");
 
-        if (!symbianLangCodes.contains(s60lang) && s60lang != "SC")
-            symbianLangCodes += s60lang;
-    }
+    if (!symbianTsFiles.isEmpty()) {
+        fillQt2SymbianLocalizationList(symbianLocalizationList);
 
-    return symbianLangCodes;
+        QMutableListIterator<SymbianLocalization> iter(*symbianLocalizationList);
+        while (iter.hasNext()) {
+            SymbianLocalization &loc = iter.next();
+            static QString matchStrTemplate = QLatin1String(".*_%1\\.ts");
+            QString matchStr = matchStrTemplate.arg(loc.qtLanguageCode);
+
+            foreach (QString file, symbianTsFiles) {
+                QRegExp matcher(matchStr);
+                if (matcher.exactMatch(file) && parseTsContent(file, &loc))
+                    break;
+            }
+        }
+    }
 }
 
-void SymbianCommonGenerator::fillQt2S60LangMapTable()
+void SymbianCommonGenerator::fillQt2SymbianLocalizationList(SymbianLocalizationList *symbianLocalizationList)
 {
-    qt2S60LangMapTable.reserve(170); // 165 items at time of writing.
-    qt2S60LangMapTable.insert("ab", "SC");            //Abkhazian                     //
-    qt2S60LangMapTable.insert("om", "SC");            //Afan                          //
-    qt2S60LangMapTable.insert("aa", "SC");            //Afar                          //
-    qt2S60LangMapTable.insert("af", "34");            //Afrikaans                     //Afrikaans
-    qt2S60LangMapTable.insert("sq", "35");            //Albanian                      //Albanian
-    qt2S60LangMapTable.insert("am", "36");            //Amharic                       //Amharic
-    qt2S60LangMapTable.insert("ar", "37");            //Arabic                        //Arabic
-    qt2S60LangMapTable.insert("hy", "38");            //Armenian                      //Armenian
-    qt2S60LangMapTable.insert("as", "SC");            //Assamese                      //
-    qt2S60LangMapTable.insert("ay", "SC");            //Aymara                        //
-    qt2S60LangMapTable.insert("az", "SC");            //Azerbaijani                   //
-    qt2S60LangMapTable.insert("ba", "SC");            //Bashkir                       //
-    qt2S60LangMapTable.insert("eu", "SC");            //Basque                        //
-    qt2S60LangMapTable.insert("bn", "41");            //Bengali                       //Bengali
-    qt2S60LangMapTable.insert("dz", "SC");            //Bhutani                       //
-    qt2S60LangMapTable.insert("bh", "SC");            //Bihari                        //
-    qt2S60LangMapTable.insert("bi", "SC");            //Bislama                       //
-    qt2S60LangMapTable.insert("br", "SC");            //Breton                        //
-    qt2S60LangMapTable.insert("bg", "42");            //Bulgarian                     //Bulgarian
-    qt2S60LangMapTable.insert("my", "43");            //Burmese                       //Burmese
-    qt2S60LangMapTable.insert("be", "40");            //Byelorussian                  //Belarussian
-    qt2S60LangMapTable.insert("km", "SC");            //Cambodian                     //
-    qt2S60LangMapTable.insert("ca", "44");            //Catalan                       //Catalan
-    qt2S60LangMapTable.insert("zh", "SC");            //Chinese                       //
-    qt2S60LangMapTable.insert("co", "SC");            //Corsican                      //
-    qt2S60LangMapTable.insert("hr", "45");            //Croatian                      //Croatian
-    qt2S60LangMapTable.insert("cs", "25");            //Czech                         //Czech
-    qt2S60LangMapTable.insert("da", "07");            //Danish                        //Danish
-    qt2S60LangMapTable.insert("nl", "18");            //Dutch                         //Dutch
-    qt2S60LangMapTable.insert("en", "01");            //English                       //English(UK)
-    qt2S60LangMapTable.insert("eo", "SC");            //Esperanto                     //
-    qt2S60LangMapTable.insert("et", "49");            //Estonian                      //Estonian
-    qt2S60LangMapTable.insert("fo", "SC");            //Faroese                       //
-    qt2S60LangMapTable.insert("fj", "SC");            //Fiji                          //
-    qt2S60LangMapTable.insert("fi", "09");            //Finnish                       //Finnish
-    qt2S60LangMapTable.insert("fr", "02");            //French                        //French
-    qt2S60LangMapTable.insert("fy", "SC");            //Frisian                       //
-    qt2S60LangMapTable.insert("gd", "52");            //Gaelic                        //Gaelic
-    qt2S60LangMapTable.insert("gl", "SC");            //Galician                      //
-    qt2S60LangMapTable.insert("ka", "53");            //Georgian                      //Georgian
-    qt2S60LangMapTable.insert("de", "03");            //German                        //German
-    qt2S60LangMapTable.insert("el", "54");            //Greek                         //Greek
-    qt2S60LangMapTable.insert("kl", "SC");            //Greenlandic                   //
-    qt2S60LangMapTable.insert("gn", "SC");            //Guarani                       //
-    qt2S60LangMapTable.insert("gu", "56");            //Gujarati                      //Gujarati
-    qt2S60LangMapTable.insert("ha", "SC");            //Hausa                         //
-    qt2S60LangMapTable.insert("he", "57");            //Hebrew                        //Hebrew
-    qt2S60LangMapTable.insert("hi", "58");            //Hindi                         //Hindi
-    qt2S60LangMapTable.insert("hu", "17");            //Hungarian                     //Hungarian
-    qt2S60LangMapTable.insert("is", "15");            //Icelandic                     //Icelandic
-    qt2S60LangMapTable.insert("id", "59");            //Indonesian                    //Indonesian
-    qt2S60LangMapTable.insert("ia", "SC");            //Interlingua                   //
-    qt2S60LangMapTable.insert("ie", "SC");            //Interlingue                   //
-    qt2S60LangMapTable.insert("iu", "SC");            //Inuktitut                     //
-    qt2S60LangMapTable.insert("ik", "SC");            //Inupiak                       //
-    qt2S60LangMapTable.insert("ga", "60");            //Irish                         //Irish
-    qt2S60LangMapTable.insert("it", "05");            //Italian                       //Italian
-    qt2S60LangMapTable.insert("ja", "32");            //Japanese                      //Japanese
-    qt2S60LangMapTable.insert("jv", "SC");            //Javanese                      //
-    qt2S60LangMapTable.insert("kn", "62");            //Kannada                       //Kannada
-    qt2S60LangMapTable.insert("ks", "SC");            //Kashmiri                      //
-    qt2S60LangMapTable.insert("kk", "63");            //Kazakh                        //Kazakh
-    qt2S60LangMapTable.insert("rw", "SC");            //Kinyarwanda                   //
-    qt2S60LangMapTable.insert("ky", "SC");            //Kirghiz                       //
-    qt2S60LangMapTable.insert("ko", "65");            //Korean                        //Korean
-    qt2S60LangMapTable.insert("ku", "SC");            //Kurdish                       //
-    qt2S60LangMapTable.insert("rn", "SC");            //Kurundi                       //
-    qt2S60LangMapTable.insert("lo", "66");            //Laothian                      //Laothian
-    qt2S60LangMapTable.insert("la", "SC");            //Latin                         //
-    qt2S60LangMapTable.insert("lv", "67");            //Latvian                       //Latvian
-    qt2S60LangMapTable.insert("ln", "SC");            //Lingala                       //
-    qt2S60LangMapTable.insert("lt", "68");            //Lithuanian                    //Lithuanian
-    qt2S60LangMapTable.insert("mk", "69");            //Macedonian                    //Macedonian
-    qt2S60LangMapTable.insert("mg", "SC");            //Malagasy                      //
-    qt2S60LangMapTable.insert("ms", "70");            //Malay                         //Malay
-    qt2S60LangMapTable.insert("ml", "71");            //Malayalam                     //Malayalam
-    qt2S60LangMapTable.insert("mt", "SC");            //Maltese                       //
-    qt2S60LangMapTable.insert("mi", "SC");            //Maori                         //
-    qt2S60LangMapTable.insert("mr", "72");            //Marathi                       //Marathi
-    qt2S60LangMapTable.insert("mo", "73");            //Moldavian                     //Moldovian
-    qt2S60LangMapTable.insert("mn", "74");            //Mongolian                     //Mongolian
-    qt2S60LangMapTable.insert("na", "SC");            //Nauru                         //
-    qt2S60LangMapTable.insert("ne", "SC");            //Nepali                        //
-    qt2S60LangMapTable.insert("nb", "08");            //Norwegian                     //Norwegian
-    qt2S60LangMapTable.insert("oc", "SC");            //Occitan                       //
-    qt2S60LangMapTable.insert("or", "SC");            //Oriya                         //
-    qt2S60LangMapTable.insert("ps", "SC");            //Pashto                        //
-    qt2S60LangMapTable.insert("fa", "SC");            //Persian                       //
-    qt2S60LangMapTable.insert("pl", "27");            //Polish                        //Polish
-    qt2S60LangMapTable.insert("pt", "13");            //Portuguese                    //Portuguese
-    qt2S60LangMapTable.insert("pa", "77");            //Punjabi                       //Punjabi
-    qt2S60LangMapTable.insert("qu", "SC");            //Quechua                       //
-    qt2S60LangMapTable.insert("rm", "SC");            //RhaetoRomance                 //
-    qt2S60LangMapTable.insert("ro", "78");            //Romanian                      //Romanian
-    qt2S60LangMapTable.insert("ru", "16");            //Russian                       //Russian
-    qt2S60LangMapTable.insert("sm", "SC");            //Samoan                        //
-    qt2S60LangMapTable.insert("sg", "SC");            //Sangho                        //
-    qt2S60LangMapTable.insert("sa", "SC");            //Sanskrit                      //
-    qt2S60LangMapTable.insert("sr", "79");            //Serbian                       //Serbian
-    qt2S60LangMapTable.insert("sh", "SC");            //SerboCroatian                 //
-    qt2S60LangMapTable.insert("st", "SC");            //Sesotho                       //
-    qt2S60LangMapTable.insert("tn", "SC");            //Setswana                      //
-    qt2S60LangMapTable.insert("sn", "SC");            //Shona                         //
-    qt2S60LangMapTable.insert("sd", "SC");            //Sindhi                        //
-    qt2S60LangMapTable.insert("si", "80");            //Singhalese                    //Sinhalese
-    qt2S60LangMapTable.insert("ss", "SC");            //Siswati                       //
-    qt2S60LangMapTable.insert("sk", "26");            //Slovak                        //Slovak
-    qt2S60LangMapTable.insert("sl", "28");            //Slovenian                     //Slovenian
-    qt2S60LangMapTable.insert("so", "81");            //Somali                        //Somali
-    qt2S60LangMapTable.insert("es", "04");            //Spanish                       //Spanish
-    qt2S60LangMapTable.insert("su", "SC");            //Sundanese                     //
-    qt2S60LangMapTable.insert("sw", "84");            //Swahili                       //Swahili
-    qt2S60LangMapTable.insert("sv", "06");            //Swedish                       //Swedish
-    qt2S60LangMapTable.insert("tl", "39");            //Tagalog                       //Tagalog
-    qt2S60LangMapTable.insert("tg", "SC");            //Tajik                         //
-    qt2S60LangMapTable.insert("ta", "87");            //Tamil                         //Tamil
-    qt2S60LangMapTable.insert("tt", "SC");            //Tatar                         //
-    qt2S60LangMapTable.insert("te", "88");            //Telugu                        //Telugu
-    qt2S60LangMapTable.insert("th", "33");            //Thai                          //Thai
-    qt2S60LangMapTable.insert("bo", "89");            //Tibetan                       //Tibetan
-    qt2S60LangMapTable.insert("ti", "90");            //Tigrinya                      //Tigrinya
-    qt2S60LangMapTable.insert("to", "SC");            //Tonga                         //
-    qt2S60LangMapTable.insert("ts", "SC");            //Tsonga                        //
-    qt2S60LangMapTable.insert("tr", "14");            //Turkish                       //Turkish
-    qt2S60LangMapTable.insert("tk", "92");            //Turkmen                       //Turkmen
-    qt2S60LangMapTable.insert("tw", "SC");            //Twi                           //
-    qt2S60LangMapTable.insert("ug", "SC");            //Uigur                         //
-    qt2S60LangMapTable.insert("uk", "93");            //Ukrainian                     //Ukrainian
-    qt2S60LangMapTable.insert("ur", "94");            //Urdu                          //Urdu
-    qt2S60LangMapTable.insert("uz", "SC");            //Uzbek                         //
-    qt2S60LangMapTable.insert("vi", "96");            //Vietnamese                    //Vietnamese
-    qt2S60LangMapTable.insert("vo", "SC");            //Volapuk                       //
-    qt2S60LangMapTable.insert("cy", "97");            //Welsh                         //Welsh
-    qt2S60LangMapTable.insert("wo", "SC");            //Wolof                         //
-    qt2S60LangMapTable.insert("xh", "SC");            //Xhosa                         //
-    qt2S60LangMapTable.insert("yi", "SC");            //Yiddish                       //
-    qt2S60LangMapTable.insert("yo", "SC");            //Yoruba                        //
-    qt2S60LangMapTable.insert("za", "SC");            //Zhuang                        //
-    qt2S60LangMapTable.insert("zu", "98");            //Zulu                          //Zulu
-    qt2S60LangMapTable.insert("nn", "75");            //Nynorsk                       //NorwegianNynorsk
-    qt2S60LangMapTable.insert("bs", "SC");            //Bosnian                       //
-    qt2S60LangMapTable.insert("dv", "SC");            //Divehi                        //
-    qt2S60LangMapTable.insert("gv", "SC");            //Manx                          //
-    qt2S60LangMapTable.insert("kw", "SC");            //Cornish                       //
-    qt2S60LangMapTable.insert("ak", "SC");            //Akan                          //
-    qt2S60LangMapTable.insert("kok", "SC");           //Konkani                       //
-    qt2S60LangMapTable.insert("gaa", "SC");           //Ga                            //
-    qt2S60LangMapTable.insert("ig", "SC");            //Igbo                          //
-    qt2S60LangMapTable.insert("kam", "SC");           //Kamba                         //
-    qt2S60LangMapTable.insert("syr", "SC");           //Syriac                        //
-    qt2S60LangMapTable.insert("byn", "SC");           //Blin                          //
-    qt2S60LangMapTable.insert("gez", "SC");           //Geez                          //
-    qt2S60LangMapTable.insert("kfo", "SC");           //Koro                          //
-    qt2S60LangMapTable.insert("sid", "SC");           //Sidamo                        //
-    qt2S60LangMapTable.insert("cch", "SC");           //Atsam                         //
-    qt2S60LangMapTable.insert("tig", "SC");           //Tigre                         //
-    qt2S60LangMapTable.insert("kaj", "SC");           //Jju                           //
-    qt2S60LangMapTable.insert("fur", "SC");           //Friulian                      //
-    qt2S60LangMapTable.insert("ve", "SC");            //Venda                         //
-    qt2S60LangMapTable.insert("ee", "SC");            //Ewe                           //
-    qt2S60LangMapTable.insert("wa", "SC");            //Walamo                        //
-    qt2S60LangMapTable.insert("haw", "SC");           //Hawaiian                      //
-    qt2S60LangMapTable.insert("kcg", "SC");           //Tyap                          //
-    qt2S60LangMapTable.insert("ny", "SC");            //Chewa                         //
+    static QString symbianCodePrefix = QLatin1String("SYMBIAN_LANG.");
+
+    QStringList symbianLanguages = generator->project->values("SYMBIAN_MATCHED_LANGUAGES");
+
+    foreach (QString qtCode, symbianLanguages) {
+        SymbianLocalization newLoc;
+        QString symbianCodeVariable = symbianCodePrefix + qtCode;
+        newLoc.symbianLanguageCode = generator->project->first(symbianCodeVariable);
+        if (!newLoc.symbianLanguageCode.isEmpty()) {
+            newLoc.qtLanguageCode = qtCode;
+            symbianLocalizationList->append(newLoc);
+        }
+    }
 }
 
 void SymbianCommonGenerator::parsePreRules(const QString &deploymentVariable,
@@ -1057,3 +946,183 @@ void SymbianCommonGenerator::parsePostRules(const QString &deploymentVariable,
     }
 }
 
+bool SymbianCommonGenerator::parseTsContent(const QString &tsFilename, SymbianLocalization *loc)
+{
+    bool retval = true;
+    QMakeProject *project = generator->project;
+    QFile tsFile(tsFilename);
+
+    if (tsFile.exists()) {
+        if (tsFile.open(QIODevice::ReadOnly)) {
+            static QString applicationCaptionsContext = QLatin1String("QtApplicationCaptions");
+            static QString pkgNameContext = QLatin1String("QtPackageNames");
+            static QString tsElement = QLatin1String("TS");
+            static QString contextElement = QLatin1String("context");
+            static QString nameElement = QLatin1String("name");
+            static QString messageElement = QLatin1String("message");
+            static QString sourceElement = QLatin1String("source");
+            static QString translationElement = QLatin1String("translation");
+            static QString shortCaptionId = QLatin1String("Application short caption");
+            static QString longCaptionId = QLatin1String("Application long caption");
+            static QString pkgDisplayNameId = QLatin1String("Package name");
+            static QString installerPkgDisplayNameId = QLatin1String("Smart installer package name");
+            static QString languageAttribute = QLatin1String("language");
+            static QChar underscoreChar = QLatin1Char('_');
+
+            enum CurrentContext {
+                ContextUnknown,
+                ContextUninteresting,
+                ContextInteresting
+            };
+
+            QXmlStreamReader xml(&tsFile);
+
+            while (xml.name() != tsElement)
+                xml.readNextStartElement();
+
+            while (xml.readNextStartElement()) {
+                if (xml.name() == contextElement) {
+                    CurrentContext currentContext = ContextUnknown;
+                    while (xml.readNextStartElement()) {
+                        if (currentContext == ContextUnknown) {
+                            // Expect name element before message elements
+                            if (xml.name() == nameElement) {
+                                QString nameText = xml.readElementText();
+                                if (nameText == applicationCaptionsContext || nameText == pkgNameContext) {
+                                    currentContext = ContextInteresting;
+                                } else {
+                                    currentContext = ContextUninteresting;
+                                }
+                            } else {
+                                xml.skipCurrentElement();
+                            }
+                        } else if (currentContext == ContextInteresting) {
+                            if (xml.name() == messageElement) {
+                                QString source;
+                                QString translation;
+                                while (xml.readNextStartElement()) {
+                                    if (xml.name() == sourceElement) {
+                                        source = xml.readElementText();
+                                    } else if (xml.name() == translationElement) {
+                                        translation = xml.readElementText();
+                                    } else {
+                                        xml.skipCurrentElement();
+                                    }
+                                }
+
+                                if (source == shortCaptionId) {
+                                    if (loc->shortCaption.isEmpty()) {
+                                        loc->shortCaption = translation;
+                                    } else {
+                                        fprintf(stderr, "Warning: Duplicate application short caption defined in (%s).\n",
+                                                qPrintable(tsFilename));
+                                    }
+                                } else if (source == longCaptionId) {
+                                    if (loc->longCaption.isEmpty()) {
+                                        loc->longCaption = translation;
+                                    } else {
+                                        fprintf(stderr, "Warning: Duplicate application long caption defined in (%s).\n",
+                                                qPrintable(tsFilename));
+                                    }
+                                } else if (source == pkgDisplayNameId) {
+                                    if (loc->pkgDisplayName.isEmpty()) {
+                                        loc->pkgDisplayName = translation;
+                                    } else {
+                                        fprintf(stderr, "Warning: Duplicate package display name defined in (%s).\n",
+                                                qPrintable(tsFilename));
+                                    }
+                                } else if (source == installerPkgDisplayNameId) {
+                                    if (loc->installerPkgDisplayName.isEmpty()) {
+                                        loc->installerPkgDisplayName = translation;
+                                    } else {
+                                        fprintf(stderr, "Warning: Duplicate smart installer package display name defined in (%s).\n",
+                                                qPrintable(tsFilename));
+                                    }
+                                }
+                            } else {
+                                xml.skipCurrentElement();
+                            }
+                        } else {
+                            xml.skipCurrentElement();
+                        }
+                    }
+                } else {
+                    xml.skipCurrentElement();
+                }
+            }
+            if (xml.hasError()) {
+                retval = false;
+                fprintf(stderr, "ERROR: Encountered error \"%s\" when parsing ts file (%s).\n",
+                        qPrintable(xml.errorString()), qPrintable(tsFilename));
+            }
+        } else {
+            retval = false;
+            fprintf(stderr, "Warning: Could not open ts file (%s).\n", qPrintable(tsFilename));
+        }
+    } else {
+        retval = false;
+        fprintf(stderr, "Warning: ts file does not exist: (%s), unable to parse it.\n",
+                qPrintable(tsFilename));
+    }
+
+    return retval;
+}
+
+QString SymbianCommonGenerator::generatePkgNameForHeader(const SymbianLocalizationList &symbianLocalizationList,
+                                                         const QString &defaultName,
+                                                         bool isForSmartInstaller)
+{
+    QStringList allNames;
+    QString noTranslation = defaultName;
+
+    if (isForSmartInstaller)
+        noTranslation += QLatin1String(" installer");
+
+    SymbianLocalizationListIterator iter(symbianLocalizationList);
+    while (iter.hasNext()) {
+        const SymbianLocalization &loc = iter.next();
+        QString currentName;
+        if (isForSmartInstaller) {
+            currentName = loc.installerPkgDisplayName;
+        } else {
+            currentName = loc.pkgDisplayName;
+        }
+
+        if (currentName.isEmpty())
+            currentName = noTranslation;
+
+        allNames << currentName;
+    }
+
+    if (!allNames.size())
+        allNames << noTranslation;
+
+    return allNames.join("\",\"");
+
+}
+
+void SymbianCommonGenerator::addLocalizedResourcesToDeployment(const QString &deploymentFilesVar,
+                                                               const SymbianLocalizationList &symbianLocalizationList)
+{
+    QStringList locResources;
+    foreach (QString defaultResource, generator->project->values(deploymentFilesVar)) {
+        if (defaultResource.endsWith(".rsc")) {
+            defaultResource.chop(2);
+            SymbianLocalizationListIterator iter(symbianLocalizationList);
+            while (iter.hasNext()) {
+                const SymbianLocalization &loc = iter.next();
+                locResources << QString(defaultResource + loc.symbianLanguageCode);
+            }
+        }
+    }
+    generator->project->values(deploymentFilesVar) << locResources;
+}
+
+QString SymbianCommonGenerator::generateLocFileName()
+{
+    QString fileName(fixedTarget);
+    if (!Option::output_dir.isEmpty())
+        fileName = Option::output_dir + QLatin1Char('/') + fileName;
+    fileName.append(".loc");
+    return fileName;
+}
diff --git a/qmake/generators/symbian/symbiancommon.h b/qmake/generators/symbian/symbiancommon.h
index 80f2079..1db5890 100644
--- a/qmake/generators/symbian/symbiancommon.h
+++ b/qmake/generators/symbian/symbiancommon.h
@@ -48,6 +48,20 @@
 
 #define PRINT_FILE_CREATE_ERROR(filename) fprintf(stderr, "Error: Could not create '%s'\n", qPrintable(filename));
 
+class SymbianLocalization
+{
+public:
+    QString qtLanguageCode;
+    QString symbianLanguageCode;
+    QString shortCaption;
+    QString longCaption;
+    QString pkgDisplayName;
+    QString installerPkgDisplayName;
+};
+
+typedef QList<SymbianLocalization> SymbianLocalizationList;
+typedef QListIterator<SymbianLocalization> SymbianLocalizationListIterator;
+
 class SymbianCommonGenerator
 {
 public:
@@ -59,6 +73,7 @@ public:
         TypeSubdirs
     };
 
+
     SymbianCommonGenerator(MakefileGenerator *generator);
 
     virtual void init();
@@ -68,7 +83,9 @@ protected:
     QString removePathSeparators(QString &file);
     void removeSpecialCharacters(QString& str);
     void removeEpocSpecialCharacters(QString& str);
-    void generatePkgFile(const QString &iconFile, bool epocBuild);
+    void generatePkgFile(const QString &iconFile,
+                         bool epocBuild,
+                         const SymbianLocalizationList &symbianLocalizationList);
     bool containsStartWithItem(const QChar &c, const QStringList& src);
 
     void writeRegRssFile(QMap<QString, QStringList> &useritems);
@@ -76,15 +93,15 @@ protected:
                          const QString &listTag,
                          const QString &listItem);
     void writeRssFile(QString &numberOfIcons, QString &iconfile);
-    void writeLocFile(QStringList &symbianLangCodes);
+    void writeLocFile(const SymbianLocalizationList &symbianLocalizationList);
     void readRssRules(QString &numberOfIcons,
                       QString &iconFile,
                       QMap<QString, QStringList> &userRssRules);
 
     void writeCustomDefFile();
 
-    QStringList symbianLangCodesFromTsFiles();
-    void fillQt2S60LangMapTable();
+    void parseTsFiles(SymbianLocalizationList *symbianLocalizationList);
+    void fillQt2SymbianLocalizationList(SymbianLocalizationList *symbianLocalizationList);
 
     void parsePreRules(const QString &deploymentVariable,
                        const QString &variableSuffix,
@@ -95,7 +112,13 @@ protected:
     void parsePostRules(const QString &deploymentVariable,
                         const QString &variableSuffix,
                         QStringList *rawRuleList);
-
+    bool parseTsContent(const QString &tsFilename, SymbianLocalization *loc);
+    QString generatePkgNameForHeader(const SymbianLocalizationList &symbianLocalizationList,
+                                     const QString &defaultName,
+                                     bool isForSmartInstaller);
+    void addLocalizedResourcesToDeployment(const QString &deploymentFilesVar,
+                                           const SymbianLocalizationList &symbianLocalizationList);
+    QString generateLocFileName();
 
 protected:
     MakefileGenerator *generator;
@@ -106,8 +129,6 @@ protected:
     QString privateDirUid;
     QString uid3;
     TargetType targetType;
-
-    QHash<QString, QString> qt2S60LangMapTable;
 };
 
 #endif // SYMBIANCOMMON_H
diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp
index 0b0033a..e1426ab 100644
--- a/qmake/generators/symbian/symmake.cpp
+++ b/qmake/generators/symbian/symmake.cpp
@@ -187,8 +187,8 @@ bool SymbianMakefileGenerator::writeMakefile(QTextStream &t)
     QMap<QString, QStringList> userRssRules;
     readRssRules(numberOfIcons, iconFile, userRssRules);
 
-    // Get the application translations and convert to symbian OS lang code, i.e. decical number
-    QStringList symbianLangCodes = symbianLangCodesFromTsFiles();
+    SymbianLocalizationList symbianLocalizationList;
+    parseTsFiles(&symbianLocalizationList);
 
     // Generate pkg files if there are any actual files to deploy
     bool generatePkg = false;
@@ -205,7 +205,7 @@ bool SymbianMakefileGenerator::writeMakefile(QTextStream &t)
     }
 
     if (generatePkg) {
-        generatePkgFile(iconFile, true);
+        generatePkgFile(iconFile, true, symbianLocalizationList);
     }
 
     writeBldInfContent(t, generatePkg, iconFile);
@@ -242,13 +242,13 @@ bool SymbianMakefileGenerator::writeMakefile(QTextStream &t)
     writeMkFile(wrapperFileName, false);
 
     QString absoluteMmpFileName = Option::output_dir + QLatin1Char('/') + mmpFileName;
-    writeMmpFile(absoluteMmpFileName, symbianLangCodes);
+    writeMmpFile(absoluteMmpFileName, symbianLocalizationList);
 
     if (targetType == TypeExe) {
         if (!project->isActiveConfig("no_icon")) {
             writeRegRssFile(userRssRules);
             writeRssFile(numberOfIcons, iconFile);
-            writeLocFile(symbianLangCodes);
+            writeLocFile(symbianLocalizationList);
         }
     }
 
@@ -489,7 +489,7 @@ void SymbianMakefileGenerator::writeMmpFileHeader(QTextStream &t)
     t << "// ==============================================================================" << endl << endl;
 }
 
-void SymbianMakefileGenerator::writeMmpFile(QString &filename, QStringList &symbianLangCodes)
+void SymbianMakefileGenerator::writeMmpFile(QString &filename, const SymbianLocalizationList &symbianLocalizationList)
 {
     QFile ft(filename);
     if (ft.open(QIODevice::WriteOnly)) {
@@ -501,7 +501,7 @@ void SymbianMakefileGenerator::writeMmpFile(QString &filename, QStringList &symb
 
         writeMmpFileTargetPart(t);
 
-        writeMmpFileResourcePart(t, symbianLangCodes);
+        writeMmpFileResourcePart(t, symbianLocalizationList);
 
         writeMmpFileMacrosPart(t);
 
@@ -643,7 +643,7 @@ void SymbianMakefileGenerator::writeMmpFileTargetPart(QTextStream& t)
     Application registration resource files should be installed to the
     \private\10003a3f\import\apps directory.
 */
-void SymbianMakefileGenerator::writeMmpFileResourcePart(QTextStream& t, QStringList &symbianLangCodes)
+void SymbianMakefileGenerator::writeMmpFileResourcePart(QTextStream& t, const SymbianLocalizationList &symbianLocalizationList)
 {
     if ((targetType == TypeExe) &&
             !project->isActiveConfig("no_icon")) {
@@ -653,8 +653,10 @@ void SymbianMakefileGenerator::writeMmpFileResourcePart(QTextStream& t, QStringL
 
         t << "SOURCEPATH\t\t\t. " << endl;
         t << "LANG SC ";    // no endl
-        foreach(QString lang, symbianLangCodes) {
-            t << lang << " "; // no endl
+        SymbianLocalizationListIterator iter(symbianLocalizationList);
+        while (iter.hasNext()) {
+            const SymbianLocalization &loc = iter.next();
+            t << loc.symbianLanguageCode << " "; // no endl
         }
         t << endl;
         t << MMP_START_RESOURCE "\t\t" << locTarget << endl;
@@ -1108,3 +1110,18 @@ void SymbianMakefileGenerator::generateDistcleanTargets(QTextStream& t)
     t << "distclean: clean dodistclean" << endl;
     t << endl;
 }
+
+// Returns a string that can be used as a dependency to loc file on other targets
+QString SymbianMakefileGenerator::generateLocFileTarget(QTextStream& t, const QString& locCmd)
+{
+    QString locFile;
+    if (targetType == TypeExe && !project->isActiveConfig("no_icon")) {
+        locFile = Option::fixPathToLocalOS(generateLocFileName());
+        t << locFile << QLatin1String(": ") << project->values("SYMBIAN_MATCHED_TRANSLATIONS").join(" ") << endl;
+        t << locCmd << endl;
+        t << endl;
+        locFile += QLatin1Char(' ');
+    }
+
+    return locFile;
+}
\ No newline at end of file
diff --git a/qmake/generators/symbian/symmake.h b/qmake/generators/symbian/symmake.h
index a1a8e88..aba11de 100644
--- a/qmake/generators/symbian/symmake.h
+++ b/qmake/generators/symbian/symmake.h
@@ -97,11 +97,11 @@ protected:
     static bool removeDuplicatedStrings(QStringList& stringList);
 
     void writeMmpFileHeader(QTextStream &t);
-    void writeMmpFile(QString &filename, QStringList &symbianLangCodes);
+    void writeMmpFile(QString &filename, const SymbianLocalizationList &symbianLocalizationList);
     void writeMmpFileMacrosPart(QTextStream& t);
     void addMacro(QTextStream& t, const QString& value);
     void writeMmpFileTargetPart(QTextStream& t);
-    void writeMmpFileResourcePart(QTextStream& t, QStringList &symbianLangCodes);
+    void writeMmpFileResourcePart(QTextStream& t, const SymbianLocalizationList &symbianLocalizationList);
     void writeMmpFileSystemIncludePart(QTextStream& t);
     void writeMmpFileIncludePart(QTextStream& t);
     void writeMmpFileLibraryPart(QTextStream& t);
@@ -131,6 +131,7 @@ protected:
                                const QString& itemSuffix);
 
     void generateDistcleanTargets(QTextStream& t);
+    QString generateLocFileTarget(QTextStream& t, const QString& locCmd);
 
     // Subclass implements
     virtual void writeBldInfExtensionRulesPart(QTextStream& t, const QString &iconTargetFile) = 0;
diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp
index f895109..7059a52 100644
--- a/qmake/generators/symbian/symmake_abld.cpp
+++ b/qmake/generators/symbian/symmake_abld.cpp
@@ -267,12 +267,14 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
         t << "\tbldmake bldfiles" << endl;
         t << endl;
 
-        t << "debug: $(ABLD)" << endl;
+        QString locFileDep = generateLocFileTarget(t, qmakeCmd);
+
+        t << "debug: " << locFileDep << "$(ABLD)" << endl;
         foreach(QString item, debugPlatforms) {
             t << "\t$(ABLD)" << testClause << " build " << item << " udeb" << endl;
         }
         t << endl;
-        t << "release: $(ABLD)" << endl;
+        t << "release: " << locFileDep << "$(ABLD)" << endl;
         foreach(QString item, releasePlatforms) {
             t << "\t$(ABLD)" << testClause << " build " << item << " urel" << endl;
         }
@@ -280,12 +282,12 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
 
         // For more specific builds, targets are in this form: build-platform, e.g. release-armv5
         foreach(QString item, debugPlatforms) {
-            t << "debug-" << item << ": $(ABLD)" << endl;
+            t << "debug-" << item << ": " << locFileDep << "$(ABLD)" << endl;
             t << "\t$(ABLD)" << testClause << " build " << item << " udeb" << endl;
         }
 
         foreach(QString item, releasePlatforms) {
-            t << "release-" << item << ": $(ABLD)" << endl;
+            t << "release-" << item << ": " << locFileDep << "$(ABLD)" << endl;
             t << "\t$(ABLD)" << testClause << " build " << item << " urel" << endl;
         }
 
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index d650e08..b3f8ba2 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -386,8 +386,9 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
         t << endl;
 
         QString currentClause;
+        QString locFileDep = generateLocFileTarget(t, qmakeCmd);
 
-        t << "debug: " << BLD_INF_FILENAME << endl;
+        t << "debug: " << locFileDep << BLD_INF_FILENAME << endl;
         t << "\t$(SBS)";
         foreach(QString clause, debugClauses) {
             t << clause;
@@ -399,7 +400,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             t << clause;
         }
         t << endl;
-        t << "release: " << BLD_INF_FILENAME << endl;
+        t << "release: " << locFileDep << BLD_INF_FILENAME << endl;
         t << "\t$(SBS)";
         foreach(QString clause, releaseClauses) {
             t << clause;
@@ -431,7 +432,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             else // use generic arm clause
                 clause = configClause(item, debugBuild, defaultRvctCompilerVersion, genericArmClause);
 
-            t << "debug-" << item << ": " << BLD_INF_FILENAME << endl;
+            t << "debug-" << item << ": " << locFileDep << BLD_INF_FILENAME << endl;
             t << "\t$(SBS)" << clause << endl;
             t << "clean-debug-" << item << ": " << BLD_INF_FILENAME << endl;
             t << "\t$(SBS) reallyclean" << clause << endl;
@@ -444,7 +445,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             else // use generic arm clause
                 clause = configClause(item, releaseBuild, defaultRvctCompilerVersion, genericArmClause);
 
-            t << "release-" << item << ": " << BLD_INF_FILENAME << endl;
+            t << "release-" << item << ": " << locFileDep << BLD_INF_FILENAME << endl;
             t << "\t$(SBS)" << clause << endl;
             t << "clean-release-" << item << ": " << BLD_INF_FILENAME << endl;
             t << "\t$(SBS) reallyclean" << clause << endl;
@@ -454,11 +455,11 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             foreach(QString compilerVersion, allArmCompilerVersions) {
                 QString debugClause = configClause(item, debugBuild, compilerVersion, armClause);
                 QString releaseClause = configClause(item, releaseBuild, compilerVersion, armClause);
-                t << "debug-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
+                t << "debug-" << item << "-" << compilerVersion << ": " << locFileDep << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS)" << debugClause << endl;
                 t << "clean-debug-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS) reallyclean" << debugClause << endl;
-                t << "release-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
+                t << "release-" << item << "-" << compilerVersion << ": " << locFileDep << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS)" << releaseClause << endl;
                 t << "clean-release-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS) reallyclean" << releaseClause << endl;
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index 65b8781..a236028 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -191,11 +191,9 @@ symbian: {
         qtlibraries.sources += $$QMAKE_LIBDIR_QT/QtOpenVG$${QT_LIBINFIX}.dll
         graphicssystems_plugins.sources += $$QT_BUILD_TREE/plugins/graphicssystems/qvggraphicssystem$${QT_LIBINFIX}.dll
         # OpenVG requires Symbian^3 or later
-        pkg_platform_dependencies -= \
-            "[0x101F7961],0,0,0,{\"S60ProductID\"}" \
-            "[0x102032BE],0,0,0,{\"S60ProductID\"}" \
-            "[0x102752AE],0,0,0,{\"S60ProductID\"}" \
-            "[0x1028315F],0,0,0,{\"S60ProductID\"}"
+        pkg_platform_dependencies = \
+            "[0x20022E6D],0,0,0,{\"S60ProductID\"}" \
+            "[0x20032DE7],0,0,0,{\"S60ProductID\"}"
     }
 
     contains(QT_CONFIG, opengl) {
diff --git a/tools/linguist/lupdate/main.cpp b/tools/linguist/lupdate/main.cpp
index 49906e0..76a8756 100644
--- a/tools/linguist/lupdate/main.cpp
+++ b/tools/linguist/lupdate/main.cpp
@@ -350,6 +350,10 @@ static void processProjects(
         ProFileEvaluator visitor;
         visitor.setVerbose(options & Verbose);
 
+        QHash<QString, QStringList> lupdateConfig;
+        lupdateConfig.insert(QLatin1String("CONFIG"), QStringList(QLatin1String("lupdate_run")));
+        visitor.addVariables(lupdateConfig);
+
         QFileInfo pfi(proFile);
         ProFile pro(pfi.absoluteFilePath());
         if (!visitor.queryProFile(&pro) || !visitor.accept(&pro)) {
-- 
cgit v0.12


From ad8e7b27427825bee730c55735cd2554407205e4 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Fri, 12 Nov 2010 11:28:09 +0200
Subject: Add Location as self signable capability in patch_capabilities.pl

Location was not originally included in self-signable set, since in
S60 3.1 devices it is not so. However, it is a lesser of two evils to
make applications with Location capability not install on 3.1 devices
than make them not work correctly on any devices, so Location is now
included in the self-signable set in patch_capabilities.pl.

Task-number: QTBUG-13891
Reviewed-by: Janne Koskinen
---
 bin/patch_capabilities.pl | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/bin/patch_capabilities.pl b/bin/patch_capabilities.pl
index 5230480..994d493 100755
--- a/bin/patch_capabilities.pl
+++ b/bin/patch_capabilities.pl
@@ -78,7 +78,7 @@ sub trim($) {
 my $nullDevice = "/dev/null";
 $nullDevice = "NUL" if ($^O =~ /MSWin/);
 
-my @capabilitiesToAllow = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData");
+my @capabilitiesToAllow = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData", "Location");
 my @capabilitiesSpecified = ();
 
 # If arguments were given to the script,
@@ -301,6 +301,9 @@ if (@ARGV)
                         $_ = trim($_);
                         if ($capabilitiesToAllow =~ /$_/) {
                             push(@capabilitiesToSet, $_);
+                            if (Location =~ /$_/i) {
+                                print ("Patching: Warning - \"Location\" capability detected for binary: \"$binaryBaseName\". This capability is not self-signable for S60 3rd edition feature pack 1 devices, so installing this package on those devices will most likely not work.\n");
+                            }
                         } else {
                             push(@capabilitiesToDrop, $_);
                         }
@@ -319,6 +322,7 @@ if (@ARGV)
                         # While libraries often have capabilities they do not themselves need just to enable them to be loaded by wider variety of processes,
                         # executables are more likely to need every capability they have been assigned or they won't function correctly.
                         print ("Patching: Executable with capabilities incompatible with self-signing detected: \"$binaryBaseName\". (Incompatible capabilities: \"$capsToDropStr\".) Reducing capabilities is only supported for libraries.\n");
+                        print ("Patching: Please use a proper developer certificate for signing this package.\n");
                         exit(1);
                     } else {
                         print ("Patching: The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package and will be removed: \"$capsToDropStr\".\n");
-- 
cgit v0.12


From 1f7ddb0525f7de24e195b2dd1a9f0374d19b2a05 Mon Sep 17 00:00:00 2001
From: Titta Heikkala <EXT-Titta.2.Heikkala@nokia.com>
Date: Mon, 15 Nov 2010 12:19:59 +0200
Subject: Native file dialog on Symbian^3

The static functions in QFileDialog use native file dialog and not
QFileDialog on Symbian^3.

Task-number: QT-3917
Reviewed-by: Sami Merila

Merge-request: 918
Reviewed-by: Sami Merila
---
 src/gui/dialogs/dialogs.pri             |  13 ++
 src/gui/dialogs/qfiledialog.cpp         |  72 ++++++++++--
 src/gui/dialogs/qfiledialog_symbian.cpp | 202 ++++++++++++++++++++++++++++++++
 3 files changed, 278 insertions(+), 9 deletions(-)
 create mode 100644 src/gui/dialogs/qfiledialog_symbian.cpp

diff --git a/src/gui/dialogs/dialogs.pri b/src/gui/dialogs/dialogs.pri
index 4e1b9a7..483e9aa 100644
--- a/src/gui/dialogs/dialogs.pri
+++ b/src/gui/dialogs/dialogs.pri
@@ -108,6 +108,19 @@ SOURCES += \
 	dialogs/qwizard.cpp \
         dialogs/qprintpreviewdialog.cpp
 
+contains(QT_CONFIG, s60) {
+    LIBS += -lcommondialogs \
+            -lavkon \
+            -lplatformenv \
+            -lefsrv \
+            -lgdi
+    SOURCES += dialogs/qfiledialog_symbian.cpp \
+               dialogs/qcolordialog_symbian.cpp
+}
+
 FORMS += dialogs/qpagesetupwidget.ui
 RESOURCES += dialogs/qprintdialog.qrc
 RESOURCES += dialogs/qmessagebox.qrc
+
+# Compensate for lack of platform defines in Symbian3
+symbian: DEFINES += SYMBIAN_VERSION_$$upper($$replace(SYMBIAN_VERSION,\\.,_))
diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index fc3c186..a5bff02 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1616,6 +1616,25 @@ extern QStringList qt_win_get_open_file_names(const QFileDialogArgs &args,
 extern QString qt_win_get_existing_directory(const QFileDialogArgs &args);
 #endif
 
+/*
+    For Symbian file dialogs
+*/
+#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
+extern QString qtSymbianGetOpenFileName(const QString &caption,
+                                        const QString &dir,
+                                        const QString &filter);
+
+extern QStringList qtSymbianGetOpenFileNames(const QString &caption,
+                                             const QString &dir,
+                                             const QString &filter);
+
+extern QString qtSymbianGetSaveFileName(const QString &caption,
+                                        const QString &dir);
+
+extern QString qtSymbianGetExistingDirectory(const QString &caption,
+                                             const QString &dir);
+#endif
+
 /*!
     This is a convenience static function that returns an existing file
     selected by the user. If the user presses Cancel, it returns a null string.
@@ -1644,8 +1663,8 @@ extern QString qt_win_get_existing_directory(const QFileDialogArgs &args);
     The dialog's caption is set to \a caption. If \a caption is not specified
     then a default caption will be used.
 
-    On Windows and Mac OS X, this static function will use the native file
-    dialog and not a QFileDialog.
+    On Windows, Mac OS X and Symbian^3, this static function will use the
+    native file dialog and not a QFileDialog.
 
     On Windows the dialog will spin a blocking modal event loop that will not
     dispatch any QTimers, and if \a parent is not 0 then it will position the
@@ -1657,6 +1676,10 @@ extern QString qt_win_get_existing_directory(const QFileDialogArgs &args);
     \a options includes DontResolveSymlinks, the file dialog will treat
     symlinks as regular directories.
 
+    On Symbian^3 the parameter \a selectedFilter has no meaning and the
+    \a options parameter is only used to define if the native file dialog is
+    used.
+
     \warning Do not delete \a parent during the execution of the dialog. If you
     want to do this, you should create the dialog yourself using one of the
     QFileDialog constructors.
@@ -1672,6 +1695,11 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
 {
     if (qt_filedialog_open_filename_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_open_filename_hook(parent, caption, dir, filter, selectedFilter, options);
+#if defined(Q_WS_S60)
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+        return qtSymbianGetOpenFileName(caption, dir, filter);
+    }
+#endif
     QFileDialogArgs args;
     args.parent = parent;
     args.caption = caption;
@@ -1722,8 +1750,8 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
     The dialog's caption is set to \a caption. If \a caption is not specified
     then a default caption will be used.
 
-    On Windows and Mac OS X, this static function will use the native file
-    dialog and not a QFileDialog.
+    On Windows, Mac OS X and Symbian^3, this static function will use the
+    native file dialog and not a QFileDialog.
 
     On Windows the dialog will spin a blocking modal event loop that will not
     dispatch any QTimers, and if \a parent is not 0 then it will position the
@@ -1741,6 +1769,10 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
 
     \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 10
 
+    On Symbian^3 the parameter \a selectedFilter has no meaning and the
+    \a options parameter is only used to define if the native file dialog is
+    used.
+
     \warning Do not delete \a parent during the execution of the dialog. If you
     want to do this, you should create the dialog yourself using one of the
     QFileDialog constructors.
@@ -1756,6 +1788,11 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
 {
     if (qt_filedialog_open_filenames_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_open_filenames_hook(parent, caption, dir, filter, selectedFilter, options);
+#if defined(Q_WS_S60)
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+        return qtSymbianGetOpenFileNames(caption, dir, filter);
+    }
+#endif
     QFileDialogArgs args;
     args.parent = parent;
     args.caption = caption;
@@ -1813,8 +1850,8 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
     The dialog's caption is set to \a caption. If \a caption is not specified,
     a default caption will be used.
 
-    On Windows and Mac OS X, this static function will use the native file
-    dialog and not a QFileDialog.
+    On Windows, Mac OS X and Symbian^3, this static function will use the
+    native file dialog and not a QFileDialog.
 
     On Windows the dialog will spin a blocking modal event loop that will not
     dispatch any QTimers, and if \a parent is not 0 then it will position the
@@ -1827,6 +1864,10 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
     \a options includes DontResolveSymlinks the file dialog will treat symlinks
     as regular directories.
 
+    On Symbian^3 the parameters \a filter and \a selectedFilter have no
+    meaning. The \a options parameter is only used to define if the native file
+    dialog is used.
+
     \warning Do not delete \a parent during the execution of the dialog. If you
     want to do this, you should create the dialog yourself using one of the
     QFileDialog constructors.
@@ -1842,6 +1883,11 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
 {
     if (qt_filedialog_save_filename_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_save_filename_hook(parent, caption, dir, filter, selectedFilter, options);
+#if defined(Q_WS_S60)
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+        return qtSymbianGetSaveFileName(caption, dir);
+    }
+#endif
     QFileDialogArgs args;
     args.parent = parent;
     args.caption = caption;
@@ -1890,9 +1936,9 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
     pass. To ensure a native file dialog, \l{QFileDialog::}{ShowDirsOnly} must
     be set.
 
-    On Windows and Mac OS X, this static function will use the native file
-    dialog and not a QFileDialog. On Windows CE, if the device has no native
-    file dialog, a QFileDialog will be used.
+    On Windows, Mac OS X and Symbian^3, this static function will use the
+    native file dialog and not a QFileDialog. On Windows CE, if the device has
+    no native file dialog, a QFileDialog will be used.
 
     On Unix/X11, the normal behavior of the file dialog is to resolve and
     follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
@@ -1904,6 +1950,9 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
     dispatch any QTimers, and if \a parent is not 0 then it will position the
     dialog just below the parent's title bar.
 
+    On Symbian^3 the \a options parameter is only used to define if the native
+    file dialog is used.
+
     \warning Do not delete \a parent during the execution of the dialog. If you
     want to do this, you should create the dialog yourself using one of the
     QFileDialog constructors.
@@ -1917,6 +1966,11 @@ QString QFileDialog::getExistingDirectory(QWidget *parent,
 {
     if (qt_filedialog_existing_directory_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_existing_directory_hook(parent, caption, dir, options);
+#if defined(Q_WS_S60)
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+        return qtSymbianGetExistingDirectory(caption, dir);
+    }
+#endif
     QFileDialogArgs args;
     args.parent = parent;
     args.caption = caption;
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
new file mode 100644
index 0000000..bd937a1
--- /dev/null
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** 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 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 "qfiledialog.h"
+
+#ifndef QT_NO_FILEDIALOG
+
+#include <private/qfiledialog_p.h>
+#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
+#include <driveinfo.h>
+#include <AknCommonDialogsDynMem.h>
+#include <CAknMemorySelectionDialogMultiDrive.h>
+#include <MAknFileFilter.h>
+#endif
+#include "private/qcore_symbian_p.h"
+
+QT_BEGIN_NAMESPACE
+
+enum DialogMode { DialogOpen, DialogSave, DialogFolder };
+#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
+class CExtensionFilter : public MAknFileFilter
+{
+public:
+    void setFilter(const QString filter)
+    {
+        filterList.clear();
+        if (filter.left(2) == "*.") {
+            //Filter has only extensions
+            filterList << filter.split(" ");
+            return;
+        }
+        else {
+            //Extensions are in parenthesis and there may be several filters
+            QStringList separatedFilters(filter.split(";;"));
+            for (int i = 0; i < separatedFilters.size(); i++) {
+                if (separatedFilters.at(i) == QFileDialog::tr("All Files (*)")){
+                    filterList << QFileDialog::tr("All Files (*)");
+                    return;
+                }
+            }
+            QRegExp rx("\\(([^\\)]*)\\)");
+            int pos = 0;
+            while ((pos = rx.indexIn(filter, pos)) != -1) {
+                filterList << rx.cap(1).split(" ");
+                pos += rx.matchedLength();
+            }
+        }
+    }
+
+    TBool Accept(const TDesC &/*aDriveAndPath*/, const TEntry &aEntry) const
+    {
+        if (aEntry.IsDir()) {
+            return ETrue;
+        }
+        if (filterList.isEmpty()) {
+            //No filter for files, all can be accepted
+            return ETrue;
+        }
+        if (filterList == QStringList(QFileDialog::tr("All Files (*)"))) {
+            return ETrue;
+        }
+        for (int i = 0; i < filterList.size(); ++i) {
+            QString extension = filterList.at(i);
+            //remove '*' from the beginning of the extension
+            if (extension.left(1) == "*"){
+                extension = extension.right(extension.size() - 1);
+            }
+            QString fileName = qt_TDesC2QString(aEntry.iName);
+            if (fileName.right(extension.size()) == extension) {
+                return ETrue;
+            }
+        }
+        return EFalse;
+    }
+
+private:
+    QStringList filterList;
+};
+#endif
+
+static QString launchSymbianDialog(const QString dialogCaption, const QString startDirectory,
+                                   const QString filter, DialogMode dialogMode)
+{
+    QString selection;
+#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
+    QT_TRAP_THROWING(
+        TFileName startFolder;
+        if (!startDirectory.isEmpty()) {
+            QString dir = QDir::toNativeSeparators(startDirectory);
+            startFolder = qt_QString2TPtrC(dir);
+        }
+        TInt types = AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
+                     AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
+                     AknCommonDialogsDynMem::EMemoryTypePhone;
+
+        TPtrC titlePtr(qt_QString2TPtrC(dialogCaption));
+        TFileName target;
+        bool select = false;
+        if (dialogMode == DialogOpen) {
+            CExtensionFilter* extensionFilter = new (ELeave) CExtensionFilter;
+            CleanupStack::PushL(extensionFilter);
+            extensionFilter->setFilter(filter);
+            select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
+                     startFolder, NULL, NULL, titlePtr, extensionFilter);
+            CleanupStack::Pop(extensionFilter);
+        }
+        else if (dialogMode == DialogSave){
+            select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
+                     startFolder, NULL, NULL, titlePtr);
+        }
+        else if (dialogMode == DialogFolder){
+            select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
+                        0, 0, titlePtr, NULL, NULL);
+        }
+        if (select) {
+            selection.append(qt_TDesC2QString(target));
+        }
+    );
+#endif
+    return selection;
+}
+
+QString qtSymbianGetOpenFileName(const QString &caption,
+                                 const QString &dir,
+                                 const QString &filter)
+{
+    return launchSymbianDialog(caption, dir, filter, DialogOpen);
+}
+
+QStringList qtSymbianGetOpenFileNames(const QString &caption,
+                                      const QString &dir,
+                                      const QString &filter)
+{
+    QString fileName;
+    fileName.append(launchSymbianDialog(caption, dir, filter, DialogOpen));
+    QStringList fileList;
+    fileList << fileName;
+
+    return fileList;
+}
+
+QString qtSymbianGetSaveFileName(const QString &caption,
+                                 const QString &dir)
+{
+    return launchSymbianDialog(caption, dir, QString(), DialogSave);
+}
+
+QString qtSymbianGetExistingDirectory(const QString &caption,
+                                      const QString &dir)
+{
+    QString folderCaption;
+    if (!caption.isEmpty()) {
+        folderCaption.append(caption);
+    }
+    else {
+        // Title for folder selection dialog is mandatory
+        folderCaption.append(QFileDialog::tr("Find Directory"));
+    }
+    return launchSymbianDialog(folderCaption, dir, QString(), DialogFolder);
+}
+
+QT_END_NAMESPACE
+
+#endif
-- 
cgit v0.12


From 4715182e9c600811c045fe5ed7989d4d52d1f4e9 Mon Sep 17 00:00:00 2001
From: Titta Heikkala <EXT-Titta.2.Heikkala@nokia.com>
Date: Mon, 15 Nov 2010 12:27:01 +0200
Subject: Documented usage of dialogs on Symbian

Added quidance to documentation about using print dialogs
on Symbian.

Task-number: QT-4247
Reviewed-by: Sami Merila

Merge-request: 920
Reviewed-by: Sami Merila
---
 src/gui/dialogs/qabstractprintdialog.cpp | 3 +++
 src/gui/dialogs/qpagesetupdialog.cpp     | 3 +++
 src/gui/dialogs/qprintpreviewdialog.cpp  | 2 ++
 3 files changed, 8 insertions(+)

diff --git a/src/gui/dialogs/qabstractprintdialog.cpp b/src/gui/dialogs/qabstractprintdialog.cpp
index 25d9ebb..641419f 100644
--- a/src/gui/dialogs/qabstractprintdialog.cpp
+++ b/src/gui/dialogs/qabstractprintdialog.cpp
@@ -65,6 +65,9 @@ class QPrintDialogPrivate : public QAbstractPrintDialogPrivate
     customize settings shown in print dialogs, but it is not used directly.
     Use QPrintDialog to display a print dialog in your application.
 
+    In Symbian, there is no support for printing. Hence, this dialog should not
+    be used in Symbian.
+
     \sa QPrintDialog, QPrinter, {Printing with Qt}
 */
 
diff --git a/src/gui/dialogs/qpagesetupdialog.cpp b/src/gui/dialogs/qpagesetupdialog.cpp
index 5d77de1..b5be942 100644
--- a/src/gui/dialogs/qpagesetupdialog.cpp
+++ b/src/gui/dialogs/qpagesetupdialog.cpp
@@ -62,6 +62,9 @@ QT_BEGIN_NAMESPACE
     page margins set on a QPrinter won't show in the native Mac OS X
     page setup dialog.
 
+    In Symbian, there is no support for printing. Hence, this dialog should not
+    be used in Symbian.
+
     \sa QPrinter, QPrintDialog
 */
 
diff --git a/src/gui/dialogs/qprintpreviewdialog.cpp b/src/gui/dialogs/qprintpreviewdialog.cpp
index f21343e..d74742a 100644
--- a/src/gui/dialogs/qprintpreviewdialog.cpp
+++ b/src/gui/dialogs/qprintpreviewdialog.cpp
@@ -676,6 +676,8 @@ void QPrintPreviewDialogPrivate::_q_zoomFactorChanged()
     Call QPrintPreviewDialog::exec() to show the preview dialog.
     \endlist
 
+    In Symbian, there is no support for printing. Hence, this dialog should not
+    be used in Symbian.
 
     \sa QPrinter, QPrintDialog, QPageSetupDialog, QPrintPreviewWidget
 */
-- 
cgit v0.12


From 012c865ab30ed45fc57ee5b49b625697cc065e82 Mon Sep 17 00:00:00 2001
From: Janne Anttila <janne.anttila@digia.com>
Date: Fri, 12 Nov 2010 11:16:29 +0200
Subject: Removed unnecessary Q_OS_SYMBIAN flags from qdesktopservices_s60.cpp.

This flags used to be Q_WS_S60 flags but as part of fabf804b they were
changed to Q_OS_SYMBIAN. However since the whole while is only included
to build when Q_OS_SYMBIAN is defined, the flags can be removed.

Reviewed-by: mread
---
 src/gui/util/qdesktopservices_s60.cpp | 24 ++++--------------------
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp
index cd023cb..d1eeeae 100644
--- a/src/gui/util/qdesktopservices_s60.cpp
+++ b/src/gui/util/qdesktopservices_s60.cpp
@@ -62,15 +62,10 @@
 // copied from miutset.h, so we don't get a dependency into the app layer
 const TUid KUidMsgTypeSMTP			= {0x10001028};	// 268439592
 
-#ifdef Q_OS_SYMBIAN
-#  include <pathinfo.h>             // PathInfo
-#  ifdef USE_DOCUMENTHANDLER
-#    include <DocumentHandler.h>    // CDocumentHandler
-#    include <AknServerApp.h>
-#  endif
-#else
-#  warning CDocumentHandler requires support for S60
-#  undef USE_DOCUMENTHANDLER        // Fallback to RApaLsSession based implementation
+#include <pathinfo.h>             // PathInfo
+#ifdef USE_DOCUMENTHANDLER
+#  include <DocumentHandler.h>    // CDocumentHandler
+#  include <AknServerApp.h>
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -268,7 +263,6 @@ static TDriveUnit writableExeDrive()
 static TPtrC writableDataRoot()
 {
     TDriveUnit drive = exeDrive();
-#ifdef Q_OS_SYMBIAN
     switch(drive.operator TInt()){
         case EDriveC:
             return PathInfo::PhoneMemoryRootPath();
@@ -285,10 +279,6 @@ static TPtrC writableDataRoot()
             return PathInfo::PhoneMemoryRootPath();
             break;
     }
-#else
-#warning No fallback implementation of writableDataRoot()
-    return 0;
-#endif
 }
 
 static void openDocumentL(const TDesC& aUrl)
@@ -395,21 +385,15 @@ QString QDesktopServices::storageLocation(StandardLocation type)
         break;
     case MusicLocation:
         path.Append(writableDataRoot());
-#ifdef Q_OS_SYMBIAN
         path.Append(PathInfo::SoundsPath());
-#endif
         break;
     case MoviesLocation:
         path.Append(writableDataRoot());
-#ifdef Q_OS_SYMBIAN
         path.Append(PathInfo::VideosPath());
-#endif
         break;
     case PicturesLocation:
         path.Append(writableDataRoot());
-#ifdef Q_OS_SYMBIAN
         path.Append(PathInfo::ImagesPath());
-#endif
         break;
     case TempLocation:
         return QDir::tempPath();
-- 
cgit v0.12


From d92cbfc5d04d750dea1e49a377e62be564cac788 Mon Sep 17 00:00:00 2001
From: Janne Anttila <janne.anttila@digia.com>
Date: Mon, 15 Nov 2010 13:22:27 +0200
Subject: Switched qdesktopservices to use SchemeHandler for Symbian^3 and
 later.

SchemeHandler is plugin extensible component to handle several
different URI schemes. By default schemes such as http, https, rtsp,
mailto, file, wtai, tel and cti are supported.
In some devices/platforms also other schemes might be supported.

This commit only defines the USE_SCHEMEHANDLER macro and re-orders
the qdesktopservices_s60 source code to make it more readable and to
make it compile both with and without the flag. The actual
implementation was provided at the same time when qdesktopservices
for symbian was initially implemented.

Why support is enabled only for Symbian^3 and later? SchemeHandler
component does not exist in S60 3.1 - 5.0 public SDKs, actually it does
not exist also in Forum Nokia provided Symbian^3 SDK, but is available
in Symbian^3 PDK. Since building Qt for Symbian^3 anyway require PDK
and because the release builds for Symbian^3 are done separately
from older Symbian versions, PDK dependency should be Ok.

It might be that SchemeHandler headers will be relicensed as part of Qt,
then SchemeHandler support also for older S60/Symbian releases can be
enabled. If this happens it will be separate commit.

Task-number: QTBUG-15282
Reviewed-by: Miikka Heikkinen
---
 src/gui/util/qdesktopservices_s60.cpp | 162 ++++++++++++++++++----------------
 src/gui/util/util.pri                 |  19 ++--
 2 files changed, 97 insertions(+), 84 deletions(-)

diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp
index d1eeeae..47b0cbe 100644
--- a/src/gui/util/qdesktopservices_s60.cpp
+++ b/src/gui/util/qdesktopservices_s60.cpp
@@ -45,27 +45,29 @@
 #include <qurl.h>
 #include <private/qcore_symbian_p.h>
 
-#include <txtrich.h>                // CRichText
 #include <f32file.h>                // TDriveUnit etc
-#include <eikenv.h>                 // CEikonEnv
-#include <apgcli.h>                 // RApaLsSession
-#include <apgtask.h>                // TApaTaskList, TApaTask
-#include <rsendas.h>                // RSendAs
-#include <rsendasmessage.h>         // RSendAsMessage
+#include <pathinfo.h>               // PathInfo
 
+#ifndef USE_SCHEMEHANDLER
 #ifdef Q_WS_S60
 // This flag changes the implementation to use S60 CDcoumentHandler
-// instead of apparch when opening the files
+// instead of apparc when opening the files
 #define USE_DOCUMENTHANDLER
 #endif
 
-// copied from miutset.h, so we don't get a dependency into the app layer
-const TUid KUidMsgTypeSMTP			= {0x10001028};	// 268439592
+#include <txtrich.h>                // CRichText
+#include <eikenv.h>                 // CEikonEnv
+#include <apgcli.h>                 // RApaLsSession
+#include <apgtask.h>                // TApaTaskList, TApaTask
+#include <rsendas.h>                // RSendAs
+#include <rsendasmessage.h>         // RSendAsMessage
 
-#include <pathinfo.h>             // PathInfo
 #ifdef USE_DOCUMENTHANDLER
-#  include <DocumentHandler.h>    // CDocumentHandler
-#  include <AknServerApp.h>
+#include <DocumentHandler.h>        // CDocumentHandler
+#include <AknServerApp.h>
+#endif
+#else // USE_SCHEMEHANDLER
+#include <schemehandler.h>
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -74,6 +76,10 @@ _LIT(KCacheSubDir, "Cache\\");
 _LIT(KSysBin, "\\Sys\\Bin\\");
 _LIT(KBrowserPrefix, "4 " );
 _LIT(KFontsDir, "z:\\resource\\Fonts\\");
+
+#ifndef USE_SCHEMEHANDLER
+// copied from miutset.h, so we don't get a dependency into the app layer
+const TUid KUidMsgTypeSMTP = {0x10001028};	// 268439592
 const TUid KUidBrowser = { 0x10008D39 };
 
 template<class R>
@@ -132,7 +138,6 @@ private:
 Q_GLOBAL_STATIC(QS60DocumentHandler, qt_s60_documenthandler);
 #endif
 
-
 static void handleMailtoSchemeLX(const QUrl &url)
 {
     // this function has many intermingled leaves and throws. Qt and Symbian objects do not have
@@ -150,12 +155,10 @@ static void handleMailtoSchemeLX(const QUrl &url)
     QStringList ccs = cc.split(QLatin1String(","), QString::SkipEmptyParts);
     QStringList bccs = bcc.split(QLatin1String(","), QString::SkipEmptyParts);
 
-
     RSendAs sendAs;
     User::LeaveIfError(sendAs.Connect());
     QAutoClose<RSendAs> sendAsCleanup(sendAs);
 
-
     CSendAsAccounts* accounts = CSendAsAccounts::NewL();
     CleanupStack::PushL(accounts);
     sendAs.AvailableAccountsL(KUidMsgTypeSMTP, *accounts);
@@ -244,42 +247,6 @@ static bool handleOtherSchemes(const QUrl &url)
     return err ? false : true;
 }
 
-static TDriveUnit exeDrive()
-{
-    RProcess me;
-    TFileName processFileName = me.FileName();
-    TDriveUnit drive(processFileName);
-    return drive;
-}
-
-static TDriveUnit writableExeDrive()
-{
-    TDriveUnit drive = exeDrive();
-    if(drive.operator TInt() == EDriveZ)
-        return TDriveUnit(EDriveC);
-    return drive;
-}
-
-static TPtrC writableDataRoot()
-{
-    TDriveUnit drive = exeDrive();
-    switch(drive.operator TInt()){
-        case EDriveC:
-            return PathInfo::PhoneMemoryRootPath();
-            break;
-        case EDriveE:
-            return PathInfo::MemoryCardRootPath();
-            break;
-        case EDriveZ:
-            // It is not possible to write on ROM drive ->
-            // return phone mem root path instead
-            return PathInfo::PhoneMemoryRootPath();
-            break;
-        default:
-            return PathInfo::PhoneMemoryRootPath();
-            break;
-    }
-}
 
 static void openDocumentL(const TDesC& aUrl)
 {
@@ -304,13 +271,44 @@ static void openDocumentL(const TDesC& aUrl)
 #endif
 }
 
-#ifdef USE_SCHEMEHANDLER
+static bool launchWebBrowser(const QUrl &url)
+{
+    if (!url.isValid())
+        return false;
+
+    if (url.scheme() == QLatin1String("mailto")) {
+        return handleMailtoScheme(url);
+    }
+    return handleOtherSchemes( url );
+}
+
+static bool openDocument(const QUrl &file)
+{
+    if (!file.isValid())
+        return false;
+
+    QString filePath = file.toLocalFile();
+    filePath = QDir::toNativeSeparators(filePath);
+    TPtrC filePathPtr(qt_QString2TPtrC(filePath));
+    TRAPD(err, openDocumentL(filePathPtr));
+    return err ? false : true;
+}
+
+#else //USE_SCHEMEHANDLER
 // The schemehandler component only exist in private SDK. This implementation
 // exist here just for convenience in case that we need to use it later on
 // The schemehandle based implementation is not yet tested.
 
 // The biggest advantage of schemehandler is that it can handle
 // wide range of schemes and is extensible by plugins
+static void handleUrlL(const TDesC& aUrl)
+{
+    CSchemeHandler* schemeHandler = CSchemeHandler::NewL(aUrl);
+    CleanupStack::PushL(schemeHandler);
+    schemeHandler->HandleUrlStandaloneL(); // Process the Url in standalone mode
+    CleanupStack::PopAndDestroy();
+}
+
 static bool handleUrl(const QUrl &url)
 {
     if (!url.isValid())
@@ -322,13 +320,6 @@ static bool handleUrl(const QUrl &url)
     return err ? false : true;
 }
 
-static void handleUrlL(const TDesC& aUrl)
-{
-    CSchemeHandler* schemeHandler = CSchemeHandler::NewL(aUrl);
-    CleanupStack::PushL(schemeHandler);
-    schemeHandler->HandleUrlStandaloneL(); // Process the Url in standalone mode
-    CleanupStack::PopAndDestroy();
-}
 static bool launchWebBrowser(const QUrl &url)
 {
     return handleUrl(url);
@@ -336,31 +327,48 @@ static bool launchWebBrowser(const QUrl &url)
 
 static bool openDocument(const QUrl &file)
 {
-    return handleUrl(url);
+    return handleUrl(file);
 }
-#endif
 
-static bool launchWebBrowser(const QUrl &url)
-{
-    if (!url.isValid())
-        return false;
+#endif //USE_SCHEMEHANDLER
 
-    if (url.scheme() == QLatin1String("mailto")) {
-        return handleMailtoScheme(url);
-    }
-    return handleOtherSchemes( url );
+// Common functions to all implementations
+
+static TDriveUnit exeDrive()
+{
+    RProcess me;
+    TFileName processFileName = me.FileName();
+    TDriveUnit drive(processFileName);
+    return drive;
 }
 
-static bool openDocument(const QUrl &file)
+static TDriveUnit writableExeDrive()
 {
-    if (!file.isValid())
-        return false;
+    TDriveUnit drive = exeDrive();
+    if(drive.operator TInt() == EDriveZ)
+        return TDriveUnit(EDriveC);
+    return drive;
+}
 
-    QString filePath = file.toLocalFile();
-    filePath = QDir::toNativeSeparators(filePath);
-    TPtrC filePathPtr(qt_QString2TPtrC(filePath));
-    TRAPD(err, openDocumentL(filePathPtr));
-    return err ? false : true;
+static TPtrC writableDataRoot()
+{
+    TDriveUnit drive = exeDrive();
+    switch(drive.operator TInt()){
+        case EDriveC:
+            return PathInfo::PhoneMemoryRootPath();
+            break;
+        case EDriveE:
+            return PathInfo::MemoryCardRootPath();
+            break;
+        case EDriveZ:
+            // It is not possible to write on ROM drive ->
+            // return phone mem root path instead
+            return PathInfo::PhoneMemoryRootPath();
+            break;
+        default:
+            return PathInfo::PhoneMemoryRootPath();
+            break;
+    }
 }
 
 QString QDesktopServices::storageLocation(StandardLocation type)
diff --git a/src/gui/util/util.pri b/src/gui/util/util.pri
index bea520e..d1c4ff8 100644
--- a/src/gui/util/util.pri
+++ b/src/gui/util/util.pri
@@ -43,12 +43,17 @@ embedded {
 }
 
 symbian {
-    LIBS += -lsendas2 -letext -lapmime -lplatformenv
-    contains(QT_CONFIG, s60) {
-        contains(CONFIG, is_using_gnupoc) {
-            LIBS += -lcommonui
-        } else {
-            LIBS += -lCommonUI
+    LIBS += -letext -lplatformenv
+    contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
+        LIBS += -lsendas2 -lapmime
+        contains(QT_CONFIG, s60) {
+            contains(CONFIG, is_using_gnupoc) {
+                LIBS += -lcommonui
+            } else {
+                LIBS += -lCommonUI
+            }
         }
+    } else {
+        DEFINES += USE_SCHEMEHANDLER
     }
-}
+}
\ No newline at end of file
-- 
cgit v0.12


From 03c60ccac1ab416ebee7a262f1c910774fdc2ff2 Mon Sep 17 00:00:00 2001
From: Janne Anttila <janne.anttila@digia.com>
Date: Mon, 15 Nov 2010 14:28:25 +0200
Subject: Fixed code style of d92cbfc5, reported by git push.

82: TAB character in non-leading whitespace
348: Flow control keywords must be followed by single space
356: Flow control keywords must be followed by single space

Rev-By: TrustMe
---
 src/gui/util/qdesktopservices_s60.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp
index 47b0cbe..56c2b98 100644
--- a/src/gui/util/qdesktopservices_s60.cpp
+++ b/src/gui/util/qdesktopservices_s60.cpp
@@ -79,7 +79,7 @@ _LIT(KFontsDir, "z:\\resource\\Fonts\\");
 
 #ifndef USE_SCHEMEHANDLER
 // copied from miutset.h, so we don't get a dependency into the app layer
-const TUid KUidMsgTypeSMTP = {0x10001028};	// 268439592
+const TUid KUidMsgTypeSMTP = {0x10001028}; // 268439592
 const TUid KUidBrowser = { 0x10008D39 };
 
 template<class R>
@@ -345,7 +345,7 @@ static TDriveUnit exeDrive()
 static TDriveUnit writableExeDrive()
 {
     TDriveUnit drive = exeDrive();
-    if(drive.operator TInt() == EDriveZ)
+    if (drive.operator TInt() == EDriveZ)
         return TDriveUnit(EDriveC);
     return drive;
 }
@@ -353,7 +353,7 @@ static TDriveUnit writableExeDrive()
 static TPtrC writableDataRoot()
 {
     TDriveUnit drive = exeDrive();
-    switch(drive.operator TInt()){
+    switch (drive.operator TInt()){
         case EDriveC:
             return PathInfo::PhoneMemoryRootPath();
             break;
-- 
cgit v0.12


From 515fd562d87290c3fc0eb45817434dd0744d346e Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Mon, 15 Nov 2010 14:15:25 +0200
Subject: Use include(original mkspec) instead of copying of mkspec to default

Having QMAKESPEC_ORIGINAL at the end of the default qmake.conf sets
the mkspec too late for scope checks in symbian-mmp.conf and related
files. Fixed by changing how default mkspec is handled: it is no
longer simply copied over to mkspecs/default by configure but
rather included with include statement in the generated
mkspecs/default/qmake.conf after setting of QMAKESPEC_ORIGINAL value.

This should also fix any issues with relative includes in mkspecs
used as default that are not on same level as mkspecs/default folder.

Task-number: QTBUG-15159
Reviewed-by: Oswald Buddenhagen
Reviewed-by: Joerg Bornemann
---
 tools/configure/configureapp.cpp | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 3808c4e..3c12eb9 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -3227,7 +3227,8 @@ void Configure::generateConfigfiles()
     }
 
     // Copy configured mkspec to default directory, but remove the old one first, if there is any
-    QString defSpec = buildPath + "/mkspecs/default";
+    QString mkspecsPath = buildPath + "/mkspecs";
+    QString defSpec = mkspecsPath + "/default";
     QFileInfo defSpecInfo(defSpec);
     if (defSpecInfo.exists()) {
         if (!Environment::rmdir(defSpec)) {
@@ -3237,21 +3238,22 @@ void Configure::generateConfigfiles()
         }
     }
 
-    QString spec = dictionary.contains("XQMAKESPEC") ? dictionary["XQMAKESPEC"] : dictionary["QMAKESPEC"];
-    QString pltSpec = sourcePath + "/mkspecs/" + spec;
-    if (!Environment::cpdir(pltSpec, defSpec)) {
-        cout << "Couldn't update default mkspec! Does " << qPrintable(pltSpec) << " exist?" << endl;
+    QDir mkspecsDir(mkspecsPath);
+    if (!mkspecsDir.mkdir("default")) {
+        cout << "Couldn't create default mkspec dir!" << endl;
         dictionary["DONE"] = "error";
         return;
     }
 
+    QString spec = dictionary.contains("XQMAKESPEC") ? dictionary["XQMAKESPEC"] : dictionary["QMAKESPEC"];
+    QString pltSpec = sourcePath + "/mkspecs/" + spec;
     outName = defSpec + "/qmake.conf";
-    ::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
     QFile qmakeConfFile(outName);
-    if (qmakeConfFile.open(QFile::Append | QFile::WriteOnly | QFile::Text)) {
+    if (qmakeConfFile.open(QFile::WriteOnly | QFile::Text)) {
         QTextStream qmakeConfStream;
         qmakeConfStream.setDevice(&qmakeConfFile);
-        qmakeConfStream << endl << "QMAKESPEC_ORIGINAL=" << pltSpec << endl;
+        qmakeConfStream << "QMAKESPEC_ORIGINAL=" << pltSpec << endl << endl;
+        qmakeConfStream << "include(" << pltSpec << "/qmake.conf)" << endl;
         qmakeConfStream.flush();
         qmakeConfFile.close();
     }
-- 
cgit v0.12


From 14ddf44ce2fdd7195741b9683226a3cd774e17e4 Mon Sep 17 00:00:00 2001
From: Jani Hautakangas <jani.hautakangas@nokia.com>
Date: Wed, 17 Nov 2010 14:59:15 +0200
Subject: Fix for WServ 64 crash on Symbian.

Crash happens if application first sets WA_OpaquePaintEvent flag
and then sets WA_TranslucentBackground flag. In that case
WA_TranslucentBackground flag is ineffective leading to situation
where Qt Symbian adaptation tries to reset native window transparency
but because native window is already opaque due to WA_OpaquePaintEvent,
WServ 64 crash occurs.

Task-number: QTBUG-15369
Reviewed-by: Jason Barron
---
 src/gui/kernel/qwidget_p.h     |  1 +
 src/gui/kernel/qwidget_s60.cpp | 12 ++++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index ca1e3fc..6a27469 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -226,6 +226,7 @@ struct QTLWExtra {
 #endif
 #elif defined(Q_OS_SYMBIAN)
     uint inExpose : 1; // Prevents drawing recursion
+    uint nativeWindowTransparencyEnabled : 1; // Tracks native window transparency
 #endif
 };
 
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index cf4bdf1..6ce46d3 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -767,17 +767,24 @@ void QWidgetPrivate::s60UpdateIsOpaque()
     if (!q->testAttribute(Qt::WA_WState_Created) || !q->testAttribute(Qt::WA_TranslucentBackground))
         return;
 
+    createTLExtra();
+
     RWindow *const window = static_cast<RWindow *>(q->effectiveWinId()->DrawableWindow());
 
 #ifdef Q_SYMBIAN_SEMITRANSPARENT_BG_SURFACE
     window->SetSurfaceTransparency(!isOpaque);
+    extra->topextra->nativeWindowTransparencyEnabled = !isOpaque;
 #else
     if (!isOpaque) {
         const TDisplayMode displayMode = static_cast<TDisplayMode>(window->SetRequiredDisplayMode(EColor16MA));
-        if (window->SetTransparencyAlphaChannel() == KErrNone)
+        if (window->SetTransparencyAlphaChannel() == KErrNone) {
             window->SetBackgroundColor(TRgb(255, 255, 255, 0));
-    } else
+            extra->topextra->nativeWindowTransparencyEnabled = 1;
+        }
+    } else if (extra->topextra->nativeWindowTransparencyEnabled) {
         window->SetTransparentRegion(TRegionFix<1>());
+        extra->topextra->nativeWindowTransparencyEnabled = 0;
+    }
 #endif
 }
 
@@ -936,6 +943,7 @@ void QWidgetPrivate::registerDropSite(bool /* on */)
 void QWidgetPrivate::createTLSysExtra()
 {
     extra->topextra->inExpose = 0;
+    extra->topextra->nativeWindowTransparencyEnabled = 0;
 }
 
 void QWidgetPrivate::deleteTLSysExtra()
-- 
cgit v0.12


From fd7c4c07c20eaff247be33826ae0af099c178494 Mon Sep 17 00:00:00 2001
From: Titta Heikkala <EXT-Titta.2.Heikkala@nokia.com>
Date: Wed, 17 Nov 2010 10:15:15 +0200
Subject: Correct flags for Symbian file dialogs

Corrected the flags for extern functions

Task-number: QT-3917
Reviewed-by: Janne Koskinen

Merge-request: 918
Reviewed-by: Janne Koskinen
---
 src/gui/dialogs/qfiledialog.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index a5bff02..0b789cc 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1619,7 +1619,7 @@ extern QString qt_win_get_existing_directory(const QFileDialogArgs &args);
 /*
     For Symbian file dialogs
 */
-#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
+#if defined(Q_WS_S60)
 extern QString qtSymbianGetOpenFileName(const QString &caption,
                                         const QString &dir,
                                         const QString &filter);
-- 
cgit v0.12


From 518b284673d66ed4a2961a88646ec012cedc96bd Mon Sep 17 00:00:00 2001
From: Titta Heikkala <EXT-Titta.2.Heikkala@nokia.com>
Date: Thu, 18 Nov 2010 11:34:13 +0200
Subject: Removed extra cpp and done changes based on comments

qcolordialog_symbian.cpp is removed from dialogs.pri and string
comparison corrected based on comments.

Task-number: QT-3917
Reviewed-by: Janne Koskinen

Merge-request: 918
Reviewed-by: Janne Koskinen
---
 src/gui/dialogs/dialogs.pri             |  3 +--
 src/gui/dialogs/qfiledialog.cpp         |  9 +++------
 src/gui/dialogs/qfiledialog_symbian.cpp | 22 ++++++++++------------
 3 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/src/gui/dialogs/dialogs.pri b/src/gui/dialogs/dialogs.pri
index 483e9aa..c7cb794 100644
--- a/src/gui/dialogs/dialogs.pri
+++ b/src/gui/dialogs/dialogs.pri
@@ -114,8 +114,7 @@ contains(QT_CONFIG, s60) {
             -lplatformenv \
             -lefsrv \
             -lgdi
-    SOURCES += dialogs/qfiledialog_symbian.cpp \
-               dialogs/qcolordialog_symbian.cpp
+    SOURCES += dialogs/qfiledialog_symbian.cpp
 }
 
 FORMS += dialogs/qpagesetupwidget.ui
diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index 0b789cc..1db9789 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1696,9 +1696,8 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
     if (qt_filedialog_open_filename_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_open_filename_hook(parent, caption, dir, filter, selectedFilter, options);
 #if defined(Q_WS_S60)
-    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
         return qtSymbianGetOpenFileName(caption, dir, filter);
-    }
 #endif
     QFileDialogArgs args;
     args.parent = parent;
@@ -1789,9 +1788,8 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
     if (qt_filedialog_open_filenames_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_open_filenames_hook(parent, caption, dir, filter, selectedFilter, options);
 #if defined(Q_WS_S60)
-    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
         return qtSymbianGetOpenFileNames(caption, dir, filter);
-    }
 #endif
     QFileDialogArgs args;
     args.parent = parent;
@@ -1884,9 +1882,8 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
     if (qt_filedialog_save_filename_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_save_filename_hook(parent, caption, dir, filter, selectedFilter, options);
 #if defined(Q_WS_S60)
-    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
         return qtSymbianGetSaveFileName(caption, dir);
-    }
 #endif
     QFileDialogArgs args;
     args.parent = parent;
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
index bd937a1..0277e1c 100644
--- a/src/gui/dialogs/qfiledialog_symbian.cpp
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -62,24 +62,23 @@ public:
     void setFilter(const QString filter)
     {
         filterList.clear();
-        if (filter.left(2) == "*.") {
+        if (filter.left(2) == QLatin1String("*.")) {
             //Filter has only extensions
             filterList << filter.split(" ");
             return;
-        }
-        else {
+        } else {
             //Extensions are in parenthesis and there may be several filters
-            QStringList separatedFilters(filter.split(";;"));
+            QStringList separatedFilters(filter.split(QLatin1String(";;")));
             for (int i = 0; i < separatedFilters.size(); i++) {
-                if (separatedFilters.at(i) == QFileDialog::tr("All Files (*)")){
-                    filterList << QFileDialog::tr("All Files (*)");
+                if (separatedFilters.at(i).contains(QLatin1String("(*)"))) {
+                    filterList << QLatin1String("(*)");
                     return;
                 }
             }
             QRegExp rx("\\(([^\\)]*)\\)");
             int pos = 0;
             while ((pos = rx.indexIn(filter, pos)) != -1) {
-                filterList << rx.cap(1).split(" ");
+                filterList << rx.cap(1).split(QLatin1String(" "));
                 pos += rx.matchedLength();
             }
         }
@@ -94,7 +93,7 @@ public:
             //No filter for files, all can be accepted
             return ETrue;
         }
-        if (filterList == QStringList(QFileDialog::tr("All Files (*)"))) {
+        if (filterList == QStringList(QLatin1String("(*)"))) {
             return ETrue;
         }
         for (int i = 0; i < filterList.size(); ++i) {
@@ -142,11 +141,11 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
                      startFolder, NULL, NULL, titlePtr, extensionFilter);
             CleanupStack::Pop(extensionFilter);
         }
-        else if (dialogMode == DialogSave){
+        else if (dialogMode == DialogSave) {
             select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
                      startFolder, NULL, NULL, titlePtr);
         }
-        else if (dialogMode == DialogFolder){
+        else if (dialogMode == DialogFolder) {
             select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
                         0, 0, titlePtr, NULL, NULL);
         }
@@ -189,8 +188,7 @@ QString qtSymbianGetExistingDirectory(const QString &caption,
     QString folderCaption;
     if (!caption.isEmpty()) {
         folderCaption.append(caption);
-    }
-    else {
+    } else {
         // Title for folder selection dialog is mandatory
         folderCaption.append(QFileDialog::tr("Find Directory"));
     }
-- 
cgit v0.12


From 4e73e8b530f77bf1f43042fb07038eb51cb0238f Mon Sep 17 00:00:00 2001
From: Jani Hautakangas <jani.hautakangas@nokia.com>
Date: Thu, 18 Nov 2010 12:01:04 +0200
Subject: Fix for QtOpenGL RVCT4 compilation error

RVCT4 has strict lookup rules. Calls from function
,that depends on a template parameter, to internal
static functions must be qualified.

Task-number: QTBUG-15424
Reviewed-by: Jason Barron
---
 src/opengl/gl2paintengineex/qtriangulator.cpp | 34 +++++++++++++--------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/opengl/gl2paintengineex/qtriangulator.cpp b/src/opengl/gl2paintengineex/qtriangulator.cpp
index 85f604a..4c3deb6 100644
--- a/src/opengl/gl2paintengineex/qtriangulator.cpp
+++ b/src/opengl/gl2paintengineex/qtriangulator.cpp
@@ -339,7 +339,7 @@ static inline qint64 qPointDistanceFromLine(const QPodPoint &p, const QPodPoint
 
 static inline bool qPointIsLeftOfLine(const QPodPoint &p, const QPodPoint &v1, const QPodPoint &v2)
 {
-    return qPointDistanceFromLine(p, v1, v2) < 0;
+    return ::qPointDistanceFromLine(p, v1, v2) < 0;
 }
 
 // Return:
@@ -1741,7 +1741,7 @@ bool QTriangulator<T>::ComplexToSimple::calculateIntersection(int left, int righ
     Intersection intersection;
     intersection.leftEdge = left;
     intersection.rightEdge = right;
-    intersection.intersectionPoint = qIntersectionPoint(u1, u2, v1, v2);
+    intersection.intersectionPoint = ::qIntersectionPoint(u1, u2, v1, v2);
 
     if (!intersection.intersectionPoint.isValid())
         return false;
@@ -1767,10 +1767,10 @@ bool QTriangulator<T>::ComplexToSimple::edgeIsLeftOfEdge(int leftEdgeIndex, int
         return true;
     if (upper.x > qMax(l.x, u.x))
         return false;
-    qint64 d = qPointDistanceFromLine(upper, l, u);
+    qint64 d = ::qPointDistanceFromLine(upper, l, u);
     // d < 0: left, d > 0: right, d == 0: on top
     if (d == 0)
-        d = qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
+        d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
     return d < 0;
 }
 
@@ -1814,7 +1814,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         if (d == 0) {
             result.first = result.second = current;
             break;
@@ -1828,7 +1828,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         Q_ASSERT(d >= 0);
         if (d == 0) {
             result.first = current;
@@ -1842,7 +1842,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         Q_ASSERT(d <= 0);
         if (d == 0) {
             result.second = current;
@@ -1864,7 +1864,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         if (d == 0)
             break;
         if (d < 0) {
@@ -1885,7 +1885,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         Q_ASSERT(d >= 0);
         if (d == 0) {
             current = current->left;
@@ -1899,7 +1899,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(point, v1, v2);
+        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
         Q_ASSERT(d <= 0);
         if (d == 0) {
             current = current->right;
@@ -1962,7 +1962,7 @@ void QTriangulator<T>::ComplexToSimple::reorderEdgeListRange(QRBTree<int>::Node
 template <typename T>
 void QTriangulator<T>::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint)
 {
-    QIntersectionPoint eventPoint2 = qIntersectionPoint(eventPoint);
+    QIntersectionPoint eventPoint2 = ::qIntersectionPoint(eventPoint);
     while (!m_topIntersection.isEmpty() && m_topIntersection.top().intersectionPoint < eventPoint2) {
         Intersection intersection = m_topIntersection.pop();
 
@@ -2056,7 +2056,7 @@ void QTriangulator<T>::ComplexToSimple::calculateIntersections()
         QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> range = bounds(event.point);
         QRBTree<int>::Node *leftNode = range.first ? m_edgeList.previous(range.first) : 0;
         int vertex = (event.type == Event::Upper ? m_edges.at(event.edge).upper() : m_edges.at(event.edge).lower());
-        QIntersectionPoint eventPoint = qIntersectionPoint(event.point);
+        QIntersectionPoint eventPoint = ::qIntersectionPoint(event.point);
 
         if (range.first != 0) {
             splitEdgeListRange(range.first, range.second, vertex, eventPoint);
@@ -2213,7 +2213,7 @@ void QTriangulator<T>::ComplexToSimple::removeUnwantedEdgesAndConnect()
             while (current != b.second) {
                 Q_ASSERT(current);
                 Q_ASSERT(m_edges.at(current->data).node == current);
-                Q_ASSERT(qIntersectionPoint(event.point).isOnLine(m_parent->m_vertices.at(m_edges.at(current->data).from), m_parent->m_vertices.at(m_edges.at(current->data).to)));
+                Q_ASSERT(::qIntersectionPoint(event.point).isOnLine(m_parent->m_vertices.at(m_edges.at(current->data).from), m_parent->m_vertices.at(m_edges.at(current->data).to)));
                 Q_ASSERT(m_parent->m_vertices.at(m_edges.at(current->data).from) == event.point || m_parent->m_vertices.at(m_edges.at(current->data).to) == event.point);
                 insertEdgeIntoVectorIfWanted(orderedEdges, current->data);
                 current = m_edgeList.next(current);
@@ -2612,10 +2612,10 @@ bool QTriangulator<T>::SimpleToMonotone::edgeIsLeftOfEdge(int leftEdgeIndex, int
     const Edge &rightEdge = m_edges.at(rightEdgeIndex);
     const QPodPoint &u = m_parent->m_vertices.at(rightEdge.upper());
     const QPodPoint &l = m_parent->m_vertices.at(rightEdge.lower());
-    qint64 d = qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.upper()), l, u);
+    qint64 d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.upper()), l, u);
     // d < 0: left, d > 0: right, d == 0: on top
     if (d == 0)
-        d = qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
+        d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
     return d < 0;
 }
 
@@ -2645,7 +2645,7 @@ QRBTree<int>::Node *QTriangulator<T>::SimpleToMonotone::searchEdgeLeftOfPoint(in
     while (current) {
         const QPodPoint &p1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &p2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = qPointDistanceFromLine(m_parent->m_vertices.at(pointIndex), p1, p2);
+        qint64 d = ::qPointDistanceFromLine(m_parent->m_vertices.at(pointIndex), p1, p2);
         if (d <= 0) {
             current = current->left;
         } else {
@@ -2668,7 +2668,7 @@ void QTriangulator<T>::SimpleToMonotone::classifyVertex(int i)
     const QPodPoint &p1 = m_parent->m_vertices.at(e1.from);
     const QPodPoint &p2 = m_parent->m_vertices.at(e2.from);
     const QPodPoint &p3 = m_parent->m_vertices.at(e2.to);
-    qint64 d = qPointDistanceFromLine(p1, p2, p3);
+    qint64 d = ::qPointDistanceFromLine(p1, p2, p3);
     Q_ASSERT(d != 0 || (!startOrSplit && !endOrMerge));
 
     e2.type = RegularVertex;
-- 
cgit v0.12


From dfd5ee41532b55ef6aaa5fb7ed3b586fbac80fce Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Thu, 18 Nov 2010 12:39:09 +0200
Subject: Make epocroot resolving compatible with more build environments

This commit prepares epocroot.cpp and registry.cpp to be compilable
by lrelease and corelib.

Task-number: QTBUG-15393
Reviewed-by: axis
---
 tools/shared/symbian/epocroot.cpp | 100 ++++++++++++++++++--------------------
 tools/shared/windows/registry.cpp |   8 +--
 2 files changed, 51 insertions(+), 57 deletions(-)

diff --git a/tools/shared/symbian/epocroot.cpp b/tools/shared/symbian/epocroot.cpp
index ae1dcb1..9d7d465 100644
--- a/tools/shared/symbian/epocroot.cpp
+++ b/tools/shared/symbian/epocroot.cpp
@@ -64,23 +64,13 @@
 // Stored as a static value in order to avoid unnecessary re-evaluation.
 static QString epocRootValue;
 
-#ifdef QT_BUILD_QMAKE
-std::ostream &operator<<(std::ostream &s, const QString &val) {
-    s << val.toLocal8Bit().data();
-    return s;
-}
-#else
-// Operator implemented in configureapp.cpp
-std::ostream &operator<<(std::ostream &s, const QString &val);
-#endif
-
 QString getDevicesXmlPath()
     {
     // Note that the following call will return a null string on platforms other
     // than Windows.  If support is required on other platforms for devices.xml,
     // an alternative mechanism for retrieving the location of this file will
     // be required.
-    return readRegistryKey(SYMBIAN_SDKS_REG_HANDLE, SYMBIAN_SDKS_REG_SUBKEY);
+    return readRegistryKey(SYMBIAN_SDKS_REG_HANDLE, QLatin1String(SYMBIAN_SDKS_REG_SUBKEY));
     }
 
 /**
@@ -92,7 +82,8 @@ void checkEpocRootExists(const QString &source)
     if (!epocRootValue.isEmpty()) {
         QDir dir(epocRootValue);
         if (!dir.exists()) {
-            std::cerr << "Warning: " << source << " is set to an invalid path: " << epocRootValue << std::endl;
+            qWarning("Warning: %s is set to an invalid path: '%s'", qPrintable(source),
+                     qPrintable(epocRootValue));
             epocRootValue = QString();
         }
     }
@@ -103,10 +94,10 @@ void checkEpocRootExists(const QString &source)
  */
 static void fixEpocRoot(QString &path)
 {
-    path.replace("\\", "/");
+    path.replace(QLatin1Char('\\'), QLatin1Char('/'));
 
-    if (!path.size() || path[path.size()-1] != QChar('/')) {
-        path += QChar('/');
+    if (!path.size() || path[path.size()-1] != QLatin1Char('/')) {
+        path += QLatin1Char('/');
     }
 }
 
@@ -118,17 +109,15 @@ QString epocRoot()
     if (epocRootValue.isEmpty()) {
         // 1. If environment variable EPOCROOT is set and points to an existent
         //    directory, this is returned.
-        epocRootValue = qgetenv("EPOCROOT");
-        checkEpocRootExists("EPOCROOT");
+        epocRootValue = QString::fromLocal8Bit(qgetenv("EPOCROOT").constData());
+        checkEpocRootExists(QLatin1String("EPOCROOT environment variable"));
 
         if (epocRootValue.isEmpty()) {
             // 2. The location of devices.xml is specified by a registry key.  If this
             //    file exists, it is parsed.
             QString devicesXmlPath = getDevicesXmlPath();
-            if (devicesXmlPath.isEmpty()) {
-                std::cerr << "Error: Symbian SDK registry key not found" << std::endl;
-            } else {
-                devicesXmlPath += "/devices.xml";
+            if (!devicesXmlPath.isEmpty()) {
+                devicesXmlPath += QLatin1String("/devices.xml");
                 QFile devicesFile(devicesXmlPath);
                 if (devicesFile.open(QIODevice::ReadOnly)) {
 
@@ -138,87 +127,90 @@ QString epocRoot()
                     // 4. If a device element marked as default is found in devices.xml and its
                     //    epocroot value points to an existent directory, this is returned.
 
-                    const QString epocDeviceValue = qgetenv("EPOCDEVICE");
+                    const QString epocDeviceValue = QString::fromLocal8Bit(qgetenv("EPOCDEVICE").constData());
                     bool epocDeviceFound = false;
 
                     QXmlStreamReader xml(&devicesFile);
                     while (!xml.atEnd()) {
                         xml.readNext();
-                        if (xml.isStartElement() && xml.name() == "devices") {
-                            if (xml.attributes().value("version") == "1.0") {
-                                while (!(xml.isEndElement() && xml.name() == "devices") && !xml.atEnd()) {
+                        if (xml.isStartElement() && xml.name() == QLatin1String("devices")) {
+                            if (xml.attributes().value(QLatin1String("version")) == QLatin1String("1.0")) {
+                                while (!(xml.isEndElement() && xml.name() == QLatin1String("devices")) && !xml.atEnd()) {
                                     xml.readNext();
-                                    if (xml.isStartElement() && xml.name() == "device") {
-                                        const bool isDefault = xml.attributes().value("default") == "yes";
-                                        const QString id = xml.attributes().value("id").toString();
-                                        const QString name = xml.attributes().value("name").toString();
-                                        const QString alias = xml.attributes().value("alias").toString();
-                                        bool epocDeviceMatch = (id + ":" + name) == epocDeviceValue;
+                                    if (xml.isStartElement() && xml.name() == QLatin1String("device")) {
+                                        const bool isDefault = xml.attributes().value(QLatin1String("default")) == QLatin1String("yes");
+                                        const QString id = xml.attributes().value(QLatin1String("id")).toString();
+                                        const QString name = xml.attributes().value(QLatin1String("name")).toString();
+                                        const QString alias = xml.attributes().value(QLatin1String("alias")).toString();
+                                        bool epocDeviceMatch = QString(id + QLatin1String(":") + name) == epocDeviceValue;
                                         if (!alias.isEmpty())
                                             epocDeviceMatch |= alias == epocDeviceValue;
                                         epocDeviceFound |= epocDeviceMatch;
 
                                         if((epocDeviceValue.isEmpty() && isDefault) || epocDeviceMatch) {
                                             // Found a matching device
-                                            while (!(xml.isEndElement() && xml.name() == "device") && !xml.atEnd()) {
+                                            while (!(xml.isEndElement() && xml.name() == QLatin1String("device")) && !xml.atEnd()) {
                                                 xml.readNext();
-                                                if (xml.isStartElement() && xml.name() == "epocroot") {
+                                                if (xml.isStartElement() && xml.name() == QLatin1String("epocroot")) {
                                                     epocRootValue = xml.readElementText();
                                                     const QString deviceSource = epocDeviceValue.isEmpty()
-                                                        ? "default device"
-                                                        : "EPOCDEVICE (" + epocDeviceValue + ")";
+                                                        ? QLatin1String("default device")
+                                                        : QString(QLatin1String("EPOCDEVICE (") + epocDeviceValue + QLatin1String(")"));
                                                     checkEpocRootExists(deviceSource);
                                                 }
                                             }
 
                                             if (epocRootValue.isEmpty())
-                                                xml.raiseError("No epocroot element found");
+                                                xml.raiseError(QLatin1String("No epocroot element found"));
                                         }
                                     }
                                 }
                             } else {
-                                xml.raiseError("Invalid 'devices' element version");
+                                xml.raiseError(QLatin1String("Invalid 'devices' element version"));
                             }
                         }
                     }
                     if (xml.hasError()) {
-                        std::cerr << "Error: \"" << xml.errorString() << "\" when parsing devices.xml" << std::endl;
+                        qWarning("Warning: Error \"%s\" when parsing devices.xml",
+                                 qPrintable(xml.errorString()));
                     } else {
                         if (epocRootValue.isEmpty()) {
                             if (!epocDeviceValue.isEmpty()) {
                                 if (epocDeviceFound) {
-                                    std::cerr << "Error: missing or invalid epocroot attribute "
-                                              << "in device '" << epocDeviceValue << "'";
+                                    qWarning("Warning: Missing or invalid epocroot attribute in device '%s' in devices.xml.",
+                                             qPrintable(epocDeviceValue));
                                 } else {
-                                    std::cerr << "Error: no device matching EPOCDEVICE ("
-                                              << epocDeviceValue << ")";
+                                    qWarning("Warning: No device matching EPOCDEVICE (%s) in devices.xml.",
+                                             qPrintable(epocDeviceValue));
                                 }
                             } else {
                                 if (epocDeviceFound) {
-                                    std::cerr << "Error: missing or invalid epocroot attribute "
-                                              << "in default device";
+                                    qWarning("Warning: Missing or invalid epocroot attribute in default device in devices.xml.");
                                 } else {
-                                    std::cerr << "Error: no default device";
+                                    qWarning("Warning: No default device set in devices.xml.");
                                 }
                             }
-                            std::cerr << " found in devices.xml file." << std::endl;
                         }
                     }
                 } else {
-                    std::cerr << "Error: could not open file " << devicesXmlPath << std::endl;
+                    qWarning("Warning: Could not open file: '%s'.", qPrintable(devicesXmlPath));
                 }
             }
         }
 
         if (epocRootValue.isEmpty()) {
             // 5. An empty string is returned.
-            std::cerr << "Error: failed to find epoc root" << std::endl
-                 << "Either" << std::endl
-                 << "    1. Set EPOCROOT environment variable to a valid value" << std::endl
-                 << " or 2. Ensure that the HKEY_LOCAL_MACHINE\\" SYMBIAN_SDKS_REG_SUBKEY
-                    " registry key is set, and then" << std::endl
-                 << "       a. Set EPOCDEVICE environment variable to a valid device" << std::endl
-                 << "    or b. Specify a default device in the devices.xml file." << std::endl;
+            qWarning("Warning: failed to resolve epocroot."
+#ifdef Q_OS_WIN32
+                     "\nEither\n"
+                     "    1. Set EPOCROOT environment variable to a valid value.\n"
+                     " or 2. Ensure that the HKEY_LOCAL_MACHINE\\" SYMBIAN_SDKS_REG_SUBKEY
+                     " registry key is set, and then\n"
+                     "       a. Set EPOCDEVICE environment variable to a valid device\n"
+                     "    or b. Specify a default device in the devices.xml file.");
+#else
+                     " Set EPOCROOT environment variable to a valid value.");
+#endif
         } else {
             fixEpocRoot(epocRootValue);
         }
diff --git a/tools/shared/windows/registry.cpp b/tools/shared/windows/registry.cpp
index 67d9b56..2373839 100644
--- a/tools/shared/windows/registry.cpp
+++ b/tools/shared/windows/registry.cpp
@@ -42,6 +42,7 @@
 #include <QtCore/qstringlist.h>
 #include "registry.h"
 
+#ifdef Q_OS_WIN32
 /*!
   Returns the path part of a registry key.
   e.g.
@@ -73,10 +74,11 @@ static QString keyName(const QString &rKey)
         return rKey;
 
     QString res(rKey.mid(idx + 1));
-    if (res == "Default" || res == ".")
-        res = "";
+    if (res == QLatin1String("Default") || res == QLatin1String("."))
+        res = QString();
     return res;
 }
+#endif
 
 QString readRegistryKey(HKEY parentHandle, const QString &rSubkey)
 {
@@ -128,7 +130,7 @@ QString readRegistryKey(HKEY parentHandle, const QString &rSubkey)
                     break;
                 l.append(s);
             }
-            result = l.join(", ");
+            result = l.join(QLatin1String(", "));
             break;
         }
 
-- 
cgit v0.12


From bc09d5b11cd45e975ec745b508c703b75b019a4e Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Thu, 18 Nov 2010 15:23:03 +0200
Subject: Resolve EPOCROOT in qt.conf using same logic as in .pro

Previously it was only possible to use EPOCROOT in qt.conf via env
variable, while qmake & configure could resolve it also via devices.xml.
Changed qt.conf parsing to support $${EPOCROOT} tag and use same
resolving logic as qmake & configure.

Task-number: QTBUG-15393
Reviewed-by: axis
---
 qmake/Makefile.unix                  |  2 +-
 qmake/Makefile.win32                 |  3 ++-
 qmake/Makefile.win32-g++             |  2 +-
 qmake/Makefile.win32-g++-sh          |  2 +-
 qmake/qmake.pri                      |  2 +-
 src/corelib/global/global.pri        |  2 ++
 src/corelib/global/qlibraryinfo.cpp  | 12 ++++++++++++
 tools/linguist/lrelease/lrelease.pro |  1 +
 tools/shared/symbian/epocroot.pri    | 11 +++++++++++
 9 files changed, 32 insertions(+), 5 deletions(-)
 create mode 100644 tools/shared/symbian/epocroot.pri

diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index 8d56fc8..d941dc4 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -68,7 +68,7 @@ CPPFLAGS = -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/ma
 	   -I$(BUILD_PATH)/src/corelib/global -I$(BUILD_PATH)/src/corelib/xml \
 	   -I$(SOURCE_PATH)/tools/shared \
 	   -DQT_NO_PCRE \
-	   -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED \
+	   -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DQLIBRARYINFO_EPOCROOT \
 	   -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_NO_COMPONENT -DQT_NO_STL \
 	   -DQT_NO_COMPRESS -I$(QMAKESPEC) -DHAVE_QCONFIG_CPP -DQT_NO_THREAD -DQT_NO_QOBJECT \
            -DQT_NO_GEOM_VARIANT $(OPENSOURCE_CXXFLAGS)
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index 4d0121c..c04bcb2 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -40,7 +40,8 @@ CFLAGS_BARE = -c -Fo./ \
               -I$(SOURCE_PATH)\tools\shared \
               -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NODLL -DQT_NO_STL \
               -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP -DQT_BUILD_QMAKE -DQT_NO_THREAD \
-              -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQT_NO_PCRE -DQT_BOOTSTRAPPED
+              -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQT_NO_PCRE -DQT_BOOTSTRAPPED \
+              -DQLIBRARYINFO_EPOCROOT
 CFLAGS   = -Yuqmake_pch.h -FIqmake_pch.h -Fpqmake_pch.pch $(CFLAGS_BARE) $(CFLAGS)
 
 CXXFLAGS_BARE = $(CFLAGS_BARE)
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index f313f9e..29fbd0a 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -25,7 +25,7 @@ CFLAGS	    =	-c -o$@ -O \
 		-DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_PCRE \
 		-DQT_NODLL -DQT_NO_STL -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP \
 		-DQT_BUILD_QMAKE -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM \
-		-DQT_BOOTSTRAPPED
+		-DQT_BOOTSTRAPPED -DQLIBRARYINFO_EPOCROOT
 CXXFLAGS    =   $(CFLAGS)
 LFLAGS	    = -static-libgcc -static-libstdc++ -s
 LIBS	    = -lole32 -luuid
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index af54288..9c7942c 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -25,7 +25,7 @@ CFLAGS	    =	-c -o$@ -O \
 		-DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_PCRE \
 		-DQT_NODLL -DQT_NO_STL -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP \
 		-DQT_BUILD_QMAKE -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM \
-		-DQT_BOOTSTRAPPED
+		-DQT_BOOTSTRAPPED -DQLIBRARYINFO_EPOCROOT
 CXXFLAGS    =   $(CFLAGS)
 LFLAGS	    = -static-libgcc -static-libstdc++ -s
 LIBS	    = -lole32 -luuid
diff --git a/qmake/qmake.pri b/qmake/qmake.pri
index 36c5d36..7cf94cb 100644
--- a/qmake/qmake.pri
+++ b/qmake/qmake.pri
@@ -3,7 +3,7 @@ CONFIG += depend_includepath
 QMAKE_INCREMENTAL =
 SKIP_DEPENDS += qconfig.h qmodules.h
 DEFINES += QT_NO_TEXTCODEC QT_NO_LIBRARY QT_NO_STL QT_NO_COMPRESS QT_NO_UNICODETABLES \
-           QT_NO_GEOM_VARIANT QT_NO_DATASTREAM
+           QT_NO_GEOM_VARIANT QT_NO_DATASTREAM QLIBRARYINFO_EPOCROOT
 
 #qmake code
 SOURCES += project.cpp property.cpp main.cpp generators/makefile.cpp \
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
index 4800716..86800ef 100644
--- a/src/corelib/global/global.pri
+++ b/src/corelib/global/global.pri
@@ -27,3 +27,5 @@ linux*:!static:!linux-armcc:!linux-gcce {
 
 # Compensate for lack of platform defines in Symbian3 and Symbian4
 symbian: DEFINES += SYMBIAN_VERSION_$$upper($$replace(SYMBIAN_VERSION,\\.,_))
+
+include(../../../tools/shared/symbian/epocroot.pri)
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index 957abbf..acacf7c 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -62,6 +62,10 @@ QT_END_NAMESPACE
 #  include "private/qcore_mac_p.h"
 #endif
 
+#ifdef QLIBRARYINFO_EPOCROOT
+# include "symbian/epocroot.h"
+#endif
+
 #include "qconfig.cpp"
 
 QT_BEGIN_NAMESPACE
@@ -433,6 +437,14 @@ QLibraryInfo::location(LibraryLocation loc)
                             QString::fromLocal8Bit(qgetenv(ret.mid(rep + 2,
                                 reg_var.matchedLength() - 3).toLatin1().constData()).constData()));
             }
+
+#ifdef QLIBRARYINFO_EPOCROOT
+            // $${EPOCROOT} is a special case, resolve it similarly to qmake.
+            QRegExp epocrootMatcher(QLatin1String("\\$\\$\\{EPOCROOT\\}"));
+            if ((rep = epocrootMatcher.indexIn(ret)) != -1)
+                ret.replace(rep, epocrootMatcher.matchedLength(), epocRoot());
+#endif
+
             config->endGroup();
         }
     }
diff --git a/tools/linguist/lrelease/lrelease.pro b/tools/linguist/lrelease/lrelease.pro
index 6beafa3..89694be 100644
--- a/tools/linguist/lrelease/lrelease.pro
+++ b/tools/linguist/lrelease/lrelease.pro
@@ -15,6 +15,7 @@ macx:SOURCES += $$QT_SOURCE_TREE/src/corelib/io/qsettings_mac.cpp
 include(../../../src/tools/bootstrap/bootstrap.pri)
 include(../shared/formats.pri)
 include(../shared/proparser.pri)
+include(../../shared/symbian/epocroot.pri)
 
 win32:LIBS += -ladvapi32   # for qsettings_win.cpp
 
diff --git a/tools/shared/symbian/epocroot.pri b/tools/shared/symbian/epocroot.pri
new file mode 100644
index 0000000..117836e
--- /dev/null
+++ b/tools/shared/symbian/epocroot.pri
@@ -0,0 +1,11 @@
+# Epocroot resolving is only required for tools, so omit it from all mobile/embedded builds
+!symbian:!wince*:!embedded {
+HEADERS += \
+        $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.h \
+        $$QT_SOURCE_TREE/tools/shared/windows/registry.h
+SOURCES += \
+        $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.cpp \
+        $$QT_SOURCE_TREE/tools/shared/windows/registry.cpp
+INCLUDEPATH += $$QT_SOURCE_TREE/tools/shared
+DEFINES += QLIBRARYINFO_EPOCROOT
+}
-- 
cgit v0.12


From 8a298f78a8050bffff1d3c0135aa432a85747c2e Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Thu, 18 Nov 2010 16:59:42 +0200
Subject: Add symbian scope for qfiledialog_symbian.cpp

Missing symbian scope caused build break on non-symbian platforms.

Reviewed-by: Janne Koskinen
---
 src/gui/dialogs/dialogs.pri | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/dialogs/dialogs.pri b/src/gui/dialogs/dialogs.pri
index c7cb794..443c5e9 100644
--- a/src/gui/dialogs/dialogs.pri
+++ b/src/gui/dialogs/dialogs.pri
@@ -108,7 +108,7 @@ SOURCES += \
 	dialogs/qwizard.cpp \
         dialogs/qprintpreviewdialog.cpp
 
-contains(QT_CONFIG, s60) {
+symbian:contains(QT_CONFIG, s60) {
     LIBS += -lcommondialogs \
             -lavkon \
             -lplatformenv \
-- 
cgit v0.12


From 00e99440596d8bf648aefdfbb00e80004e328033 Mon Sep 17 00:00:00 2001
From: Titta Heikkala <EXT-Titta.2.Heikkala@nokia.com>
Date: Fri, 19 Nov 2010 09:47:55 +0200
Subject: Corrected ASCII comparison and removed extra braces

Corrected ASCII comparison and removed extra braces based on comments

Task-number: QT-3917
Reviewed-by: Janne Koskinen

Merge-request: 918
Reviewed-by: Janne Koskinen
---
 src/gui/dialogs/qfiledialog.cpp         |  3 +--
 src/gui/dialogs/qfiledialog_symbian.cpp | 32 ++++++++++++++------------------
 2 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index 1db9789..f3f7469 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1964,9 +1964,8 @@ QString QFileDialog::getExistingDirectory(QWidget *parent,
     if (qt_filedialog_existing_directory_hook && !(options & DontUseNativeDialog))
         return qt_filedialog_existing_directory_hook(parent, caption, dir, options);
 #if defined(Q_WS_S60)
-    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog)) {
+    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
         return qtSymbianGetExistingDirectory(caption, dir);
-    }
 #endif
     QFileDialogArgs args;
     args.parent = parent;
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
index 0277e1c..1f70305 100644
--- a/src/gui/dialogs/qfiledialog_symbian.cpp
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -86,26 +86,25 @@ public:
 
     TBool Accept(const TDesC &/*aDriveAndPath*/, const TEntry &aEntry) const
     {
-        if (aEntry.IsDir()) {
+        if (aEntry.IsDir())
             return ETrue;
-        }
-        if (filterList.isEmpty()) {
-            //No filter for files, all can be accepted
+
+        //If no filter for files, all can be accepted
+        if (filterList.isEmpty())
             return ETrue;
-        }
-        if (filterList == QStringList(QLatin1String("(*)"))) {
+
+        if (filterList == QStringList(QLatin1String("(*)")))
             return ETrue;
-        }
+
         for (int i = 0; i < filterList.size(); ++i) {
             QString extension = filterList.at(i);
             //remove '*' from the beginning of the extension
-            if (extension.left(1) == "*"){
-                extension = extension.right(extension.size() - 1);
-            }
+            if (extension.at(0) == QLatin1Char('*'))
+                extension = extension.mid(1);
+
             QString fileName = qt_TDesC2QString(aEntry.iName);
-            if (fileName.right(extension.size()) == extension) {
+            if (fileName.endsWith(extension))
                 return ETrue;
-            }
         }
         return EFalse;
     }
@@ -140,18 +139,15 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
             select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
                      startFolder, NULL, NULL, titlePtr, extensionFilter);
             CleanupStack::Pop(extensionFilter);
-        }
-        else if (dialogMode == DialogSave) {
+        } else if (dialogMode == DialogSave) {
             select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
                      startFolder, NULL, NULL, titlePtr);
-        }
-        else if (dialogMode == DialogFolder) {
+        } else if (dialogMode == DialogFolder) {
             select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
                         0, 0, titlePtr, NULL, NULL);
         }
-        if (select) {
+        if (select)
             selection.append(qt_TDesC2QString(target));
-        }
     );
 #endif
     return selection;
-- 
cgit v0.12


From 4b380543cc973d575a3ed0c77918adbe5b6133f0 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Fri, 19 Nov 2010 14:53:29 +0200
Subject: Fixed namespace issues related to epocroot.cpp

Task-number: QTBUG-15393
Reviewed-by: axis
---
 .../symbian/initprojectdeploy_symbian.cpp          | 12 ++--
 qmake/generators/symbian/symbiancommon.cpp         |  4 +-
 qmake/generators/symbian/symmake.cpp               | 10 +--
 qmake/generators/symbian/symmake_abld.cpp          |  4 +-
 qmake/generators/symbian/symmake_sbsv2.cpp         |  8 +--
 qmake/generators/win32/msvc_vcproj.cpp             |  6 +-
 qmake/project.cpp                                  |  4 +-
 qmake/qmake.pri                                    |  4 +-
 src/corelib/global/qlibraryinfo.cpp                |  4 +-
 tools/configure/configure.pro                      |  4 +-
 tools/configure/environment.cpp                    | 10 +--
 tools/shared/symbian/epocroot.cpp                  | 17 ++---
 tools/shared/symbian/epocroot.h                    | 67 -----------------
 tools/shared/symbian/epocroot.pri                  |  4 +-
 tools/shared/symbian/epocroot_p.h                  | 83 ++++++++++++++++++++++
 tools/shared/windows/registry.cpp                  |  7 +-
 tools/shared/windows/registry.h                    | 64 -----------------
 tools/shared/windows/registry_p.h                  | 80 +++++++++++++++++++++
 18 files changed, 214 insertions(+), 178 deletions(-)
 delete mode 100644 tools/shared/symbian/epocroot.h
 create mode 100644 tools/shared/symbian/epocroot_p.h
 delete mode 100644 tools/shared/windows/registry.h
 create mode 100644 tools/shared/windows/registry_p.h

diff --git a/qmake/generators/symbian/initprojectdeploy_symbian.cpp b/qmake/generators/symbian/initprojectdeploy_symbian.cpp
index 22a4a82..81236d4 100644
--- a/qmake/generators/symbian/initprojectdeploy_symbian.cpp
+++ b/qmake/generators/symbian/initprojectdeploy_symbian.cpp
@@ -47,7 +47,7 @@
 #include <qdebug.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 #define SYSBIN_DIR "/sys/bin"
 #define HW_Z_DIR "epoc32/data/z"
@@ -75,7 +75,7 @@ static bool isPlugin(const QFileInfo& info, const QString& devicePath)
             && (devicePath.size() < 8
              || (0 != devicePath.compare(QLatin1String(SYSBIN_DIR), Qt::CaseInsensitive)
                 && 0 != devicePath.mid(1).compare(QLatin1String(":" SYSBIN_DIR), Qt::CaseInsensitive)
-                && 0 != devicePath.compare(epocRoot() + QLatin1String(HW_Z_DIR SYSBIN_DIR))))) {
+                && 0 != devicePath.compare(qt_epocRoot() + QLatin1String(HW_Z_DIR SYSBIN_DIR))))) {
         return true;
     } else {
         return false;
@@ -182,7 +182,7 @@ void initProjectDeploySymbian(QMakeProject* project,
 
     QString deploymentDrive;
     if (0 == platform.compare(QLatin1String(ROM_DEPLOYMENT_PLATFORM))) {
-        deploymentDrive = epocRoot() + HW_Z_DIR;
+        deploymentDrive = qt_epocRoot() + HW_Z_DIR;
     } else {
         deploymentDrive = targetPathHasDriveLetter ? targetPath.left(2) : QLatin1String("c:");
     }
@@ -225,9 +225,9 @@ void initProjectDeploySymbian(QMakeProject* project,
         } else {
             if (0 == platform.compare(QLatin1String(EMULATOR_DEPLOYMENT_PLATFORM))) {
                 if (devicePathHasDriveLetter) {
-                    devicePath = epocRoot() + "epoc32/winscw/" + devicePath.remove(1, 1);
+                    devicePath = qt_epocRoot() + "epoc32/winscw/" + devicePath.remove(1, 1);
                 } else {
-                    devicePath = epocRoot() + "epoc32/winscw/c" + devicePath;
+                    devicePath = qt_epocRoot() + "epoc32/winscw/c" + devicePath;
                 }
             } else {
                 if (devicePathHasDriveLetter
@@ -278,7 +278,7 @@ void initProjectDeploySymbian(QMakeProject* project,
                             // Executables and libraries are deployed to \sys\bin
                             QFileInfo targetPath;
                             if (epocBuild)
-                                targetPath.setFile(epocRoot() + "epoc32/release/" + platform + "/" + build + "/");
+                                targetPath.setFile(qt_epocRoot() + "epoc32/release/" + platform + "/" + build + "/");
                             else
                                 targetPath.setFile(info.path() + QDir::separator());
                             if(devicePathHasDriveLetter) {
diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 2244a98..602bcc2 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -44,7 +44,7 @@
 #include <qxmlstream.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 #define RESOURCE_DIRECTORY_RESOURCE "\\\\resource\\\\apps\\\\"
 
@@ -417,7 +417,7 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile,
     QString zDir;
     remoteTestPath = QString("!:\\private\\%1").arg(privateDirUid);
     if (epocBuild)
-        zDir = epocRoot() + QLatin1String("epoc32/data/z");
+        zDir = qt_epocRoot() + QLatin1String("epoc32/data/z");
 
     DeploymentList depList;
     initProjectDeploySymbian(project, depList, remoteTestPath, true, epocBuild, "$(PLATFORM)", "$(TARGET)", generatedDirs, generatedFiles);
diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp
index e1426ab..7bebd56 100644
--- a/qmake/generators/symbian/symmake.cpp
+++ b/qmake/generators/symbian/symmake.cpp
@@ -50,7 +50,7 @@
 #include <qdebug.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 #define RESOURCE_DIRECTORY_MMP "/resource/apps"
 #define REGISTRATION_RESOURCE_DIRECTORY_HW "/private/10003a3f/import/apps"
@@ -87,10 +87,10 @@ QString SymbianMakefileGenerator::fixPathForMmp(const QString& origPath, const Q
 {
     static QString epocRootStr;
     if (epocRootStr.isEmpty()) {
-        epocRootStr = epocRoot();
+        epocRootStr = qt_epocRoot();
         QFileInfo efi(epocRootStr);
         if (!efi.exists() || epocRootStr.isEmpty()) {
-            fprintf(stderr, "Unable to resolve epocRoot '%s' to real dir on current drive, defaulting to '/' for mmp paths\n", qPrintable(epocRoot()));
+            fprintf(stderr, "Unable to resolve epocRoot '%s' to real dir on current drive, defaulting to '/' for mmp paths\n", qPrintable(qt_epocRoot()));
             epocRootStr = "/";
         } else {
             epocRootStr = efi.absoluteFilePath();
@@ -122,7 +122,7 @@ QString SymbianMakefileGenerator::absolutizePath(const QString& origPath)
     // Prepend epocroot to any paths beginning with "/epoc32/"
     QString resultPath = QDir::fromNativeSeparators(origPath);
     if (resultPath.startsWith("/epoc32/", Qt::CaseInsensitive))
-        resultPath = QDir::fromNativeSeparators(epocRoot()) + resultPath.mid(1);
+        resultPath = QDir::fromNativeSeparators(qt_epocRoot()) + resultPath.mid(1);
 
     QFileInfo fi(fileInfo(resultPath));
 
@@ -719,7 +719,7 @@ void SymbianMakefileGenerator::writeMmpFileLibraryPart(QTextStream& t)
                 // Hacky way to find out what kind of library it is. Check the
                 // ARMV5 build directory for library type. We default to shared
                 // library, since that is more common.
-                QString udebStaticLibLocation(epocRoot());
+                QString udebStaticLibLocation(qt_epocRoot());
                 QString urelStaticLibLocation(udebStaticLibLocation);
                 udebStaticLibLocation += QString("epoc32/release/armv5/udeb/%1.lib").arg(lib);
                 urelStaticLibLocation += QString("epoc32/release/armv5/urel/%1.lib").arg(lib);
diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp
index 7059a52..cd64325 100644
--- a/qmake/generators/symbian/symmake_abld.cpp
+++ b/qmake/generators/symbian/symmake_abld.cpp
@@ -49,7 +49,7 @@
 #include <qdebug.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 #define DO_NOTHING_TARGET "do_nothing"
 #define CREATE_TEMPS_TARGET "create_temps"
@@ -431,7 +431,7 @@ bool SymbianAbldMakefileGenerator::writeDeploymentTargets(QTextStream &t, bool i
     else
         t << WINSCW_DEPLOYMENT_TARGET ":" << endl;
 
-    QString remoteTestPath = epocRoot()
+    QString remoteTestPath = qt_epocRoot()
         + QDir::toNativeSeparators(QLatin1String(isRom ? "epoc32/data/z/private/"
                                                        : "epoc32/winscw/c/private/"))
         + privateDirUid;
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index b3f8ba2..f4a6132 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -49,7 +49,7 @@
 #include <qdebug.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 SymbianSbsv2MakefileGenerator::SymbianSbsv2MakefileGenerator() : SymbianMakefileGenerator() { }
 SymbianSbsv2MakefileGenerator::~SymbianSbsv2MakefileGenerator() { }
@@ -82,7 +82,7 @@ void SymbianSbsv2MakefileGenerator::exportFlm()
         QDir sourceDir = QDir(QLibraryInfo::location(QLibraryInfo::PrefixPath) + FLM_SOURCE_DIR);
         QFileInfoList sourceInfos = sourceDir.entryInfoList(QDir::Files);
 
-        QDir destDir(epocRoot() + FLM_DEST_DIR);
+        QDir destDir(qt_epocRoot() + FLM_DEST_DIR);
         if (!destDir.exists()) {
             if (destDir.mkpath(destDir.absolutePath()))
                 generatedDirs << destDir.absolutePath();
@@ -630,7 +630,7 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
     t << endl;
 
     // Write deployment rules
-    QString remoteTestPath = epocRoot() + QLatin1String("epoc32/winscw/c/private/") + privateDirUid;
+    QString remoteTestPath = qt_epocRoot() + QLatin1String("epoc32/winscw/c/private/") + privateDirUid;
     DeploymentList depList;
 
     //write emulator deployment
@@ -641,7 +641,7 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
     t << "#endif" << endl;
 
     //write ROM deployment
-    remoteTestPath = epocRoot() + QLatin1String("epoc32/data/z/private/") + privateDirUid;
+    remoteTestPath = qt_epocRoot() + QLatin1String("epoc32/data/z/private/") + privateDirUid;
     depList.clear();
     initProjectDeploySymbian(project, depList, remoteTestPath, false, true,
         QLatin1String(ROM_DEPLOYMENT_PLATFORM), QString(), generatedDirs, generatedFiles);
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index a8ff306..6f27515 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -67,7 +67,7 @@ QT_END_NAMESPACE
 
 #ifdef Q_OS_WIN32
 #include <qt_windows.h>
-#include <windows/registry.h>
+#include <windows/registry_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -119,7 +119,7 @@ DotNET which_dotnet_version()
     int installed = 0;
     int i = 0;
     for(; dotNetCombo[i].version; ++i) {
-        QString path = readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey);
+        QString path = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey);
         if(!path.isEmpty()) {
             ++installed;
             current_version = dotNetCombo[i].version;
@@ -136,7 +136,7 @@ DotNET which_dotnet_version()
 
     i = installed = 0;
     for(; dotNetCombo[i].version; ++i) {
-        QString productPath = readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey).toLower();
+        QString productPath = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey).toLower();
                 if (productPath.isEmpty())
                         continue;
         QStringList::iterator it;
diff --git a/qmake/project.cpp b/qmake/project.cpp
index fe08b7b..2586c57 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -64,7 +64,7 @@
 #include <stdlib.h>
 
 // Included from tools/shared
-#include <symbian/epocroot.h>
+#include <symbian/epocroot_p.h>
 
 #ifdef Q_OS_WIN32
 #define QT_POPEN _popen
@@ -3118,7 +3118,7 @@ QStringList &QMakeProject::values(const QString &_var, QMap<QString, QStringList
                 false));
     } else if (var == QLatin1String("EPOCROOT")) {
         if (place[var].isEmpty())
-            place[var] = QStringList(epocRoot());
+            place[var] = QStringList(qt_epocRoot());
     }
 #if defined(Q_OS_WIN32) && defined(Q_CC_MSVC)
       else if(var.startsWith(QLatin1String("QMAKE_TARGET."))) {
diff --git a/qmake/qmake.pri b/qmake/qmake.pri
index 7cf94cb..8f46a2e 100644
--- a/qmake/qmake.pri
+++ b/qmake/qmake.pri
@@ -36,8 +36,8 @@ HEADERS += project.h property.h generators/makefile.h \
            generators/symbian/symmake_abld.h \
            generators/symbian/symmake_sbsv2.h \
            generators/symbian/initprojectdeploy_symbian.h \
-           windows/registry.h \
-           symbian/epocroot.h
+           windows/registry_p.h \
+           symbian/epocroot_p.h
 
 contains(QT_EDITION, OpenSource) {
    DEFINES += QMAKE_OPENSOURCE_EDITION
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index acacf7c..898b860 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -63,7 +63,7 @@ QT_END_NAMESPACE
 #endif
 
 #ifdef QLIBRARYINFO_EPOCROOT
-# include "symbian/epocroot.h"
+# include "symbian/epocroot_p.h"
 #endif
 
 #include "qconfig.cpp"
@@ -442,7 +442,7 @@ QLibraryInfo::location(LibraryLocation loc)
             // $${EPOCROOT} is a special case, resolve it similarly to qmake.
             QRegExp epocrootMatcher(QLatin1String("\\$\\$\\{EPOCROOT\\}"));
             if ((rep = epocrootMatcher.indexIn(ret)) != -1)
-                ret.replace(rep, epocrootMatcher.matchedLength(), epocRoot());
+                ret.replace(rep, epocrootMatcher.matchedLength(), qt_epocRoot());
 #endif
 
             config->endGroup();
diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro
index 810f006..0a49fbe 100644
--- a/tools/configure/configure.pro
+++ b/tools/configure/configure.pro
@@ -63,8 +63,8 @@ HEADERS  = configureapp.h environment.h tools.h\
            $$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h \
            $$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.h \
            $$QT_SOURCE_TREE/src/corelib/xml/qxmlutils_p.h \
-           $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.h \
-           $$QT_SOURCE_TREE/tools/shared/windows/registry.h
+           $$QT_SOURCE_TREE/tools/shared/symbian/epocroot_p.h \
+           $$QT_SOURCE_TREE/tools/shared/windows/registry_p.h
 
 
 SOURCES  = main.cpp configureapp.cpp environment.cpp tools.cpp \
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 03fd0cc..1866ef4 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -60,8 +60,8 @@ using namespace std;
 #include <qt_windows.h>
 #endif
 
-#include <symbian/epocroot.h> // from tools/shared
-#include <windows/registry.h> // from tools/shared
+#include <symbian/epocroot_p.h> // from tools/shared
+#include <windows/registry_p.h> // from tools/shared
 
 QT_BEGIN_NAMESPACE
 
@@ -163,7 +163,7 @@ Compiler Environment::detectCompiler()
     QString paths = qgetenv("PATH");
     QStringList pathlist = paths.toLower().split(";");
     for(int i = 0; compiler_info[i].compiler; ++i) {
-        QString productPath = readRegistryKey(HKEY_LOCAL_MACHINE, compiler_info[i].regKey).toLower();
+        QString productPath = qt_readRegistryKey(HKEY_LOCAL_MACHINE, compiler_info[i].regKey).toLower();
         if (productPath.length()) {
             QStringList::iterator it;
             for(it = pathlist.begin(); it != pathlist.end(); ++it) {
@@ -466,8 +466,8 @@ bool Environment::rmdir(const QString &name)
 
 QString Environment::symbianEpocRoot()
 {
-    // Call function defined in tools/shared/symbian/epocroot.h
-    return ::epocRoot();
+    // Call function defined in tools/shared/symbian/epocroot_p.h
+    return ::qt_epocRoot();
 }
 
 QT_END_NAMESPACE
diff --git a/tools/shared/symbian/epocroot.cpp b/tools/shared/symbian/epocroot.cpp
index 9d7d465..eabae98 100644
--- a/tools/shared/symbian/epocroot.cpp
+++ b/tools/shared/symbian/epocroot.cpp
@@ -39,13 +39,13 @@
 **
 ****************************************************************************/
 
-#include <iostream>
-
 #include <QtCore/qdir.h>
 #include <QtCore/qxmlstream.h>
 
-#include "epocroot.h"
-#include "../windows/registry.h"
+#include "epocroot_p.h"
+#include "../windows/registry_p.h"
+
+QT_BEGIN_NAMESPACE
 
 // Registry key under which the location of the Symbian devices.xml file is
 // stored.
@@ -64,20 +64,20 @@
 // Stored as a static value in order to avoid unnecessary re-evaluation.
 static QString epocRootValue;
 
-QString getDevicesXmlPath()
+static QString getDevicesXmlPath()
     {
     // Note that the following call will return a null string on platforms other
     // than Windows.  If support is required on other platforms for devices.xml,
     // an alternative mechanism for retrieving the location of this file will
     // be required.
-    return readRegistryKey(SYMBIAN_SDKS_REG_HANDLE, QLatin1String(SYMBIAN_SDKS_REG_SUBKEY));
+    return qt_readRegistryKey(SYMBIAN_SDKS_REG_HANDLE, QLatin1String(SYMBIAN_SDKS_REG_SUBKEY));
     }
 
 /**
  * Checks whether epocRootValue points to an existent directory.
  * If not, epocRootValue is set to an empty string and an error message is printed.
  */
-void checkEpocRootExists(const QString &source)
+static void checkEpocRootExists(const QString &source)
 {
     if (!epocRootValue.isEmpty()) {
         QDir dir(epocRootValue);
@@ -104,7 +104,7 @@ static void fixEpocRoot(QString &path)
 /**
  * Determine the epoc root for the currently active SDK.
  */
-QString epocRoot()
+QString qt_epocRoot()
 {
     if (epocRootValue.isEmpty()) {
         // 1. If environment variable EPOCROOT is set and points to an existent
@@ -219,3 +219,4 @@ QString epocRoot()
     return epocRootValue;
 }
 
+QT_END_NAMESPACE
diff --git a/tools/shared/symbian/epocroot.h b/tools/shared/symbian/epocroot.h
deleted file mode 100644
index 9846485..0000000
--- a/tools/shared/symbian/epocroot.h
+++ /dev/null
@@ -1,67 +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 qmake application 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 SYMBIAN_EPOCROOT_H
-#define SYMBIAN_EPOCROOT_H
-
-#include <QtCore/qstring.h>
-
-/**
- * Determine the epoc root for the currently active SDK.
- *
- * The algorithm used is as follows:
- * 1. If environment variable EPOCROOT is set and points to an existent
- *    directory, this is returned.
- * 2. The location of devices.xml is specified by a registry key.  If this
- *    file exists, it is parsed.
- * 3. If the EPOCDEVICE environment variable is set and a corresponding
- *    entry is found in devices.xml, and its epocroot value points to an
- *    existent directory, it is returned.
- * 4. If a device element marked as default is found in devices.xml and its
- *    epocroot value points to an existent directory, this is returned.
- * 5. An empty string is returned.
- *
- * Any return value other than the empty string therefore is guaranteed to
- * point to an existent directory.
- */
-QString epocRoot();
-
-#endif // EPOCROOT_H
diff --git a/tools/shared/symbian/epocroot.pri b/tools/shared/symbian/epocroot.pri
index 117836e..f0f0dab 100644
--- a/tools/shared/symbian/epocroot.pri
+++ b/tools/shared/symbian/epocroot.pri
@@ -1,8 +1,8 @@
 # Epocroot resolving is only required for tools, so omit it from all mobile/embedded builds
 !symbian:!wince*:!embedded {
 HEADERS += \
-        $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.h \
-        $$QT_SOURCE_TREE/tools/shared/windows/registry.h
+        $$QT_SOURCE_TREE/tools/shared/symbian/epocroot_p.h \
+        $$QT_SOURCE_TREE/tools/shared/windows/registry_p.h
 SOURCES += \
         $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.cpp \
         $$QT_SOURCE_TREE/tools/shared/windows/registry.cpp
diff --git a/tools/shared/symbian/epocroot_p.h b/tools/shared/symbian/epocroot_p.h
new file mode 100644
index 0000000..c97b593
--- /dev/null
+++ b/tools/shared/symbian/epocroot_p.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** 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 qmake application 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 QT_SYMBIAN_EPOCROOT_H
+#define QT_SYMBIAN_EPOCROOT_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 <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+/**
+ * Determine the epoc root for the currently active SDK.
+ *
+ * The algorithm used is as follows:
+ * 1. If environment variable EPOCROOT is set and points to an existent
+ *    directory, this is returned.
+ * 2. The location of devices.xml is specified by a registry key.  If this
+ *    file exists, it is parsed.
+ * 3. If the EPOCDEVICE environment variable is set and a corresponding
+ *    entry is found in devices.xml, and its epocroot value points to an
+ *    existent directory, it is returned.
+ * 4. If a device element marked as default is found in devices.xml and its
+ *    epocroot value points to an existent directory, this is returned.
+ * 5. An empty string is returned.
+ *
+ * Any return value other than the empty string therefore is guaranteed to
+ * point to an existent directory.
+ */
+QString qt_epocRoot();
+
+QT_END_NAMESPACE
+
+#endif // QT_SYMBIAN_EPOCROOT_H
+
diff --git a/tools/shared/windows/registry.cpp b/tools/shared/windows/registry.cpp
index 2373839..48e9ae6 100644
--- a/tools/shared/windows/registry.cpp
+++ b/tools/shared/windows/registry.cpp
@@ -40,7 +40,9 @@
 ****************************************************************************/
 
 #include <QtCore/qstringlist.h>
-#include "registry.h"
+#include "registry_p.h"
+
+QT_BEGIN_NAMESPACE
 
 #ifdef Q_OS_WIN32
 /*!
@@ -80,7 +82,7 @@ static QString keyName(const QString &rKey)
 }
 #endif
 
-QString readRegistryKey(HKEY parentHandle, const QString &rSubkey)
+QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
 {
     QString result;
 
@@ -160,4 +162,5 @@ QString readRegistryKey(HKEY parentHandle, const QString &rSubkey)
     return result;
 }
 
+QT_END_NAMESPACE
 
diff --git a/tools/shared/windows/registry.h b/tools/shared/windows/registry.h
deleted file mode 100644
index 3896527..0000000
--- a/tools/shared/windows/registry.h
+++ /dev/null
@@ -1,64 +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 qmake application 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 WINDOWS_REGISTRY_H
-#define WINDOWS_REGISTRY_H
-
-#include <QtCore/qglobal.h>
-
-#ifdef Q_OS_WIN32
-   #include <QtCore/qt_windows.h>
-#else
-    typedef void* HKEY;
-#endif
-
-#include <QtCore/qstring.h>
-
-/**
- * Read a value from the Windows registry.
- *
- * If the key is not found, or the registry cannot be accessed (for example
- * if this code is compiled for a platform other than Windows), a null
- * string is returned.
- */
-QString readRegistryKey(HKEY parentHandle, const QString &rSubkey);
-
-#endif // WINDOWS_REGISTRY_H
diff --git a/tools/shared/windows/registry_p.h b/tools/shared/windows/registry_p.h
new file mode 100644
index 0000000..4aae5f9
--- /dev/null
+++ b/tools/shared/windows/registry_p.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** 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 qmake application 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 QT_WINDOWS_REGISTRY_H
+#define QT_WINDOWS_REGISTRY_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.
+//
+
+QT_BEGIN_NAMESPACE
+
+#include <QtCore/qglobal.h>
+
+#ifdef Q_OS_WIN32
+   #include <QtCore/qt_windows.h>
+#else
+    typedef void* HKEY;
+#endif
+
+#include <QtCore/qstring.h>
+
+/**
+ * Read a value from the Windows registry.
+ *
+ * If the key is not found, or the registry cannot be accessed (for example
+ * if this code is compiled for a platform other than Windows), a null
+ * string is returned.
+ */
+QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey);
+
+QT_END_NAMESPACE
+
+#endif // QT_WINDOWS_REGISTRY_H
+
-- 
cgit v0.12


From ea440d1897c7c9d69401ac293663fbc4f2866d08 Mon Sep 17 00:00:00 2001
From: Joaquim Rocha <jrocha@igalia.com>
Date: Mon, 15 Nov 2010 13:46:40 +0100
Subject: Fix wrong error assumption when converting "0.0" to double

The function qstrtod calls strtod without first resetting the errno
but verifying it nonetheless. This could lead to situations where
the errno was already set to ERANGE and hence it would mistakenly
assume the conversion could not be done right.

Merge-request: 2507
Reviewed-by: Harald Fernengel <harald.fernengel@nokia.com>
(cherry picked from commit 759c0b5ecf84201f36d44b4e6c46da1886d85dee)
---
 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 d152682..83d6dcd 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -7308,6 +7308,7 @@ Q_CORE_EXPORT char *qdtoa( double d, int mode, int ndigits, int *decpt, int *sig
 
 Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
 {
+    errno = 0;
     double ret = strtod((char*)s00, (char**)se);
     if (ok) {
       if((ret == 0.0l && errno == ERANGE)
-- 
cgit v0.12


From bafdb949583a3178449f68afe2e2621687e29de7 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Mon, 22 Nov 2010 10:03:00 +0100
Subject: Dynamically register the event number.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp | 12 +++++++++++-
 tools/qmeegographicssystemhelper/qmeegoswitchevent.h   | 12 +++++++-----
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
index b136ce8..22ea0fe 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
@@ -41,7 +41,9 @@
 
 #include "qmeegoswitchevent.h"
 
-QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent((QEvent::Type) QMeeGoSwitchEvent::SwitchEvent)
+static int switchEventNumber = -1;
+
+QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent(QMeeGoSwitchEvent::eventNumber())
 {
     name = graphicsSystemName;
     switchState = s;
@@ -55,4 +57,12 @@ QString QMeeGoSwitchEvent::graphicsSystemName() const
 QMeeGoSwitchEvent::State QMeeGoSwitchEvent::state() const
 {
     return switchState;
+}
+
+QEvent::Type QMeeGoSwitchEvent::eventNumber()
+{
+    if (switchEventNumber < 0)
+        switchEventNumber = QEvent::registerEventType();
+
+    return (QEvent::Type) switchEventNumber;
 }
\ No newline at end of file
diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
index 2d8371e..0ddbd3d 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
@@ -62,11 +62,6 @@ public:
         DidSwitch
     };
 
-    //! The event type id to use to detect this event.
-    enum Type {
-        SwitchEvent = QEvent::User + 1024
-    };
-
     //! Constructor for the event.
     /*!
      Creates a new event with the given name and the given state.
@@ -83,6 +78,13 @@ public:
     //! Returns the state represented by this event.
     State state() const;
 
+    //! Returns the event type/number for QMeeGoSwitchEvent.
+    /*!
+     The type is registered on first access. Use this to detect incoming
+     QMeeGoSwitchEvents.
+    */
+    QEvent::Type eventNumber();
+
 private:
     QString name;
     State switchState;
-- 
cgit v0.12


From 1ab855cd61581a073da86d2c64be0b889f004327 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 8 Nov 2010 21:48:52 +0100
Subject: Doc: Q_PROPERTY, implements the setter/getter in the example

Some developer thought the implementation of the getters and
setters needed to have some metaobject magic

Also add a NOTIFY signal in the example

Reviewed-by: Joao
---
 doc/src/snippets/code/doc_src_properties.qdoc | 17 ++++++++++++++---
 doc/src/snippets/moc/myclass2.h               |  7 +++++--
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/doc/src/snippets/code/doc_src_properties.qdoc b/doc/src/snippets/code/doc_src_properties.qdoc
index 7704160..a4ed409 100644
--- a/doc/src/snippets/code/doc_src_properties.qdoc
+++ b/doc/src/snippets/code/doc_src_properties.qdoc
@@ -91,7 +91,7 @@ for (int i=0; i<count; ++i) {
 class MyClass : public QObject
 {
     Q_OBJECT
-    Q_PROPERTY(Priority priority READ priority WRITE setPriority)
+    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
     Q_ENUMS(Priority)
 
 public:
@@ -100,8 +100,19 @@ public:
 
     enum Priority { High, Low, VeryHigh, VeryLow };
 
-    void setPriority(Priority priority);
-    Priority priority() const;
+    void setPriority(Priority priority)
+    {
+        m_priority = priority;
+        emit priorityChanged(priority);
+    }
+    Priority priority() const
+    { return m_priority; }
+
+signals:
+    void priorityChanged(Priority);
+
+private:
+    Priority m_priority;
 };
 //! [5]
 
diff --git a/doc/src/snippets/moc/myclass2.h b/doc/src/snippets/moc/myclass2.h
index ca79515..daea23c 100644
--- a/doc/src/snippets/moc/myclass2.h
+++ b/doc/src/snippets/moc/myclass2.h
@@ -58,8 +58,11 @@ public:
     MyClass(QObject *parent = 0);
     ~MyClass();
 
-    void setPriority(Priority priority);
-    Priority priority() const;
+    void setPriority(Priority priority) { m_priority = priority; }
+    Priority priority() const { return m_priority; }
+
+private:
+    Priority m_priority;
 };
 //! [0]
 
-- 
cgit v0.12


From 89fc2b639ac03fd851dc3a70cdbc530592a700cb Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 9 Nov 2010 11:17:45 +0100
Subject: Compile on OpenBSD

Fail to compile since f3405a516ac30fc7dee1

Reviewed-by: Joao
---
 src/corelib/thread/qthread_unix.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index a44a0e8..e3b587d 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -97,6 +97,11 @@
 # define SCHED_IDLE    5
 #endif
 
+#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#define QT_HAS_THREAD_PRIORITY_SCHEDULING
+#endif
+
+
 QT_BEGIN_NAMESPACE
 
 #ifndef QT_NO_THREAD
@@ -503,6 +508,7 @@ void QThread::usleep(unsigned long usecs)
     thread_sleep(&ti);
 }
 
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
 // Does some magic and calculate the Unix scheduler priorities
 // sched_policy is IN/OUT: it must be set to a valid policy before calling this function
 // sched_priority is OUT only
@@ -533,6 +539,7 @@ static bool calculateUnixPriority(int priority, int *sched_policy, int *sched_pr
     *sched_priority = prio;
     return true;
 }
+#endif
 
 void QThread::start(Priority priority)
 {
@@ -553,7 +560,7 @@ void QThread::start(Priority priority)
 
     d->priority = priority;
 
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && !defined(Q_OS_SYMBIAN) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#if defined(QT_HAS_THREAD_PRIORITY_SCHEDULING) && !defined(Q_OS_SYMBIAN)
 // ### Need to implement thread sheduling and priorities for symbian os. Implementation removed for now
     switch (priority) {
     case InheritPriority:
@@ -594,7 +601,7 @@ void QThread::start(Priority priority)
             break;
         }
     }
-#endif // _POSIX_THREAD_PRIORITY_SCHEDULING
+#endif // QT_HAS_THREAD_PRIORITY_SCHEDULING
 
 #ifdef Q_OS_SYMBIAN
     if (d->stackSize == 0)
@@ -757,7 +764,7 @@ void QThread::setPriority(Priority priority)
 
     // copied from start() with a few modifications:
 
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
     int sched_policy;
     sched_param param;
 
-- 
cgit v0.12


From 98337a5f32e58c0ea14e2b86b9fe8dcb22bfa4e3 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 5 Nov 2010 10:05:47 +0100
Subject: QMessageBox: change the documentation to reflect that it is
 application modal

QMessageBox was documented to be window modal, but it is actually
application modal.
Changing the behaviour now would be dangerous, as QMessageBox reenter
the event loop.
So update the documentation.

Task-bumber: QTBUG-14499
Reviewed-by: Joao
Reviewed-by: Denis
---
 src/gui/dialogs/qmessagebox.cpp | 88 ++++++++++++++---------------------------
 1 file changed, 30 insertions(+), 58 deletions(-)

diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index fe25b0f..2f8b9e2 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -776,10 +776,8 @@ QMessageBox::QMessageBox(QWidget *parent)
     added at any time using addButton(). The \a parent and \a f
     arguments are passed to the QDialog constructor.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     On Mac OS X, if \a parent is not 0 and you want your message box
     to appear as a Qt::Sheet of that parent, set the message box's
@@ -1549,10 +1547,8 @@ static QMessageBox::StandardButton showNewMessageBox(QWidget *parent,
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa question(), warning(), critical()
 */
@@ -1579,10 +1575,8 @@ QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QStr
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa information(), warning(), critical()
 */
@@ -1607,10 +1601,8 @@ QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa question(), information(), critical()
 */
@@ -1635,10 +1627,8 @@ QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -1670,7 +1660,7 @@ QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString
 
     The about box has a single button labelled "OK". On Mac OS X, the
     about box is popped up as a modeless window; on other platforms,
-    it is currently a window modal.
+    it is currently application modal.
 
     \sa QWidget::windowIcon(), QApplication::activeWindow()
 */
@@ -1723,7 +1713,7 @@ void QMessageBox::about(QWidget *parent, const QString &title, const QString &te
     QApplication provides this functionality as a slot.
 
     On Mac OS X, the about box is popped up as a modeless window; on
-    other platforms, it is currently window modal.
+    other platforms, it is currently application modal.
 
     \sa QApplication::aboutQt()
 */
@@ -1983,10 +1973,8 @@ void QMessageBoxPrivate::retranslateStrings()
 
     \snippet doc/src/snippets/dialogs/dialogs.cpp 2
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     The \a parent and \a f arguments are passed to
     the QDialog constructor.
@@ -2035,10 +2023,8 @@ QMessageBox::QMessageBox(const QString &title, const QString &text, Icon icon,
     Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2073,10 +2059,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
     supply 0, 1 or 2 to make pressing \key Esc equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2125,10 +2109,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
     Returns the identity (QMessageBox::Yes, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2163,10 +2145,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
     supply 0, 1 or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2215,10 +2195,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
     Returns the identity (QMessageBox::Ok or QMessageBox::No or ...)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2253,10 +2231,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
     supply 0, 1, or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2304,10 +2280,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
     Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2343,10 +2317,8 @@ int QMessageBox::critical(QWidget *parent, const QString &title, const QString&
     supply 0, 1, or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
-- 
cgit v0.12


From 202433ee1fd377ac36dc55fb466b9fc616b4d4fd Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 19 Nov 2010 09:57:18 +0100
Subject: QThread::exec():  Fix possibility to enter several time the event
 loop

If one call exit() before calling exec(), this should prevent the
event loop from starting once, but later calls to exec() should work.

This is a regression against Qt 4.6 introduced when fixing QTBUG-1184

Task-number: QTBUG-15378
Reviewed-by: Joao
Reviewed-by: Brad
---
 src/corelib/thread/qthread.cpp     |  4 +++-
 tests/auto/qthread/tst_qthread.cpp | 40 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 69b70cb..6fb182b 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -482,8 +482,10 @@ int QThread::exec()
     Q_D(QThread);
     QMutexLocker locker(&d->mutex);
     d->data->quitNow = false;
-    if (d->exited)
+    if (d->exited) {
+        d->exited = false;
         return d->returnCode;
+    }
     locker.unlock();
 
     QEventLoop eventLoop;
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 843749a..85b8f04 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -106,6 +106,7 @@ private slots:
     void adoptMultipleThreads();
 
     void QTBUG13810_exitAndStart();
+    void QTBUG15378_exitAndExec();
 
     void stressTest();
 };
@@ -976,5 +977,44 @@ void tst_QThread::QTBUG13810_exitAndStart()
 }
 
 
+void tst_QThread::QTBUG15378_exitAndExec()
+{
+    class Thread : public QThread {
+    public:
+        QSemaphore sem1;
+        QSemaphore sem2;
+        volatile int value;
+        void run() {
+            sem1.acquire();
+            value = exec();  //First entrence
+            sem2.release();
+            value = exec(); // Second loop
+        }
+    };
+    Thread thread;
+    thread.value = 0;
+    thread.start();
+    thread.exit(556);
+    thread.sem1.release(); //should exit the first loop
+    thread.sem2.acquire();
+    QCOMPARE(int(thread.value), 556);
+
+    //test that the thread is running by executing queued connected signal there
+    Syncronizer sync1;
+    sync1.moveToThread(&thread);
+    Syncronizer sync2;
+    sync2.moveToThread(&thread);
+    connect(&sync2, SIGNAL(propChanged(int)), &sync1, SLOT(setProp(int)), Qt::QueuedConnection);
+    connect(&sync1, SIGNAL(propChanged(int)), &thread, SLOT(quit()), Qt::QueuedConnection);
+    QMetaObject::invokeMethod(&sync2, "setProp", Qt::QueuedConnection , Q_ARG(int, 89));
+    QTest::qWait(50);
+    while(!thread.wait(10))
+        QTest::qWait(10);
+    QCOMPARE(sync2.m_prop, 89);
+    QCOMPARE(sync1.m_prop, 89);
+}
+
+
+
 QTEST_MAIN(tst_QThread)
 #include "tst_qthread.moc"
-- 
cgit v0.12


From 348fef0a406006ac813732ad5b8a143d8a63e879 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Mon, 22 Nov 2010 12:55:43 +0200
Subject: Fix a build break when namespace is defined

Reviewed-by: Jani Hautakangas
---
 src/opengl/gl2paintengineex/qtriangulator.cpp | 34 +++++++++++++--------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/opengl/gl2paintengineex/qtriangulator.cpp b/src/opengl/gl2paintengineex/qtriangulator.cpp
index 4c3deb6..75d5ce2 100644
--- a/src/opengl/gl2paintengineex/qtriangulator.cpp
+++ b/src/opengl/gl2paintengineex/qtriangulator.cpp
@@ -339,7 +339,7 @@ static inline qint64 qPointDistanceFromLine(const QPodPoint &p, const QPodPoint
 
 static inline bool qPointIsLeftOfLine(const QPodPoint &p, const QPodPoint &v1, const QPodPoint &v2)
 {
-    return ::qPointDistanceFromLine(p, v1, v2) < 0;
+    return QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(p, v1, v2) < 0;
 }
 
 // Return:
@@ -1741,7 +1741,7 @@ bool QTriangulator<T>::ComplexToSimple::calculateIntersection(int left, int righ
     Intersection intersection;
     intersection.leftEdge = left;
     intersection.rightEdge = right;
-    intersection.intersectionPoint = ::qIntersectionPoint(u1, u2, v1, v2);
+    intersection.intersectionPoint = QT_PREPEND_NAMESPACE(qIntersectionPoint)(u1, u2, v1, v2);
 
     if (!intersection.intersectionPoint.isValid())
         return false;
@@ -1767,10 +1767,10 @@ bool QTriangulator<T>::ComplexToSimple::edgeIsLeftOfEdge(int leftEdgeIndex, int
         return true;
     if (upper.x > qMax(l.x, u.x))
         return false;
-    qint64 d = ::qPointDistanceFromLine(upper, l, u);
+    qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(upper, l, u);
     // d < 0: left, d > 0: right, d == 0: on top
     if (d == 0)
-        d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
+        d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(m_parent->m_vertices.at(leftEdge.lower()), l, u);
     return d < 0;
 }
 
@@ -1814,7 +1814,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         if (d == 0) {
             result.first = result.second = current;
             break;
@@ -1828,7 +1828,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         Q_ASSERT(d >= 0);
         if (d == 0) {
             result.first = current;
@@ -1842,7 +1842,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         Q_ASSERT(d <= 0);
         if (d == 0) {
             result.second = current;
@@ -1864,7 +1864,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         if (d == 0)
             break;
         if (d < 0) {
@@ -1885,7 +1885,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         Q_ASSERT(d >= 0);
         if (d == 0) {
             current = current->left;
@@ -1899,7 +1899,7 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSim
     while (current) {
         const QPodPoint &v1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &v2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(point, v1, v2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(point, v1, v2);
         Q_ASSERT(d <= 0);
         if (d == 0) {
             current = current->right;
@@ -1962,7 +1962,7 @@ void QTriangulator<T>::ComplexToSimple::reorderEdgeListRange(QRBTree<int>::Node
 template <typename T>
 void QTriangulator<T>::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint)
 {
-    QIntersectionPoint eventPoint2 = ::qIntersectionPoint(eventPoint);
+    QIntersectionPoint eventPoint2 = QT_PREPEND_NAMESPACE(qIntersectionPoint)(eventPoint);
     while (!m_topIntersection.isEmpty() && m_topIntersection.top().intersectionPoint < eventPoint2) {
         Intersection intersection = m_topIntersection.pop();
 
@@ -2056,7 +2056,7 @@ void QTriangulator<T>::ComplexToSimple::calculateIntersections()
         QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> range = bounds(event.point);
         QRBTree<int>::Node *leftNode = range.first ? m_edgeList.previous(range.first) : 0;
         int vertex = (event.type == Event::Upper ? m_edges.at(event.edge).upper() : m_edges.at(event.edge).lower());
-        QIntersectionPoint eventPoint = ::qIntersectionPoint(event.point);
+        QIntersectionPoint eventPoint = QT_PREPEND_NAMESPACE(qIntersectionPoint)(event.point);
 
         if (range.first != 0) {
             splitEdgeListRange(range.first, range.second, vertex, eventPoint);
@@ -2213,7 +2213,7 @@ void QTriangulator<T>::ComplexToSimple::removeUnwantedEdgesAndConnect()
             while (current != b.second) {
                 Q_ASSERT(current);
                 Q_ASSERT(m_edges.at(current->data).node == current);
-                Q_ASSERT(::qIntersectionPoint(event.point).isOnLine(m_parent->m_vertices.at(m_edges.at(current->data).from), m_parent->m_vertices.at(m_edges.at(current->data).to)));
+                Q_ASSERT(QT_PREPEND_NAMESPACE(qIntersectionPoint)(event.point).isOnLine(m_parent->m_vertices.at(m_edges.at(current->data).from), m_parent->m_vertices.at(m_edges.at(current->data).to)));
                 Q_ASSERT(m_parent->m_vertices.at(m_edges.at(current->data).from) == event.point || m_parent->m_vertices.at(m_edges.at(current->data).to) == event.point);
                 insertEdgeIntoVectorIfWanted(orderedEdges, current->data);
                 current = m_edgeList.next(current);
@@ -2612,10 +2612,10 @@ bool QTriangulator<T>::SimpleToMonotone::edgeIsLeftOfEdge(int leftEdgeIndex, int
     const Edge &rightEdge = m_edges.at(rightEdgeIndex);
     const QPodPoint &u = m_parent->m_vertices.at(rightEdge.upper());
     const QPodPoint &l = m_parent->m_vertices.at(rightEdge.lower());
-    qint64 d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.upper()), l, u);
+    qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(m_parent->m_vertices.at(leftEdge.upper()), l, u);
     // d < 0: left, d > 0: right, d == 0: on top
     if (d == 0)
-        d = ::qPointDistanceFromLine(m_parent->m_vertices.at(leftEdge.lower()), l, u);
+        d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(m_parent->m_vertices.at(leftEdge.lower()), l, u);
     return d < 0;
 }
 
@@ -2645,7 +2645,7 @@ QRBTree<int>::Node *QTriangulator<T>::SimpleToMonotone::searchEdgeLeftOfPoint(in
     while (current) {
         const QPodPoint &p1 = m_parent->m_vertices.at(m_edges.at(current->data).lower());
         const QPodPoint &p2 = m_parent->m_vertices.at(m_edges.at(current->data).upper());
-        qint64 d = ::qPointDistanceFromLine(m_parent->m_vertices.at(pointIndex), p1, p2);
+        qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(m_parent->m_vertices.at(pointIndex), p1, p2);
         if (d <= 0) {
             current = current->left;
         } else {
@@ -2668,7 +2668,7 @@ void QTriangulator<T>::SimpleToMonotone::classifyVertex(int i)
     const QPodPoint &p1 = m_parent->m_vertices.at(e1.from);
     const QPodPoint &p2 = m_parent->m_vertices.at(e2.from);
     const QPodPoint &p3 = m_parent->m_vertices.at(e2.to);
-    qint64 d = ::qPointDistanceFromLine(p1, p2, p3);
+    qint64 d = QT_PREPEND_NAMESPACE(qPointDistanceFromLine)(p1, p2, p3);
     Q_ASSERT(d != 0 || (!startOrSplit && !endOrMerge));
 
     e2.type = RegularVertex;
-- 
cgit v0.12


From 7abb03d75155cef86df58f117031b092b637876f Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Mon, 22 Nov 2010 12:07:01 +0100
Subject: Round origin of text in OpenVG engine

The origin of text needs to be rounded, just like the translation in
the transform because text drawn at subpixel positions is unsupported
on some devices. Since the font is integer-based, the advance-array
does not need to be rounded.

Task-number: QTBUG-15263
Reviewed-by: Jason Barron
---
 src/openvg/qpaintengine_vg.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index aea203f..430575b 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -3543,8 +3543,8 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
 
     // Set the glyph drawing origin.
     VGfloat origin[2];
-    origin[0] = positions[0].x.toReal();
-    origin[1] = positions[0].y.toReal();
+    origin[0] = positions[0].x.round().toReal();
+    origin[1] = positions[0].y.round().toReal();
     vgSetfv(VG_GLYPH_ORIGIN, 2, origin);
 
     // Fast anti-aliasing for paths, better for images.
-- 
cgit v0.12


From d7d0b1528fd200fc3110093244b8265fdf457238 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Mon, 22 Nov 2010 15:14:25 +0200
Subject: Fix symbian-mmp.conf include path

Use $$[QT_INSTALL_DATA] instead of $$[QT_INSTALL_PREFIX] when adding
include path that points under mkspecs.

Task-number: QTBUG-15501
Reviewed-by: axis
---
 mkspecs/common/symbian/symbian-mmp.conf | 4 ++--
 mkspecs/features/symbian/stl.prf        | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mkspecs/common/symbian/symbian-mmp.conf b/mkspecs/common/symbian/symbian-mmp.conf
index 1fbd302..4d554bd 100644
--- a/mkspecs/common/symbian/symbian-mmp.conf
+++ b/mkspecs/common/symbian/symbian-mmp.conf
@@ -18,8 +18,8 @@ MMP_RULES += $$MMP_RULES_DONT_EXPORT_ALL_CLASS_IMPEDIMENTA
 SYMBIAN_PLATFORMS = WINSCW GCCE ARMV5 ARMV6
 
 INCLUDEPATH = \
-    $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian/stl-off \
-    $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian \
+    $$[QT_INSTALL_DATA]/mkspecs/common/symbian/stl-off \
+    $$[QT_INSTALL_DATA]/mkspecs/common/symbian \
     $${EPOCROOT}epoc32/include \
     $$OS_LAYER_LIBC_SYSTEMINCLUDE \
     $$INCLUDEPATH
diff --git a/mkspecs/features/symbian/stl.prf b/mkspecs/features/symbian/stl.prf
index 65d4b93..1fd5e16 100644
--- a/mkspecs/features/symbian/stl.prf
+++ b/mkspecs/features/symbian/stl.prf
@@ -12,7 +12,7 @@ INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE
 
 # Remove mkspecs/common/symbian/stl-off from beginning of includepath 
 # in order to use new and delete operators from STL
-INCLUDEPATH -= $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian/stl-off
+INCLUDEPATH -= $$[QT_INSTALL_DATA]/mkspecs/common/symbian/stl-off
 
 # libstdcppv5 is preferred over libstdcpp as it has/uses the throwing version of operator new
 # STDCPP turns on standard C++ new behaviour (ie. throwing new)
-- 
cgit v0.12


From 37f4e51127081f393743b5023f61ec48674cf7a2 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 22 Nov 2010 20:37:18 +0100
Subject: tst_qthread: fix compilation

---
 tests/auto/qthread/tst_qthread.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 85b8f04..b0efb5a 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -997,7 +997,8 @@ void tst_QThread::QTBUG15378_exitAndExec()
     thread.exit(556);
     thread.sem1.release(); //should exit the first loop
     thread.sem2.acquire();
-    QCOMPARE(int(thread.value), 556);
+    int v = thread.value;
+    QCOMPARE(v, 556);
 
     //test that the thread is running by executing queued connected signal there
     Syncronizer sync1;
-- 
cgit v0.12


From 787fd44a917f31d52b35cf168f2821d23d8be694 Mon Sep 17 00:00:00 2001
From: Damian Jansen <damian.jansen@nokia.com>
Date: Tue, 23 Nov 2010 12:04:23 +1000
Subject: Prevent crash when calling reload() from within a .qml

Task-number: QTBUG-15493
---
 tools/qml/qmlruntime.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 78bc409..7ea77d1 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -1012,7 +1012,7 @@ void QDeclarativeViewer::addPluginPath(const QString& plugin)
 
 void QDeclarativeViewer::reload()
 {
-    open(currentFileOrUrl);
+    launch(currentFileOrUrl);
 }
 
 void QDeclarativeViewer::openFile()
-- 
cgit v0.12


From 52068f57f9c32098a90cc217730a530f85590f65 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Tue, 23 Nov 2010 13:44:39 +1000
Subject: Ensure WebView press delay timer is cancelled when grab is taken.

Flickable steals the grab, but the timer was not stopped and the
keepGrab flag is set and the mouse grabbed. This means that the WebView
now has the grab and subsequent clicks on another element are ignored.

Task-number: QTBUG-15529
Reviewed-by: Joona Petrell
---
 .../WebKit/qt/declarative/qdeclarativewebview.cpp  |   10 +
 .../WebKit/qt/declarative/qdeclarativewebview_p.h  |    2 +
 .../webview/flickable/data/flickweb.0.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.1.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.10.png         |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.2.png          |  Bin 0 -> 3466 bytes
 .../webview/flickable/data/flickweb.3.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.4.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.5.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.6.png          |  Bin 0 -> 2768 bytes
 .../webview/flickable/data/flickweb.7.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.8.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.9.png          |  Bin 0 -> 2829 bytes
 .../qmlvisual/webview/flickable/data/flickweb.qml  | 6083 ++++++++++++++++++++
 .../qmlvisual/webview/flickable/flickweb.qml       |   35 +
 .../qmlvisual/webview/flickable/qtlogo.png         |  Bin 0 -> 2738 bytes
 .../qmlvisual/webview/flickable/test.html          |    3 +
 17 files changed, 6133 insertions(+)
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/test.html

diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
index e4f70de..7a8aae7 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
@@ -141,6 +141,16 @@ void GraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
         QGraphicsWebView::mouseMoveEvent(event);
 }
 
+bool GraphicsWebView::sceneEvent(QEvent *event)
+{
+    bool rv = QGraphicsWebView::sceneEvent(event);
+    if (event->type() == QEvent::UngrabMouse) {
+        pressTimer.stop();
+        parent->setKeepMouseGrab(false);
+    }
+    return rv;
+}
+
 /*!
     \qmlclass WebView QDeclarativeWebView
     \ingroup qml-view-elements
diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
index b2055bf..ca15a1e 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
@@ -70,6 +70,8 @@ protected:
     void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
     void timerEvent(QTimerEvent* event);
+    bool sceneEvent(QEvent *event);
+
 Q_SIGNALS:
     void doubleClick(int clickX, int clickY);
 private:
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png
new file mode 100644
index 0000000..1357551
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png
new file mode 100644
index 0000000..c61ae3f
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
new file mode 100644
index 0000000..c248167
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
@@ -0,0 +1,6083 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "flickweb.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 48
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 64
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 80
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 96
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 112
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 128
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 144
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 160
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 176
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 192
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 208
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 224
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 240
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 256
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 272
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 288
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 304
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 320
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 336
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 352
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 368
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 384
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 400
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 416
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 432
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 448
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 464
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 480
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 496
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 512
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 528
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 544
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 0; y: 7
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 0; y: 7
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 560
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 576
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 15; y: 11
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 592
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 608
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 624
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 640
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 11; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 656
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 672
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 688
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 11
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 704
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 720
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 736
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 14; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 18; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 752
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 19; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 22; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 768
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 22; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 23; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 784
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 800
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 23; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 816
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 832
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 848
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 864
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 880
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 896
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 912
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 928
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 944
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 72; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 960
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 97
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 976
+        image: "flickweb.1.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 992
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1008
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1024
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1040
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 105
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1056
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 106
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1072
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 108
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1088
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1104
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 110
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1120
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1136
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1152
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1168
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1184
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1200
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 92; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1216
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1232
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1248
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1264
+        hash: "e891b00cd44578b4a8e635ffe4c6d3fd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1280
+        hash: "61a543282ffb5e751ea1d97f0c95b208"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1296
+        hash: "102e4b664bade46ab3bbb611acee22c9"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1312
+        hash: "6bf42ac28a14db681442aeb7ed0c7610"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1328
+        hash: "ef531060d6b75cec8a6e3c01b3f69cc0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1344
+        hash: "e839af9d67f6214f0901977b3aa96d1a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1360
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1376
+        hash: "e4a562aa35aa532d15c9b129e22797bb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1392
+        hash: "029d347e9c99dd4a9cec5120ac7fc25e"
+    }
+    Frame {
+        msec: 1408
+        hash: "3c16a74e18a59630f35511ab5514c769"
+    }
+    Frame {
+        msec: 1424
+        hash: "5dc472d6c5198d5a628510bd45a61a11"
+    }
+    Frame {
+        msec: 1440
+        hash: "430d60127ed59dbc5904647424ead40d"
+    }
+    Frame {
+        msec: 1456
+        hash: "cb27cfcfbbb77b55c2a8bf7e51c0af07"
+    }
+    Frame {
+        msec: 1472
+        hash: "46f2eb33b0e8316c4123ddbee2f60ae2"
+    }
+    Frame {
+        msec: 1488
+        hash: "1df306111ca012c9f405018778c0a12b"
+    }
+    Frame {
+        msec: 1504
+        hash: "1eafab8fd457ad9acda068344178b4a8"
+    }
+    Frame {
+        msec: 1520
+        hash: "286656898100e53d6d7728b51ce93df5"
+    }
+    Frame {
+        msec: 1536
+        hash: "e2a88f0ba3030a430028147930989bbb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1552
+        hash: "fb23cf265c4d253470c2515043bc5dd8"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1568
+        hash: "1dba4f0e5e5948b7133725ea8bbef3e7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1584
+        hash: "8578965c5ad012284e4e0a14a42da25e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1600
+        hash: "3ef187decae08baa2ec92998c2cbb7f7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1616
+        hash: "4e0491128eac0bbfa7a131b1f18f243c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1632
+        hash: "c2d0799526e908204efbd3aa980e086c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1648
+        hash: "cc87e09a6784d61680f8c6ab0d6a38fa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 16
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1664
+        hash: "13dec7e835b4f26970f98b66533f84f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1680
+        hash: "e5d2862bee024b64326b7d85e5e45399"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1696
+        hash: "0b1401ce4a91811ac9c3eec5f94b380d"
+    }
+    Frame {
+        msec: 1712
+        hash: "0de290542c9d3e03ed78f51423011c16"
+    }
+    Frame {
+        msec: 1728
+        hash: "4c9aa06ad1e246b4b026742fc8cf37bc"
+    }
+    Frame {
+        msec: 1744
+        hash: "c33003a8262c2ba25510ece181e61bc9"
+    }
+    Frame {
+        msec: 1760
+        hash: "c33003a8262c2ba25510ece181e61bc9"
+    }
+    Frame {
+        msec: 1776
+        hash: "ad184fa88c4299b8911c9b7ada5b3736"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 85; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 13
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1792
+        hash: "ad184fa88c4299b8911c9b7ada5b3736"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1808
+        hash: "c2d0799526e908204efbd3aa980e086c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1824
+        hash: "b343a9ed7e9740ec1725837fad766745"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1840
+        hash: "b33260ad955474452f204ed5d468ef78"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1856
+        hash: "9a647c54e378bd0ee35ef4164892722c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 88; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 88; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1872
+        hash: "dc553d1a7b678dffea41147fc6b841f6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1888
+        hash: "2d61b4fb1e5a8beb6e3c3cb53c21db42"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1904
+        hash: "209faf0b20fd53d9a1c261c8cae9666f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1920
+        hash: "3497258aa07c76f0e31b5a492ee7e7cb"
+    }
+    Frame {
+        msec: 1936
+        image: "flickweb.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "64c677ac4fea0e525279e86bf831d5d3"
+    }
+    Frame {
+        msec: 1968
+        hash: "76c6c887fea94288e9fd975655e5181c"
+    }
+    Frame {
+        msec: 1984
+        hash: "71b85e596c88b84a851a52aa3389e63a"
+    }
+    Frame {
+        msec: 2000
+        hash: "e4a562aa35aa532d15c9b129e22797bb"
+    }
+    Frame {
+        msec: 2016
+        hash: "148484dd95c88720cc5ef196334cb9a8"
+    }
+    Frame {
+        msec: 2032
+        hash: "924c6254ffa1707b69174f49e4e95213"
+    }
+    Frame {
+        msec: 2048
+        hash: "9e61907acedb27941d8be2befa364cfb"
+    }
+    Frame {
+        msec: 2064
+        hash: "9e61907acedb27941d8be2befa364cfb"
+    }
+    Frame {
+        msec: 2080
+        hash: "f2c4e99db1bb087a40b277ce8ce628f6"
+    }
+    Frame {
+        msec: 2096
+        hash: "f2c4e99db1bb087a40b277ce8ce628f6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2112
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2128
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2144
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 87; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2160
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2176
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 71
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2192
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2208
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 76; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2224
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2240
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2256
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2272
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 67; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2288
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2304
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2320
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2336
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2352
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2368
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2384
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2400
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2416
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2432
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2448
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2464
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2480
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2496
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 16
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2512
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2528
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Frame {
+        msec: 2544
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Frame {
+        msec: 2560
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 73; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2576
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 73; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2592
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2608
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2624
+        hash: "c4dd48fca556c2760c8f81db7fea6938"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2640
+        hash: "9dbad8cb2692807d67f74e7ac4a4a70e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 70; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2656
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2672
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2688
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2704
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2720
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2736
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2752
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2768
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2784
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2800
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2816
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2832
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2848
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2864
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2880
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2896
+        image: "flickweb.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2928
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2944
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 98
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2960
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 67; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2976
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 62; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 60; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2992
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 56; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 55; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3008
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 52; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 49; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3024
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 49; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3040
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 46; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3056
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 42; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3072
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 39; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3088
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3104
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3120
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3136
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3152
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3168
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3184
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3200
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3216
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3232
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3248
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3264
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3280
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3296
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3312
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3328
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3344
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3360
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3376
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 40; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 55; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 78; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3616
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3696
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3728
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3744
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3760
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3776
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3792
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3808
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3824
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3840
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3856
+        image: "flickweb.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3888
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3904
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3920
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3936
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3952
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3968
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3984
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4000
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4016
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 97
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 100
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 105
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 110
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4656
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4736
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4816
+        image: "flickweb.5.png"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 83; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 84; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4912
+        hash: "f10fa114e248809ed280788d03a3e234"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4928
+        hash: "442357340d9690811d582f548f933d92"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4944
+        hash: "188b8f78b2a2180a8e96a8a05bb20fe2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4960
+        hash: "2b8ee42c5660f4f938cf10507690abbe"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4976
+        hash: "3d4aab388f62e64c5f72c631fb8584aa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4992
+        hash: "439364cea3330411f526093d58ece463"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5008
+        hash: "27653ec59651e6b3cb2ebf2bc81a975a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 52
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5024
+        hash: "d9c0fb2cbf968e0524291ae2570ca585"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5040
+        hash: "ef75df694a972985f410e21182dbb12b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5056
+        hash: "adda6aa851c1587c1bb2605809348725"
+    }
+    Frame {
+        msec: 5072
+        hash: "196c12052069f0f8c775aa38d3291bef"
+    }
+    Frame {
+        msec: 5088
+        hash: "eaa025b6aee87edf95643cc46880d0db"
+    }
+    Frame {
+        msec: 5104
+        hash: "edeab897b82df47ae6deb858eca3087e"
+    }
+    Frame {
+        msec: 5120
+        hash: "46e3b5da149cfc40036a860e74e0cd78"
+    }
+    Frame {
+        msec: 5136
+        hash: "46e3b5da149cfc40036a860e74e0cd78"
+    }
+    Frame {
+        msec: 5152
+        hash: "0fe9b13b9b0752ab4ad74f4e43f94d86"
+    }
+    Frame {
+        msec: 5168
+        hash: "0fe9b13b9b0752ab4ad74f4e43f94d86"
+    }
+    Frame {
+        msec: 5184
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5200
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5216
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5232
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5248
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5264
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5280
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5296
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5312
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5328
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5344
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5360
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5376
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5392
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5408
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5424
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5440
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5456
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5472
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5488
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5504
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5520
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5536
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5552
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5568
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5584
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5600
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5616
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5632
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 97; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5648
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5664
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5680
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5696
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5712
+        hash: "27653ec59651e6b3cb2ebf2bc81a975a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 58
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5728
+        hash: "f2a68c3a60002a796b0cd595ae89e477"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 71
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5744
+        hash: "2628ffe66f06c997d9c9b66febc04ce8"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5760
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 99; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 101; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 101; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5776
+        image: "flickweb.6.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5792
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 94
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5808
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5824
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Frame {
+        msec: 5840
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Frame {
+        msec: 5856
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Frame {
+        msec: 5872
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 106; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5888
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5904
+        hash: "ac600900160ab37ec8a3e67eb82d0259"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5920
+        hash: "ac600900160ab37ec8a3e67eb82d0259"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5936
+        hash: "dc3cef419e3b7d59f450d3307aeebefa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 96; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5952
+        hash: "dc3cef419e3b7d59f450d3307aeebefa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 94; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 93; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5968
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5984
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6000
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 79; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 76; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6016
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 72; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 61; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 58; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 54; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 53; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 51; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 46; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 40; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 42; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 52; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6656
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 60; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 58
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 77; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6736
+        image: "flickweb.7.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 87; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 93; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 94; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 106; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6816
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 110; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 116; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 122; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 124; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 125; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6912
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6928
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6944
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6960
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6976
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6992
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7008
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7024
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7040
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7056
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7072
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7088
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 126; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7104
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 127; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 129; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7120
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 132; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 134; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7136
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 139; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 144; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7152
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 148; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 154; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7168
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 158; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 162; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7184
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 164; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7200
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7216
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 162; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 159; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7232
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 151; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 146; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7248
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 129; y: 3
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7264
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7280
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7296
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7312
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7328
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7344
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7360
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7376
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7616
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7696
+        image: "flickweb.8.png"
+    }
+    Frame {
+        msec: 7712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7728
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7744
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7760
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7776
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7792
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7808
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7824
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7840
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7856
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7872
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7888
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7904
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7920
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7936
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7952
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7968
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7984
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8000
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8016
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8656
+        image: "flickweb.9.png"
+    }
+    Frame {
+        msec: 8672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8736
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8816
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8912
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8928
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8944
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8960
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8976
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8992
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9008
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9024
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9040
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9056
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9072
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9088
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9104
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9120
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9136
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9152
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9168
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9184
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9200
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9216
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9232
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9248
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9264
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9280
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9296
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9312
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9328
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9344
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9360
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9376
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9616
+        image: "flickweb.10.png"
+    }
+    Frame {
+        msec: 9632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9696
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
new file mode 100644
index 0000000..6063226
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
@@ -0,0 +1,35 @@
+import QtQuick 1.0
+import QtWebKit 1.0
+
+Flickable {
+    id: flickable
+    width: 320
+    height:  200
+    contentWidth: Math.max(flickable.width,webView.width)
+    contentHeight: Math.max(flickable.height,webView.height)
+    pressDelay: 100
+
+    WebView {
+        id: webView
+        transformOrigin: Item.TopLeft
+        smooth: false // We don't want smooth scaling, since we only scale during (fast) transitions
+        url:  "test.html"
+        preferredWidth: flickable.width
+        preferredHeight: flickable.height
+        contentsScale: 1
+        onContentsSizeChanged: {
+            // zoom out
+            contentsScale = Math.min(1,flickable.width / contentsSize.width)
+        }
+    }
+
+    Rectangle {
+        id: button
+        width: 50; height: 50; color: "red"
+        MouseArea {
+            anchors.fill: parent
+            onPressed: button.color = "blue"
+            onReleased: button.color = "green"
+        }
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png
new file mode 100644
index 0000000..399bd0b
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/test.html b/tests/auto/declarative/qmlvisual/webview/flickable/test.html
new file mode 100644
index 0000000..35eb718
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/test.html
@@ -0,0 +1,3 @@
+<html>
+    <img width="400" height="400" src="qtlogo.png">
+</html>
-- 
cgit v0.12


From cd7e76b2ac2894c7c18a3806f8074b03f581d5d2 Mon Sep 17 00:00:00 2001
From: Petri Latvala <ext-petri.latvala@nokia.com>
Date: Wed, 13 Oct 2010 10:25:14 +0300
Subject: Ignore .pc/

Reviewed-By: Rohan McGovern

(cherry picked from commit 561a72c2568768f9adf34aa1077717f9311ce56d)
---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitignore b/.gitignore
index af52197..f9a4454 100644
--- a/.gitignore
+++ b/.gitignore
@@ -235,3 +235,5 @@ qtc-debugging-helper
 src/corelib/lib
 src/network/lib
 src/xml/lib/
+
+.pc/
-- 
cgit v0.12


From 0df002ad600800a6c4ccadb969e1b1de7f8353e7 Mon Sep 17 00:00:00 2001
From: Jason Barron <jason.barron@nokia.com>
Date: Mon, 22 Nov 2010 14:56:14 +0100
Subject: Fix non-stroked filled paths in OpenVG paint engine.

The QPainter::fillRect() functions are optimizations to avoid state
changes in the paint engines. Since these functions should be
completely independant of state, ideally they should only call
functions that are also stateless.

QVGPaintEngine::fillRect() has two different code paths for this.
The vgClearRect() path of this function is stateless however in the
case of non-opaque or complex fills, this code path cannot be used and
instead we use the normal path fill function which is not entirely
stateless because ensureTransform() will apply the aliased coordinate
transform if the current state includes a stroked pen.

To avoid this happening for a pure fill (no stroke) we temporary set
the pen state to be Qt::NoPen such that the state used by
ensureTransform() is correct.

Task-number: QTBUG-14717
Reviewed-by: Jani Hautakangas
---
 src/openvg/qpaintengine_vg.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index aea203f..03d756d 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -1502,7 +1502,10 @@ void QVGPaintEnginePrivate::fill(VGPath path, const QBrush& brush, VGint rule)
         return;
     ensureBrush(brush);
     setFillRule(rule);
+    QPen savedPen = currentPen;
+    currentPen = Qt::NoPen;
     ensurePathTransform();
+    currentPen = savedPen;
     vgDrawPath(path, VG_FILL_PATH);
 }
 
-- 
cgit v0.12


From a9467c8542ff745471e077ac8be554d3a0087e4a Mon Sep 17 00:00:00 2001
From: Milla Pohjanheimo <ext-milla.pohjanheimo@nokia.com>
Date: Fri, 19 Nov 2010 13:10:57 +0200
Subject: Native color dialog on symbian

Native color dialog implementation for Symbian.

During merge extra libraries removed.

Task-number: QT-3917
Reviewed-by: Sami Merila

Merge-Request: 932
Reviewed-by: Janne Koskinen
---
 src/gui/dialogs/dialogs.pri              |   9 +--
 src/gui/dialogs/qcolordialog.cpp         |  21 ++++++
 src/gui/dialogs/qcolordialog_symbian.cpp | 107 +++++++++++++++++++++++++++++++
 3 files changed, 131 insertions(+), 6 deletions(-)
 create mode 100644 src/gui/dialogs/qcolordialog_symbian.cpp

diff --git a/src/gui/dialogs/dialogs.pri b/src/gui/dialogs/dialogs.pri
index 443c5e9..c25b6d5 100644
--- a/src/gui/dialogs/dialogs.pri
+++ b/src/gui/dialogs/dialogs.pri
@@ -109,12 +109,9 @@ SOURCES += \
         dialogs/qprintpreviewdialog.cpp
 
 symbian:contains(QT_CONFIG, s60) {
-    LIBS += -lcommondialogs \
-            -lavkon \
-            -lplatformenv \
-            -lefsrv \
-            -lgdi
-    SOURCES += dialogs/qfiledialog_symbian.cpp
+    LIBS += -lcommondialogs
+    SOURCES += dialogs/qfiledialog_symbian.cpp \
+               dialogs/qcolordialog_symbian.cpp
 }
 
 FORMS += dialogs/qpagesetupwidget.ui
diff --git a/src/gui/dialogs/qcolordialog.cpp b/src/gui/dialogs/qcolordialog.cpp
index e9b5720..4ef2100 100644
--- a/src/gui/dialogs/qcolordialog.cpp
+++ b/src/gui/dialogs/qcolordialog.cpp
@@ -1952,6 +1952,12 @@ void QColorDialog::open(QObject *receiver, const char *member)
     \sa QDialog::open()
 */
 
+/*
+    For Symbian color dialogs
+*/
+#ifdef Q_WS_S60
+extern QColor qtSymbianGetColor(const QColor &initial);
+#endif
 /*!
     \since 4.5
 
@@ -1961,10 +1967,19 @@ void QColorDialog::open(QObject *receiver, const char *member)
     QColor::isValid()) color if the user cancels the dialog.
 
     The \a options argument allows you to customize the dialog.
+
+    On Symbian, this static function will use the native color dialog and not a QColorDialog. 
+    On Symbian the parameters \a title and \a parent has no relevance and the
+    \a options parameter is only used to define if the native color dialog is
+    used or not.
 */
 QColor QColorDialog::getColor(const QColor &initial, QWidget *parent, const QString &title,
                               ColorDialogOptions options)
 {
+#ifdef Q_WS_S60
+    if (!(options & DontUseNativeDialog))
+        return qtSymbianGetColor(initial);
+#endif
     QColorDialog dlg(parent);
     if (!title.isEmpty())
         dlg.setWindowTitle(title);
@@ -1979,10 +1994,16 @@ QColor QColorDialog::getColor(const QColor &initial, QWidget *parent, const QStr
     returns that color. The color is initially set to \a initial. The
     dialog is a child of \a parent. It returns an invalid (see
     QColor::isValid()) color if the user cancels the dialog.
+
+    On Symbian, this static function will use the native
+    color dialog and not a QColorDialog.
 */
 
 QColor QColorDialog::getColor(const QColor &initial, QWidget *parent)
 {
+#ifdef Q_WS_S60
+    return qtSymbianGetColor(initial);
+#endif
     return getColor(initial, parent, QString(), ColorDialogOptions(0));
 }
 
diff --git a/src/gui/dialogs/qcolordialog_symbian.cpp b/src/gui/dialogs/qcolordialog_symbian.cpp
new file mode 100644
index 0000000..3f8036c
--- /dev/null
+++ b/src/gui/dialogs/qcolordialog_symbian.cpp
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** 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 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 "qcolordialog_p.h"
+
+#ifndef QT_NO_COLORDIALOG
+
+
+#include "qcolor.h"
+#include "private/qguiplatformplugin_p.h"
+
+#ifdef Q_WS_S60
+#include <AknColourSelectionGrid.h>
+#endif
+
+#include "private/qt_s60_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QColor launchSymbianColorDialog(QColor initial)
+{
+    QColor currentColor = QColor::Invalid;
+#ifdef Q_WS_S60
+    QT_TRAP_THROWING(
+        CArrayFixFlat<TRgb>* array = new( ELeave ) CArrayFixFlat<TRgb>(17);
+        CleanupStack::PushL(array);
+        array->AppendL(KRgbBlack);
+        array->AppendL(KRgbDarkGray);
+        array->AppendL(KRgbDarkRed);
+        array->AppendL(KRgbDarkGreen);
+        array->AppendL(KRgbDarkYellow);
+        array->AppendL(KRgbDarkBlue);
+        array->AppendL(KRgbDarkMagenta);
+        array->AppendL(KRgbDarkCyan);
+        array->AppendL(KRgbRed);
+        array->AppendL(KRgbGreen);
+        array->AppendL(KRgbYellow);
+        array->AppendL(KRgbBlue);
+        array->AppendL(KRgbMagenta);
+        array->AppendL(KRgbCyan);
+        array->AppendL(KRgbGray);
+        array->AppendL(KRgbWhite);
+
+        TRgb initialColour(initial.red(), initial.green(), initial.blue(), initial.alpha());  
+
+        TBool noneChosen = EFalse; // If true shows the default colour button
+        CAknColourSelectionGrid* colourSelectionGrid =
+            CAknColourSelectionGrid::NewL(array, EFalse, noneChosen, initialColour);
+        CleanupStack::PushL(colourSelectionGrid);
+
+        if (colourSelectionGrid->ExecuteLD()) {
+            currentColor.setRgb(initialColour.Red(), initialColour.Green(),
+                                initialColour.Blue(), initialColour.Alpha());
+        }
+        CleanupStack::Pop(colourSelectionGrid);
+        CleanupStack::PopAndDestroy(array);
+    );
+#endif
+    return currentColor;
+}
+
+QColor qtSymbianGetColor(const QColor &initial)
+{
+    return launchSymbianColorDialog(initial);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_COLORDIALOG
-- 
cgit v0.12


From ea41bb4f6e097ee641e5fbee3242ccc5aa7e77b1 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Tue, 23 Nov 2010 20:13:09 +1000
Subject: Update QtGui emulator def file for bug QT-3971

---
 src/s60installs/bwins/QtGuiu.def | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index dc8a865..6a33fc3 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -12852,7 +12852,7 @@ EXPORTS
 	?drawStaticText@QPainter@@QAEXABVQPointF@@ABVQStaticText@@@Z @ 12851 NONAME ; void QPainter::drawStaticText(class QPointF const &, class QStaticText const &)
 	?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 ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
+	?populate@QTextureGlyphCache@@QAEXPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12854 NONAME ABSENT ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
 	?hasPartialUpdateSupport@QWindowSurface@@QBE_NXZ @ 12855 NONAME ; 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)
@@ -12904,4 +12904,5 @@ EXPORTS
 	?fontEngine@QStaticTextItem@@QBEPAVQFontEngine@@XZ @ 12903 NONAME ; class QFontEngine * QStaticTextItem::fontEngine(void) const
 	?reactivateDeferredActiveObjects@QEventDispatcherS60@@UAEXXZ @ 12904 NONAME ; void QEventDispatcherS60::reactivateDeferredActiveObjects(void)
 	?userData@QStaticTextItem@@QBEPAVQStaticTextUserData@@XZ @ 12905 NONAME ; class QStaticTextUserData * QStaticTextItem::userData(void) const
+	?populate@QTextureGlyphCache@@QAE_NPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12906 NONAME ; bool QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
 
-- 
cgit v0.12


From f9c97d3a4ab7bbd0ca2f4cf33a53025af23fc47c Mon Sep 17 00:00:00 2001
From: Jason Barron <jason.barron@nokia.com>
Date: Tue, 23 Nov 2010 11:13:41 +0100
Subject: Fix QPixmap::fromImage() in the OpenVG pixmap backend.

If QPixmap::fromImage() was called with a QImage that has an alpha
channel and with the 'Qt::NoOpaqueDetection' image conversion flag set,
then we would always create an opaque (RGB32) pixmap. This is
incorrect.

The fix is to check if the source QImage has an alpha channel and if
so, use sourceFormat(), otherwise use RGB32.

Task-number: QT-4278
Reviewed-by: Jani Hautakangas
---
 src/openvg/qpixmapdata_vg.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp
index 509882b..c3c7def 100644
--- a/src/openvg/qpixmapdata_vg.cpp
+++ b/src/openvg/qpixmapdata_vg.cpp
@@ -214,7 +214,7 @@ void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags
     else if (!(flags & Qt::NoOpaqueDetection) && const_cast<QImage &>(image).data_ptr()->checkForAlphaPixels())
         format = sourceFormat();
     else
-        format = QImage::Format_RGB32;
+        format = image.hasAlphaChannel() ? sourceFormat() : QImage::Format_RGB32;
 
     if (inPlace && image.data_ptr()->convertInPlace(format, flags))
         source = image;
-- 
cgit v0.12


From b5e5d6b39c01c4a3962d07d79c025c16aa1c24a5 Mon Sep 17 00:00:00 2001
From: Janne Koskinen <janne.p.koskinen@digia.com>
Date: Tue, 23 Nov 2010 12:30:02 +0200
Subject: Fix spaces

Remove extra spaces

Reviewed-by: Miikka Heikkinen
---
 src/gui/dialogs/qcolordialog.cpp         | 2 +-
 src/gui/dialogs/qcolordialog_symbian.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gui/dialogs/qcolordialog.cpp b/src/gui/dialogs/qcolordialog.cpp
index 4ef2100..a66a979 100644
--- a/src/gui/dialogs/qcolordialog.cpp
+++ b/src/gui/dialogs/qcolordialog.cpp
@@ -1968,7 +1968,7 @@ extern QColor qtSymbianGetColor(const QColor &initial);
 
     The \a options argument allows you to customize the dialog.
 
-    On Symbian, this static function will use the native color dialog and not a QColorDialog. 
+    On Symbian, this static function will use the native color dialog and not a QColorDialog.
     On Symbian the parameters \a title and \a parent has no relevance and the
     \a options parameter is only used to define if the native color dialog is
     used or not.
diff --git a/src/gui/dialogs/qcolordialog_symbian.cpp b/src/gui/dialogs/qcolordialog_symbian.cpp
index 3f8036c..8f73f7c 100644
--- a/src/gui/dialogs/qcolordialog_symbian.cpp
+++ b/src/gui/dialogs/qcolordialog_symbian.cpp
@@ -79,7 +79,7 @@ QColor launchSymbianColorDialog(QColor initial)
         array->AppendL(KRgbGray);
         array->AppendL(KRgbWhite);
 
-        TRgb initialColour(initial.red(), initial.green(), initial.blue(), initial.alpha());  
+        TRgb initialColour(initial.red(), initial.green(), initial.blue(), initial.alpha());
 
         TBool noneChosen = EFalse; // If true shows the default colour button
         CAknColourSelectionGrid* colourSelectionGrid =
-- 
cgit v0.12


From 1689f5c557f686b7ad0ab68385402e928e590a13 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Tue, 23 Nov 2010 14:29:10 +0200
Subject: Use parent class function to generate Makefile headers in Symbian

Qt Creator depends on some of the information generated into the
makefile header by MakefileGenerator::writeHeader() function, so
changed symmake*.cpp to use it instead of each having separate
code for header generation.

Task-number: QTBUG-15539
Reviewed-by: Janne Koskinen
---
 qmake/generators/symbian/symmake_abld.cpp  | 11 +----------
 qmake/generators/symbian/symmake_sbsv2.cpp | 12 ++----------
 2 files changed, 3 insertions(+), 20 deletions(-)

diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp
index cd64325..eb39d36 100644
--- a/qmake/generators/symbian/symmake_abld.cpp
+++ b/qmake/generators/symbian/symmake_abld.cpp
@@ -184,16 +184,7 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
 
     QTextStream t(&wrapperFile);
 
-    t << "# ==============================================================================" << endl;
-    t << "# Generated by qmake (" << qmake_version() << ") (Qt " << QT_VERSION_STR << ") on: ";
-    t << QDateTime::currentDateTime().toString() << endl;
-    t << "# This file is generated by qmake and should not be modified by the" << endl;
-    t << "# user." << endl;
-    t << "#  Name        : " << wrapperFile.fileName() << endl;
-    t << "#  Description : Wrapper Makefile for calling Symbian build tools" << endl;
-    t << "#" << endl;
-    t << "# ==============================================================================" << "\n" << endl;
-    t << endl;
+    MakefileGenerator::writeHeader(t);
 
     t << "MAKEFILE          = " << fileInfo(wrapperFile.fileName()).fileName() << endl;
     t << "QMAKE             = " << var("QMAKE_QMAKE") << endl;
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index f4a6132..c4b51f2 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -324,16 +324,8 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
 
     QTextStream t(&wrapperFile);
 
-    t << "# ==============================================================================" << endl;
-    t << "# Generated by qmake (" << qmake_version() << ") (Qt " << QT_VERSION_STR << ") on: ";
-    t << QDateTime::currentDateTime().toString() << endl;
-    t << "# This file is generated by qmake and should not be modified by the" << endl;
-    t << "# user." << endl;
-    t << "#  Name        : " << wrapperFile.fileName() << endl;
-    t << "#  Description : Wrapper Makefile for calling Symbian build tools" << endl;
-    t << "#" << endl;
-    t << "# ==============================================================================" << "\n" << endl;
-    t << endl;
+    MakefileGenerator::writeHeader(t);
+
     t << "MAKEFILE          = " << fileInfo(wrapperFile.fileName()).fileName() << endl;
     t << "QMAKE             = " << var("QMAKE_QMAKE") << endl;
     t << "DEL_FILE          = " << var("QMAKE_DEL_FILE") << endl;
-- 
cgit v0.12


From 5d0be38c15acf28969bd8bf984ab23a29fa8e354 Mon Sep 17 00:00:00 2001
From: Damian Jansen <damian.jansen@nokia.com>
Date: Wed, 24 Nov 2010 10:51:29 +1000
Subject: Fix asynchronous reload call in test, broken by previous submit

Task-number: QTBUG-15493
---
 tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
index 1c1c04b..21c7197 100644
--- a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
+++ b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
@@ -45,6 +45,7 @@
 #include <QtDeclarative/qdeclarativeitem.h>
 #include <QtDeclarative/qdeclarativecontext.h>
 #include <QtGui/qmenubar.h>
+#include <QSignalSpy>
 #include "../../../shared/util.h"
 #include "qmlruntime.h"
 #include "deviceorientation.h"
@@ -194,7 +195,9 @@ void tst_QDeclarativeViewer::loading()
     QCOMPARE(viewer->size(), QSize(250, 350));
     QCOMPARE(viewer->size(), viewer->sizeHint());
 
+    QSignalSpy statusSpy(viewer->view(), SIGNAL(statusChanged(QDeclarativeView::Status)));
     viewer->reload();
+    QTRY_VERIFY(statusSpy.count() == 1);
     rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
     QVERIFY(rootItem);
 
-- 
cgit v0.12


From d32360bb33e830f8c17a6db1a31f529436c2915e Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 24 Nov 2010 11:25:07 +1000
Subject: Avoid lockup in ListView when animating delegates.

Animating delegates results in the content height changing, which
may result in fixup being called if at the ends of the view, which
may in turn cause refill to be called, which will change the content
height, which repeats.  Prevent this recusion from happening.

Task-number: QTBUG-14821
Reviewed-by: Bea Lam
---
 .../graphicsitems/qdeclarativelistview.cpp         |  8 ++++++
 .../qdeclarativelistview/data/qtbug14821.qml       | 31 ++++++++++++++++++++++
 .../tst_qdeclarativelistview.cpp                   | 21 +++++++++++++++
 3 files changed, 60 insertions(+)
 create mode 100644 tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 6be49ba..450b6af 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -183,6 +183,7 @@ public:
         , ownModel(false), wrap(false), autoHighlight(true), haveHighlightRange(false)
         , correctFlick(false), inFlickCorrection(false), lazyRelease(false)
         , deferredRelease(false), layoutScheduled(false), currentIndexCleared(false)
+        , inViewportMoved(false)
         , minExtentDirty(true), maxExtentDirty(true)
     {}
 
@@ -503,6 +504,7 @@ public:
     bool deferredRelease : 1;
     bool layoutScheduled : 1;
     bool currentIndexCleared : 1;
+    bool inViewportMoved : 1;
     mutable bool minExtentDirty : 1;
     mutable bool maxExtentDirty : 1;
 };
@@ -2281,6 +2283,10 @@ void QDeclarativeListView::viewportMoved()
     QDeclarativeFlickable::viewportMoved();
     if (!d->itemCount)
         return;
+    // Recursion can occur due to refill changing the content size.
+    if (d->inViewportMoved)
+        return;
+    d->inViewportMoved = true;
     d->lazyRelease = true;
     refill();
     if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
@@ -2294,6 +2300,7 @@ void QDeclarativeListView::viewportMoved()
                 pos = viewPos + d->highlightRangeEnd - d->highlight->size();
             if (pos < viewPos + d->highlightRangeStart)
                 pos = viewPos + d->highlightRangeStart;
+            d->highlightPosAnimator->stop();
             d->highlight->setPosition(qRound(pos));
 
             // update current index
@@ -2341,6 +2348,7 @@ void QDeclarativeListView::viewportMoved()
         }
         d->inFlickCorrection = false;
     }
+    d->inViewportMoved = false;
 }
 
 qreal QDeclarativeListView::minYExtent() const
diff --git a/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml
new file mode 100644
index 0000000..e0303ec
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml
@@ -0,0 +1,31 @@
+import QtQuick 1.0
+
+ListView {
+    id: view
+    width: 300; height: 200
+    focus: true
+    keyNavigationWraps: true
+
+    model: 100
+
+    preferredHighlightBegin: 90
+    preferredHighlightEnd:   110
+
+    highlightRangeMode: ListView.StrictlyEnforceRange
+    highlight: Component {
+        Rectangle {
+            border.color: "blue"
+            border.width: 3
+            color: "transparent"
+            width: 300; height: 15
+        }
+    }
+
+    delegate: Component {
+           Item {
+               height: 15 + (view.currentIndex == index ? 20 : 0)
+               width: 200
+               Text { text: 'Index: ' + index; anchors.verticalCenter: parent.verticalCenter }
+           }
+       }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index a4b4f21..37d836d 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -101,6 +101,7 @@ private slots:
     void footer();
     void resizeView();
     void sizeLessThan1();
+    void QTBUG_14821();
 
 private:
     template <class T> void items();
@@ -1768,6 +1769,26 @@ void tst_QDeclarativeListView::sizeLessThan1()
     delete canvas;
 }
 
+void tst_QDeclarativeListView::QTBUG_14821()
+{
+    QDeclarativeView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug14821.qml"));
+    qApp->processEvents();
+
+    QDeclarativeListView *listview = qobject_cast<QDeclarativeListView*>(canvas->rootObject());
+    QVERIFY(listview != 0);
+
+    QDeclarativeItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 99);
+
+    listview->incrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+}
+
 void tst_QDeclarativeListView::qListModelInterface_items()
 {
     items<TestModel>();
-- 
cgit v0.12


From fb9604741c40790cef72d06afe6ca53165f57b16 Mon Sep 17 00:00:00 2001
From: Justin McPherson <justin.mcpherson@nokia.com>
Date: Wed, 24 Nov 2010 10:45:53 +1000
Subject: Fix compliation of ALSA audio backend when checking for surround
 support.

Surround support requires ALSA lib >= 1.0.14

Task-number: QTBUG-15205
Reviewed-by: Andrew den Exter
---
 src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp | 6 ++++++
 src/multimedia/audio/qaudiodeviceinfo_alsa_p.h   | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
index 25622a4..3617d24 100644
--- a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
+++ b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
@@ -63,7 +63,9 @@ QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray dev, QAudio::Mode
     device = QLatin1String(dev);
     this->mode = mode;
 
+#if (SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
     checkSurround();
+#endif
 }
 
 QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal()
@@ -394,9 +396,11 @@ void QAudioDeviceInfoInternal::updateLists()
     }
     channelz.append(1);
     channelz.append(2);
+#if (SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
     if (surround40) channelz.append(4);
     if (surround51) channelz.append(6);
     if (surround71) channelz.append(8);
+#endif
     sizez.append(8);
     sizez.append(16);
     sizez.append(32);
@@ -494,6 +498,7 @@ QByteArray QAudioDeviceInfoInternal::defaultOutputDevice()
     return devices.first();
 }
 
+#if (SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
 void QAudioDeviceInfoInternal::checkSurround()
 {
     QList<QByteArray> devices;
@@ -534,5 +539,6 @@ void QAudioDeviceInfoInternal::checkSurround()
     }
     snd_device_name_free_hint(hints);
 }
+#endif
 
 QT_END_NAMESPACE
diff --git a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.h b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.h
index 8525980..5f7e5e8 100644
--- a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.h
+++ b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.h
@@ -98,10 +98,12 @@ private:
     bool open();
     void close();
 
+#if (SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
     void checkSurround();
     bool surround40;
     bool surround51;
     bool surround71;
+#endif
 
     QString device;
     QAudio::Mode mode;
-- 
cgit v0.12


From e3da9407ad85a65abce72f8a32230ec4f2f95369 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Wed, 24 Nov 2010 13:50:27 +1000
Subject: Allow javascript date and regexp objects in WorkerScript messages

Task-number: QTBUG-14666
Reviewed-by: Aaron Kennedy
---
 src/declarative/qml/qdeclarativeworkerscript.cpp            | 13 +++++++++++++
 .../tst_qdeclarativeworkerscript.cpp                        |  5 +++++
 2 files changed, 18 insertions(+)

diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index be7ea0e..4b78020 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -52,6 +52,7 @@
 #include <QtCore/qwaitcondition.h>
 #include <QtScript/qscriptvalueiterator.h>
 #include <QtCore/qfile.h>
+#include <QtCore/qdatetime.h>
 #include <QtNetwork/qnetworkaccessmanager.h>
 #include <QtDeclarative/qdeclarativeinfo.h>
 #include "qdeclarativenetworkaccessmanagerfactory.h"
@@ -314,6 +315,12 @@ QVariant QDeclarativeWorkerScriptEnginePrivate::scriptValueToVariant(const QScri
         return QVariant(value.toString());
     } else if (value.isNumber()) {
         return QVariant((qreal)value.toNumber());
+    } else if (value.isDate()) {
+        return QVariant(value.toDateTime());
+#ifndef QT_NO_REGEXP
+    } else if (value.isRegExp()) {
+        return QVariant(value.toRegExp());
+#endif
     } else if (value.isArray()) {
         QVariantList list;
 
@@ -364,6 +371,12 @@ QScriptValue QDeclarativeWorkerScriptEnginePrivate::variantToScriptValue(const Q
         return QScriptValue(value.toString());
     } else if (value.userType() == QMetaType::QReal) {
         return QScriptValue(value.toReal());
+    } else if (value.userType() == QVariant::DateTime) {
+        return engine->newDate(value.toDateTime());
+#ifndef QT_NO_REGEXP
+    } else if (value.userType() == QVariant::RegExp) {
+        return engine->newRegExp(value.toRegExp());
+#endif
     } else if (value.userType() == qMetaTypeId<QDeclarativeListModelWorkerAgent::VariantRef>()) {
         QDeclarativeListModelWorkerAgent::VariantRef vr = qvariant_cast<QDeclarativeListModelWorkerAgent::VariantRef>(value);
         if (vr.a->scriptEngine() == 0)
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
index 3140265..5a6cf3c 100644
--- a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
+++ b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
@@ -137,6 +137,11 @@ void tst_QDeclarativeWorkerScript::messaging_data()
     QTest::newRow("real") << qVariantFromValue(10334.375);
     QTest::newRow("string") << qVariantFromValue(QString("More cheeeese, Gromit!"));
     QTest::newRow("variant list") << qVariantFromValue((QVariantList() << "a" << "b" << "c"));
+    QTest::newRow("date time") << qVariantFromValue(QDateTime::currentDateTime());
+#ifndef QT_NO_REGEXP
+    // QtScript's QScriptValue -> QRegExp uses RegExp2 pattern syntax
+    QTest::newRow("regexp") << qVariantFromValue(QRegExp("^\\d\\d?$", Qt::CaseInsensitive, QRegExp::RegExp2));
+#endif
 }
 
 void tst_QDeclarativeWorkerScript::messaging_sendQObjectList()
-- 
cgit v0.12


From 810e21d9e404aa2fcb602cb68bfd892387b234e7 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 24 Nov 2010 14:28:18 +1000
Subject: Flickable and MouseArea were too eager to take/keep mouse grab.

This meant that they would sometimes act upon a drag immediately,
rather than waiting for a nested area to take the grab.  This resulted
in a short jump before future events were handled by the nested item.

Task-number: QTBUG-15568
Reviewed-by: Bea Lam
---
 .../graphicsitems/qdeclarativeflickable.cpp        |   16 +-
 .../graphicsitems/qdeclarativemousearea.cpp        |   37 +-
 .../tst_qdeclarativemousearea.cpp                  |    7 +
 .../qdeclarativemousearea/data/nested.0.png        |  Bin 0 -> 1360 bytes
 .../qdeclarativemousearea/data/nested.1.png        |  Bin 0 -> 1367 bytes
 .../qdeclarativemousearea/data/nested.2.png        |  Bin 0 -> 1367 bytes
 .../qdeclarativemousearea/data/nested.3.png        |  Bin 0 -> 1372 bytes
 .../qdeclarativemousearea/data/nested.4.png        |  Bin 0 -> 1382 bytes
 .../qdeclarativemousearea/data/nested.5.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.6.png        |  Bin 0 -> 1390 bytes
 .../qdeclarativemousearea/data/nested.7.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.8.png        |  Bin 0 -> 1380 bytes
 .../qdeclarativemousearea/data/nested.9.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.qml          | 5039 ++++++++++++++++++++
 .../qmlvisual/qdeclarativemousearea/nested.qml     |   62 +
 15 files changed, 5142 insertions(+), 19 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 1870647..377f3b5 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -281,7 +281,6 @@ void QDeclarativeFlickablePrivate::fixupY()
 
 void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
 {
-    Q_Q(QDeclarativeFlickable);
     if (data.move.value() > minExtent || maxExtent > minExtent) {
         timeline.reset(data.move);
         if (data.move.value() != minExtent) {
@@ -290,8 +289,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal
                 timeline.move(data.move, minExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
                 timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
             } else {
-                data.move.setValue(minExtent);
-                q->viewportMoved();
+                timeline.set(data.move, minExtent);
             }
         }
     } else if (data.move.value() < maxExtent) {
@@ -301,8 +299,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal
             timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
             timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
         } else {
-            data.move.setValue(maxExtent);
-            q->viewportMoved();
+            timeline.set(data.move, minExtent);
         }
     }
     vTime = timeline.time();
@@ -703,6 +700,9 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
     bool rejectY = false;
     bool rejectX = false;
 
+    bool stealY = false;
+    bool stealX = false;
+
     if (q->yflick()) {
         int dy = int(event->pos().y() - pressPos.y());
         if (qAbs(dy) > QApplication::startDragDistance() || QDeclarativeItemPrivate::elapsed(pressTime) > 200) {
@@ -731,7 +731,7 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
                 vMoved = true;
             }
             if (qAbs(dy) > QApplication::startDragDistance())
-                stealMouse = true;
+                stealY = true;
         }
     }
 
@@ -764,10 +764,12 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
             }
 
             if (qAbs(dx) > QApplication::startDragDistance())
-                stealMouse = true;
+                stealX = true;
         }
     }
 
+    stealMouse = stealX || stealY;
+
     if (!lastPos.isNull()) {
         qreal elapsed = qreal(QDeclarativeItemPrivate::restart(lastPosTime)) / 1000.;
         if (elapsed <= 0)
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index d9edd11..0a043a7 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -500,17 +500,9 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
         const int dragThreshold = QApplication::startDragDistance();
         qreal dx = qAbs(curLocalPos.x() - startLocalPos.x());
         qreal dy = qAbs(curLocalPos.y() - startLocalPos.y());
-        if ((d->dragX && !(dx < dragThreshold)) || (d->dragY && !(dy < dragThreshold))) {
+
+        if (keepMouseGrab() && d->stealMouse)
             d->drag->setActive(true);
-            d->stealMouse = true;
-        }
-        if (!keepMouseGrab()) {
-            if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
-                || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
-                || (d->dragX && d->dragY)) {
-                setKeepMouseGrab(true);
-            }
-        }
 
         if (d->dragX && d->drag->active()) {
             qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX;
@@ -528,6 +520,16 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                 y = drag()->ymax();
             drag()->target()->setY(y);
         }
+
+        if (!keepMouseGrab()) {
+            if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
+                || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
+                || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
+                setKeepMouseGrab(true);
+                d->stealMouse = true;
+            }
+        }
+
         d->moved = true;
     }
     QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
@@ -618,6 +620,7 @@ bool QDeclarativeMouseArea::sceneEvent(QEvent *event)
             // if our mouse grab has been removed (probably by Flickable), fix our
             // state
             d->pressed = false;
+            d->stealMouse = false;
             setKeepMouseGrab(false);
             emit canceled();
             emit pressedChanged();
@@ -672,8 +675,18 @@ bool QDeclarativeMouseArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
         return stealThisEvent;
     }
     if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
-        d->stealMouse = false;
-        ungrabMouse();
+        if (d->pressed) {
+            d->pressed = false;
+            d->stealMouse = false;
+            if (s && s->mouseGrabberItem() == this)
+                ungrabMouse();
+            emit canceled();
+            emit pressedChanged();
+            if (d->hovered) {
+                d->hovered = false;
+                emit hoveredChanged();
+            }
+        }
     }
     return false;
 }
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index 57a58e9..9d7cc05 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -216,7 +216,14 @@ void tst_QDeclarativeMouseArea::dragging()
     QCOMPARE(blackRect->x(), 50.0);
     QCOMPARE(blackRect->y(), 50.0);
 
+    // First move event triggers drag, second is acted upon.
+    // This is due to possibility of higher stacked area taking precedence.
     QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
+    moveEvent.setScenePos(QPointF(106, 106));
+    moveEvent.setButton(Qt::LeftButton);
+    moveEvent.setButtons(Qt::LeftButton);
+    QApplication::sendEvent(scene, &moveEvent);
+
     moveEvent.setScenePos(QPointF(110, 110));
     moveEvent.setButton(Qt::LeftButton);
     moveEvent.setButtons(Qt::LeftButton);
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png
new file mode 100644
index 0000000..793fb0f
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png
new file mode 100644
index 0000000..5935b45
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png
new file mode 100644
index 0000000..a205266
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png
new file mode 100644
index 0000000..3d81ff2
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png
new file mode 100644
index 0000000..ee2076e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png
new file mode 100644
index 0000000..9017124
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png
new file mode 100644
index 0000000..216dd7e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png
new file mode 100644
index 0000000..27e8480
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png
new file mode 100644
index 0000000..6b911c5
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png
new file mode 100644
index 0000000..01858a5
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
new file mode 100644
index 0000000..cec1558
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
@@ -0,0 +1,5039 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "nested.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 48
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 64
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 80
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 96
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 112
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 128
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 144
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 160
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 176
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 192
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 208
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 224
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 240
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 256
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 272
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 288
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 304
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 320
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 336
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 352
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 368
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 384
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 400
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 416
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 432
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 448
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 464
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 480
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 496
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 512
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 528
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 544
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 560
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 576
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 592
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 608
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 624
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 640
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 656
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 672
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 688
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 704
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 720
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 736
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 752
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 768
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 784
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 800
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 816
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 832
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 848
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 864
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 25; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 880
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 26; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 896
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 27; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 912
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 28; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 29; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 928
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 30; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 944
+        hash: "f5aa6257fd80c1e383bc2db84e41c354"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 35; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 960
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 976
+        image: "nested.1.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 58; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 992
+        hash: "ab955f6c6b210b66b27e244dc2150860"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1008
+        hash: "b655247e73b0b8357dc9d355ba6f49a0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 79; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 83; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1024
+        hash: "08b67b7e28990cac8c9bd354b7d87698"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1040
+        hash: "69cecfb41899e13c0bc5acb6f9bc666d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 104; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1056
+        hash: "8d1f0cd85fd3f2654f7c30a6d9ec2b99"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 115; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 122; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1072
+        hash: "f8ddda87cfcf5dc9d8c6e940fbd295f3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 133; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1088
+        hash: "ab9d942c47a2cca5531f7b67df034161"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 136; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1104
+        hash: "7ca5a03fdfac44c389315c3928631a2a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 146; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 151; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1120
+        hash: "ade955ed9d85fbbe72cf18bbc541c8bf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 153; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1136
+        hash: "6ad4afa3e3fcb578946fccbf4896761c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 162; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1152
+        hash: "3ebe78e37c1c66d0b8fc86c8191e39de"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 165; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1168
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Frame {
+        msec: 1184
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Frame {
+        msec: 1200
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1216
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 164; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 161; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1232
+        hash: "adfe54d5d28f7caf9ace117fd3573444"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 159; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 156; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1248
+        hash: "f4963636cc4fbd8bfe6baf10540ed7e7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 154; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 149; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1264
+        hash: "1c2d2edb9214cc3857aa221330ee28ba"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 139; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1280
+        hash: "750226c90e6c6cd0b3bdd3c3dc8da18f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 131; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1296
+        hash: "b6b5d177ab531460dc125afa82489a1d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 115; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 111; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1312
+        hash: "62d411a7b6c404393e4bfafab9c638a3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 100; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1328
+        hash: "e355997b3decd4deb686fece59c33c7c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 76; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1344
+        hash: "2ab73c8aac6a0e321686e97c9bb28f28"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 61; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1360
+        hash: "55a887f9f45f71beb6b723191eb60a2f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 56; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1376
+        hash: "b2d49e34362994739d14fb8231ff82d6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 43; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1392
+        hash: "3964796876870035794b41501991b527"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1408
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Frame {
+        msec: 1424
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1440
+        hash: "7e524b3c43a987503ef102bdb9f11701"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1456
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1472
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1488
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1504
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1520
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1536
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1552
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 42; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1568
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1584
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1600
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1616
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1632
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1648
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1664
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1680
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1696
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1712
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1728
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1744
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1760
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1776
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1792
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1808
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1824
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1840
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1856
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1872
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1888
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1904
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1920
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1936
+        image: "nested.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 38; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1968
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1984
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2000
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2016
+        hash: "9178754b825d60b2174ed9431ea80586"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2032
+        hash: "89eff8fa9f8710d7cbc50b8d4b751148"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2048
+        hash: "cdae8b46ecfc2b0c90264c120156cc46"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2064
+        hash: "cf35919630eab647a28eb91d8a441704"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2080
+        hash: "283256d50da8c855c50d5f8813d37afd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2096
+        hash: "2560cd67d507bc24c1000187f645531c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2112
+        hash: "6f6f7c299c4516c5231f5bfcd39b6db3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 122
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2128
+        hash: "e7989524238996cf59f420f4edf8f982"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 124
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 126
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2144
+        hash: "34d8d456848807e854bcb25ffbde37d4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 127
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 130
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2160
+        hash: "433bd3983804b07484d38af2723f519e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 132
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 134
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2176
+        hash: "510e534a8a7b88041f7544e7e4992b8f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 137
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 139
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2192
+        hash: "25f43c457a5bf2b70a66ce91685ad4dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 141
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 142
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2208
+        hash: "4119ab90627359420e25220618b76a69"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 146
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2224
+        hash: "8a3cc888e96cf3e26e369723b442baf1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 147
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 150
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2240
+        hash: "980552e8ff9d87ccb40127b06b0f846f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 151
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 153
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2256
+        hash: "9ee23fc7cbca4467f984073d2af7cdf6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 154
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 155
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2272
+        hash: "032d65792ac867c9b9acef05bd993c54"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 156
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2288
+        hash: "be2f8d5a64034e75e23527c486e33029"
+    }
+    Frame {
+        msec: 2304
+        hash: "be2f8d5a64034e75e23527c486e33029"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 155
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2320
+        hash: "3f65505e4d1f8534c9123b3dea15d43e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 154
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 152
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2336
+        hash: "e8b1799cf1926cb3b6cbf3adee80cffe"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 149
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 147
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2352
+        hash: "31155b14cc0d3d47bbef4e199fdfcb46"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 140
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 132
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2368
+        hash: "b89745a9a60a7ebeb1de0a7f96ad2ac3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 128
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 57; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2384
+        hash: "7e99fa1eba369d45f10778fe02356f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 59; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 64; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2400
+        hash: "cd123f6b332f38f43abbf01469a41301"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 67; y: 98
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2416
+        hash: "353c0602dd2b670e19988117172855fc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 76; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 78; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2432
+        hash: "20df9d19fd2113fa8f8023d5b4328dc5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 82; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2448
+        hash: "10b34a758d5b3790dd36c9d95c47b157"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 84; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2464
+        hash: "98a483e1eaa9145fd277fd85a9b0cf03"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 88; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2480
+        hash: "e92edd52ff1ee78456fa1947a46e6570"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 52
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2496
+        hash: "877384496d967f5f0ab1c817a2b316d6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2512
+        hash: "15673570ffe9a391f9214601ac9dc86c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2528
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2544
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2560
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2576
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2592
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2608
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2624
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2640
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 95; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2656
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2672
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2688
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2704
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2720
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2736
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2752
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2768
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2784
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2800
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2816
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2832
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2848
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2864
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2880
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2896
+        image: "nested.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2928
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2944
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2960
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2976
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2992
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3008
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3024
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3040
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3056
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3072
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3088
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3104
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3120
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3136
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3152
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3168
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3184
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3200
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3216
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3232
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 156; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3248
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3264
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 156; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 157; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3280
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 160; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3296
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 161; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3312
+        hash: "df6cf21e99177a436e356f818996070c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 171; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3328
+        hash: "86f5e3fee147f47edd4a6d042aff0301"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 178; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 181; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3344
+        hash: "589c1418a9179c868d904b1a5169a11b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 189; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 193; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3360
+        hash: "3141ad77d193e145b749759070e1e6ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 204; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3376
+        hash: "5e34d4deeb6d80b336cacea39797e0ca"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 211; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 217; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3392
+        hash: "b8795d844982bcf60a6713f91717648f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 220; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3408
+        hash: "857c63b24057ee0186c5136eddb71cb1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 226; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 227; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3424
+        hash: "49222ed0d1ebc8759d0a1dc65c3beec6"
+    }
+    Frame {
+        msec: 3440
+        hash: "49222ed0d1ebc8759d0a1dc65c3beec6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 227; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 226; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3456
+        hash: "751847708a468f4f3e64e7cb5ebd1351"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 225; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3472
+        hash: "4016f80a5219fcba6480645f71998d71"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 221; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 220; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3488
+        hash: "beef05cd2a3d20bc66978fa4f0ac1d12"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 216; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 214; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3504
+        hash: "e50a2661e93d34b55c8d2d39abc77e5a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 206; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3520
+        hash: "7beccbc2f091350bb5d9de1e2443021d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 192; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3536
+        hash: "1d39570bf07392f56b6dd24b0bf9e7bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 188; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 180; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3552
+        hash: "62565b3e5aad3979b408207bbf36e615"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 176; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 167; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3568
+        hash: "d9c6004921847fef16bb8c2f5d6b3b7d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 162; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 152; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3584
+        hash: "53da27301ad97ae52c65928615ec0cd7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 142; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 137; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3600
+        hash: "9772a776e84515984b4eec70dbd1c5a7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 125; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 119; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3616
+        hash: "9caa6583a716443c13e8fef3f2923d6e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 104; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3632
+        hash: "f162a18b2d3f0d5f6f01fc373c016f68"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 96; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3648
+        hash: "58976e8e31beddf881c7cfa3ede54c09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3664
+        hash: "6625f7adb097bc170024083c42d74b4b"
+    }
+    Frame {
+        msec: 3680
+        hash: "6625f7adb097bc170024083c42d74b4b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3696
+        hash: "1d63f09ca27e9d70c3c0ea923a6cfba4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3712
+        hash: "1d63f09ca27e9d70c3c0ea923a6cfba4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 96; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3728
+        hash: "a23c75fcaa0a28adb944bf192af65bff"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 100; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3744
+        hash: "2b90fe8937dcc39d1d6add305cf36043"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 111; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3760
+        hash: "7da82cfaf0f826ca9a41128278b6b09c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 118; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 122; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3776
+        hash: "a3f69d13d38b336fda33a86899564996"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 129; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 135; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3792
+        hash: "dc562319e1d332ba34ac94bfc0c39c5e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 138; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 140; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3808
+        hash: "756482bee292668f56d813847b0ccd53"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 141; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 142; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3824
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Frame {
+        msec: 3840
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Frame {
+        msec: 3856
+        image: "nested.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 142; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3888
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3904
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3920
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3936
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3952
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3968
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3984
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4000
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4016
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4032
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4048
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4064
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4080
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4096
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4112
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4128
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4144
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4160
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4176
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4192
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4208
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4224
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4240
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4256
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4272
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4288
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4304
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4320
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4336
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4352
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4368
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4384
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4400
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4416
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4432
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4448
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4464
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4480
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4496
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4512
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4528
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4544
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 16; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4560
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4576
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4592
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 17; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4608
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 17; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 18; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4624
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 20; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 20; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4640
+        hash: "ff1f86b47e0d1db5db7d939df8349931"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 22; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 23; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4656
+        hash: "f13393a4556e9e73c33f2bb74d8f7794"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 26; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 28; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4672
+        hash: "8c9aa01516437184eb17d89348cca004"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4688
+        hash: "8b6848cb722ff5ec02d957da1ee687e5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 44; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4704
+        hash: "552fde584d128f511788670031d79dd2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 58; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 64; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4720
+        hash: "55dc3a4242b46e602f823c0305e67ad2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 68; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4736
+        hash: "603b9b2ed6ff4273c3ab1cbe32afb19e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 73; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 73; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4752
+        hash: "157eda24ea8452a208aa7a6a22639c73"
+    }
+    Frame {
+        msec: 4768
+        hash: "157eda24ea8452a208aa7a6a22639c73"
+    }
+    Frame {
+        msec: 4784
+        hash: "c5005b83816c18b67448dfbccd0ab0b2"
+    }
+    Frame {
+        msec: 4800
+        hash: "878512df863e5d60437b85fbd2a32eb1"
+    }
+    Frame {
+        msec: 4816
+        image: "nested.5.png"
+    }
+    Frame {
+        msec: 4832
+        hash: "02ab69b67b746ec0021295992a03ada1"
+    }
+    Frame {
+        msec: 4848
+        hash: "c621382766d7bacab87055a73623a8ce"
+    }
+    Frame {
+        msec: 4864
+        hash: "a8d1be78741d9afd88363bd19f1cbc6b"
+    }
+    Frame {
+        msec: 4880
+        hash: "5a70275ff656766d73638d4dd4db4492"
+    }
+    Frame {
+        msec: 4896
+        hash: "892ea0a00553524b79889d437eac9b6f"
+    }
+    Frame {
+        msec: 4912
+        hash: "d818258bffc065430902ffa8f5668f86"
+    }
+    Frame {
+        msec: 4928
+        hash: "6b844523522ace7545705ffb8ffe1da3"
+    }
+    Frame {
+        msec: 4944
+        hash: "3906097bc49bad199b52c99dbf87f98f"
+    }
+    Frame {
+        msec: 4960
+        hash: "a2bd859b5ca7f4fac8d62b1c9ab76aad"
+    }
+    Frame {
+        msec: 4976
+        hash: "f374673e3511b1df8b50ff7ef6002b3a"
+    }
+    Frame {
+        msec: 4992
+        hash: "c2eecfadd19418f469b1ab53a3ecae70"
+    }
+    Frame {
+        msec: 5008
+        hash: "2b481965ece0f2e1795ef56aa5d6a752"
+    }
+    Frame {
+        msec: 5024
+        hash: "c294f28000348365a2c37265132efdb5"
+    }
+    Frame {
+        msec: 5040
+        hash: "c294f28000348365a2c37265132efdb5"
+    }
+    Frame {
+        msec: 5056
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5072
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5088
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5104
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5120
+        hash: "3836449b99d88e2dea9a0eb9417faca5"
+    }
+    Frame {
+        msec: 5136
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5152
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5168
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5184
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5200
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5216
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5232
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5248
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5264
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5280
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5296
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5312
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5328
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5344
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5360
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5376
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5392
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5408
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5424
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5440
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5456
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5472
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5488
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5504
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5520
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5536
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5552
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5568
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5584
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5600
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5616
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5632
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 20; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 21; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5648
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 22; y: 239
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 23; y: 239
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5664
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 27; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 29; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5680
+        hash: "b56d132ac881e27d308009fb9a9d2d50"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 36; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5696
+        hash: "6c65fca03ea127d554f15c80da76f21f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 242
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5712
+        hash: "e5d8939135d0e964609a09a437af58bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 61; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5728
+        hash: "ab60a45ac475ef8d1177d831a6572d1f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 75; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5744
+        hash: "78b2e0c7dd8b8bcbd573dac79ff815e4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 79; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5760
+        hash: "ef9e89650d8e3d572285e2a2e2b09166"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5776
+        image: "nested.6.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 118; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5792
+        hash: "b83136fa3769e30ea47097b489e8f1dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 137; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5808
+        hash: "fb892905b790a061ce5985c927db3cf5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 154; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 159; y: 237
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5824
+        hash: "bc4358e21d2d31942e776adfd32ef1c6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 170; y: 235
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 184; y: 234
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5840
+        hash: "b42380a7fcf5e2fbfe4dddbe86ad7287"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 191; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 201; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5856
+        hash: "4b3c12beb43a77ebaf458804b03c7b52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 205; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 208; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5872
+        hash: "a18be4d4ab28c0fd0c16696c4ecc03ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5888
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Frame {
+        msec: 5904
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Frame {
+        msec: 5920
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 208; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5936
+        hash: "a18be4d4ab28c0fd0c16696c4ecc03ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 207; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 207; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5952
+        hash: "a8b23e7dad1bdbaa3452335be0f07658"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 206; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 204; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5968
+        hash: "4c1feb559a11912b06ed521bebba43d0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 194; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5984
+        hash: "ffb97bcedf72e02616272c1cad5c38d7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 190; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 181; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6000
+        hash: "99498ed9b4d519a2f842d407abdef90a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 175; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6016
+        hash: "1ca3f012adab899eba1dcb63d048345f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 228
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 145; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6032
+        hash: "8a81d49de887f314f67976a65f469169"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 132; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6048
+        hash: "b83136fa3769e30ea47097b489e8f1dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 116; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 112; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6064
+        hash: "12cdd297407257ae4bb13c87e24537fb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 103; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 99; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6080
+        hash: "a51ac0a1e9432671c88f7649c38d265d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6096
+        hash: "4ba4f854659161c765395cdee35594f2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 77; y: 226
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 225
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6112
+        hash: "9907add9e28b4a8976f3727f99a4b6d4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 224
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 60; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6128
+        hash: "c2cb865c4a766b9c08328b374e940f29"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 59; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 56; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6144
+        hash: "c97981263572ded23b328da45cf88012"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 55; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6160
+        hash: "f4bae51c866ba1158f44529208514d6f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 222
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 222
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6176
+        hash: "35b4f1f9bb343f2b22bd7cdad6f28249"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6192
+        hash: "84eba4cb400e5622463f5a1fa79be72b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6208
+        hash: "d38e882728c7efc906befe69b416082a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6224
+        hash: "e5d8939135d0e964609a09a437af58bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 44; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 43; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6240
+        hash: "6b6e06e8473d5703e217accd824b08d5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6256
+        hash: "8e38bc5b00e33e24f931b181dc77d3c1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 38; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6272
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6288
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6304
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6320
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 38; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6336
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6352
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6368
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6384
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6400
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6416
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6432
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6448
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6464
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6480
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6496
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6512
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6528
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6544
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6560
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6576
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6592
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6608
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6624
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6640
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6656
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6672
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6688
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6704
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6720
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6736
+        image: "nested.7.png"
+    }
+    Frame {
+        msec: 6752
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6768
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6784
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6800
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6816
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6832
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6848
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6864
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6880
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6896
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6912
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6928
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6944
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6960
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6976
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6992
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7008
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7024
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7040
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7056
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7072
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 46; y: 225
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7088
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7104
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 226
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7120
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 228
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7136
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 233
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7152
+        hash: "35dd0f784c356be0050936ff75b0cdf7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 245
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7168
+        hash: "9ac066a700eae45edf9b2f1ba12f0324"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 248
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 255
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7184
+        hash: "22a2a8bf257918820b0ab55ecb14b479"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 259
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 266
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7200
+        hash: "eb98237e06cde8ed2f18040ce9197d16"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 272
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 276
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7216
+        hash: "f0c7afe1bd25b9b573cbc69154c25862"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 282
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 285
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7232
+        hash: "d6a681b6de867db47f889e6f1ec03dcf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 291
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 293
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7248
+        hash: "0ee281281c7654567a1debae7a13abe0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 304
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7264
+        hash: "9d5f1c8cb0953c14bdd49aa88d2b225f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 306
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 310
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7280
+        hash: "ae1c2a3ed67c5c10fc9d19de4de7b7eb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 312
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 315
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7296
+        hash: "8505f9d060fc17fef2e91eb2add206bb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 316
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 318
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7312
+        hash: "c32a6d546a3e4f2ee5349a7dad4b30af"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 319
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 320
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7328
+        hash: "222f6e8e8deab567f1e7d0aaf7035b60"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 321
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 322
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7344
+        hash: "f7011629f44015187849daad6a53cebf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 323
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 324
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7360
+        hash: "56b00d9116a51c041483dd00db0aca90"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 325
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 326
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7376
+        hash: "93232fbcafe8e279b37781f51dfb923a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 328
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 329
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7392
+        hash: "9fcf62eaacfc3477a4550c31f03c4782"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 330
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 331
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7408
+        hash: "dd669865fd36e42eec1d69860b29e7ce"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 331
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7424
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Frame {
+        msec: 7440
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Frame {
+        msec: 7456
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 330
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7472
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 329
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 328
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7488
+        hash: "69ef9255a29d65f26e5441594ea1bad9"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 325
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 323
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7504
+        hash: "055f73dd085d2f65a055ba4d9a8a7539"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 318
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 316
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7520
+        hash: "384da5b6a948a52d0519935a8e33f014"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 309
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 303
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7536
+        hash: "1caa0049be4033db45f0d2debb25268f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 55; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 55; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7552
+        hash: "76b8d00b3a2a68fec277050a442c18ca"
+    }
+    Frame {
+        msec: 7568
+        hash: "0ee281281c7654567a1debae7a13abe0"
+    }
+    Frame {
+        msec: 7584
+        hash: "df1dbb027a8542aa6120cce7b69724a7"
+    }
+    Frame {
+        msec: 7600
+        hash: "06a4d9b1d73362b3e29c6cf52fdb515c"
+    }
+    Frame {
+        msec: 7616
+        hash: "876c0dc8a68a4c1253b7aed6316cb892"
+    }
+    Frame {
+        msec: 7632
+        hash: "b46c74b1a2535099f0cdb8093bd49a4e"
+    }
+    Frame {
+        msec: 7648
+        hash: "0ad09a7638aa6f2affe47db2a810196f"
+    }
+    Frame {
+        msec: 7664
+        hash: "3710dde54d7e4a10a2c3ca2f891da7f5"
+    }
+    Frame {
+        msec: 7680
+        hash: "8426a607c92fbfa508e81c620d90e919"
+    }
+    Frame {
+        msec: 7696
+        image: "nested.8.png"
+    }
+    Frame {
+        msec: 7712
+        hash: "1f38e34787c909d93d567f983a425257"
+    }
+    Frame {
+        msec: 7728
+        hash: "7b09913793d4c79d948fdff1b72c7124"
+    }
+    Frame {
+        msec: 7744
+        hash: "8a0d1484c073d8107b4bf9949edcdb18"
+    }
+    Frame {
+        msec: 7760
+        hash: "4bad25465dfdcc41995216b0f6a5191b"
+    }
+    Frame {
+        msec: 7776
+        hash: "6d39bbeb5f74273c1ed0231ac34fe094"
+    }
+    Frame {
+        msec: 7792
+        hash: "8ccc2e33b8d6c67162326d229e9c17ab"
+    }
+    Frame {
+        msec: 7808
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7824
+        hash: "b87d739e49f0427d9da577ac5147fd21"
+    }
+    Frame {
+        msec: 7840
+        hash: "7d0efbfceec35e591f9fae650288809b"
+    }
+    Frame {
+        msec: 7856
+        hash: "7d0efbfceec35e591f9fae650288809b"
+    }
+    Frame {
+        msec: 7872
+        hash: "ff5d2037d3cc7bb6930cabc3d53f0196"
+    }
+    Frame {
+        msec: 7888
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7904
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7920
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7936
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7952
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7968
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7984
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8000
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8016
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8032
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8048
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8064
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8080
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8096
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8112
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8128
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8144
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8160
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8176
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8192
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8208
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8224
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8240
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8256
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8272
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8288
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8304
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8320
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8336
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8352
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8368
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8384
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8400
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8416
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8432
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8448
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8464
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8480
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8496
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8512
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8528
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8544
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8560
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8576
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8592
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8608
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8624
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8640
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8656
+        image: "nested.9.png"
+    }
+    Frame {
+        msec: 8672
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8688
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8704
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8720
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8736
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8752
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8768
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8784
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8800
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8816
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8832
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8848
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8864
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8880
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8896
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8912
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8928
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8944
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8960
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8976
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8992
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 9008
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 9024
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml
new file mode 100644
index 0000000..b2d88d2
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml
@@ -0,0 +1,62 @@
+import QtQuick 1.0
+
+/*
+  Test nested MouseArea with different drag axes.
+*/
+
+Rectangle{
+    width:400
+    height:360
+    color: "white"
+    Flickable {
+        anchors.fill: parent
+        contentWidth: 600
+        contentHeight: 600
+        Rectangle{
+            id: draggable
+            width:200; height:200; color: "lightsteelblue"
+            opacity: ma1.drag.active ? 0.5 : 1.0
+            y:20
+            MouseArea{
+                id: ma1
+                objectName: "one"
+                anchors.fill: parent
+                drag.target: draggable
+                drag.axis: "XandYAxis"
+                drag.filterChildren: true
+                drag.minimumX: 0
+                drag.maximumX: 200
+                drag.minimumY: 20
+                drag.maximumY: 220
+                Rectangle{
+                    id: draggable_inner
+                    width:40; height:40; color: "red"
+                        y:20
+                    MouseArea{
+                        objectName: "two"
+                        anchors.fill: parent
+                        drag.target: draggable_inner
+                        drag.axis: "XAxis"
+                        drag.minimumX: 0
+                        drag.maximumX: 360
+                    }
+                }
+            }
+        }
+        Rectangle{
+            id: draggable3
+            width:40; height:40; color: "green"
+            opacity: ma3.drag.active ? 0.5 : 1.0
+            y:210
+            MouseArea{
+                id: ma3
+                objectName: "three"
+                anchors.fill: parent
+                drag.target: draggable3
+                drag.axis: "XAxis"
+                drag.minimumX: 0
+                drag.maximumX: 360
+            }
+        }
+    }
+}
-- 
cgit v0.12


From 5149da5a564c883209566f3baaeea15932eee1c2 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Wed, 24 Nov 2010 15:42:35 +1000
Subject: Fix incorrect example for Qt.rgba()

---
 doc/src/declarative/basictypes.qdoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 8ab06ab..71192bf 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -166,7 +166,7 @@
     \l{QML:Qt::lighter()}{Qt.lighter()} or \l{QML:Qt::tint()}{Qt.tint()} functions:
 
     \qml
-    Rectangle { color: Qt.rgba(255, 0, 0, 1) }
+    Rectangle { color: Qt.rgba(0.5, 0.5, 0, 1) }
     \endqml
 
     \sa {QML Basic Types}
-- 
cgit v0.12


From fe8276e812c5fdc690715d7e36a6b6d70cba7d33 Mon Sep 17 00:00:00 2001
From: Jason McDonald <jason.mcdonald@nokia.com>
Date: Wed, 24 Nov 2010 17:00:20 +1000
Subject: Prevent compilers optimizing eval timebomb code out of existence.

The variable that holds the eval license key is a placeholder that is
patched during package installation.  Unfortunately, for a non-final
package build, the placeholder is filled with nulls at compile-time and
a clever compiler will optimize away most of the eval timebomb code due
to a check in the eval code for the first character of the license key
being null.

This commit makes the variable that holds the license key volatile, to
convince compilers that they cannot make assumptions about the contents
of the variable when optimizing.

Task-number: QT-3848
Acked-by: Thiago Macieira
---
 configure                          | 2 +-
 src/corelib/kernel/qtcore_eval.cpp | 4 ++--
 tools/configure/configureapp.cpp   | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/configure b/configure
index 5aab180..059aa1a 100755
--- a/configure
+++ b/configure
@@ -4520,7 +4520,7 @@ if [ -n "$EVALKEY" ]; then
     rm -f "$outpath/src/corelib/global/qconfig_eval.cpp"
     cat > "$outpath/src/corelib/global/qconfig_eval.cpp" <<EOF
 /* Evaluation license key */
-static const char qt_eval_key_data                   [512 + 12] = "$EVALKEY";
+static const volatile char qt_eval_key_data                   [512 + 12] = "$EVALKEY";
 EOF
     chmod -w "$outpath/src/corelib/global/qconfig_eval.cpp"
 fi
diff --git a/src/corelib/kernel/qtcore_eval.cpp b/src/corelib/kernel/qtcore_eval.cpp
index 78556c3..da76b74 100644
--- a/src/corelib/kernel/qtcore_eval.cpp
+++ b/src/corelib/kernel/qtcore_eval.cpp
@@ -90,14 +90,14 @@ static const char will_shutdown_now[] =
 
 static int qt_eval_is_supported()
 {
-    const char *const license_key = qt_eval_key_data + 12;
+    const volatile char *const license_key = qt_eval_key_data + 12;
 
     // fast fail
     if (!qt_eval_key_data[0] || !*license_key)
         return -1;
 
     // is this an unsupported evaluation?
-    const char* typecode = license_key;
+    const volatile char *typecode = license_key;
     int field = 2;
     for ( ; field && *typecode; ++typecode)
         if (*typecode == '-')
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 3808c4e..5966fd2 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -3331,7 +3331,7 @@ void Configure::generateConfigfiles()
     if (tmpFile3.open()) {
         tmpStream.setDevice(&tmpFile3);
         tmpStream << "/* Evaluation license key */" << endl
-                  << "static const char qt_eval_key_data              [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
+                  << "static const volatile char qt_eval_key_data              [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
 
         tmpStream.flush();
         tmpFile3.flush();
-- 
cgit v0.12


From d13d0246352a5d6c26d28d2b8ff8313eb30f6299 Mon Sep 17 00:00:00 2001
From: Gareth Stockwell <ext-gareth.stockwell@nokia.com>
Date: Wed, 24 Nov 2010 08:36:15 +0000
Subject: Fixed tst_qwidget::winIdChangeEvent

During reparenting of a native widget, the winId is now first set
to zero before being set to the new value.

Reviewed-by: Jason Barron
---
 tests/auto/qwidget/tst_qwidget.cpp | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index 09af941..5521873 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -4389,7 +4389,6 @@ class WinIdChangeWidget : public QWidget {
 public:
     WinIdChangeWidget(QWidget *p = 0)
         : QWidget(p)
-        , m_winIdChangeEventCount(0)
     {
 
     }
@@ -4397,13 +4396,14 @@ protected:
     bool event(QEvent *e)
     {
         if (e->type() == QEvent::WinIdChange) {
-            ++m_winIdChangeEventCount;
+            m_winIdList.append(internalWinId());
             return true;
         }
         return QWidget::event(e);
     }
 public:
-    int m_winIdChangeEventCount;
+    QList<WId> m_winIdList;
+    int winIdChangeEventCount() const { return m_winIdList.count(); }
 };
 
 void tst_QWidget::winIdChangeEvent()
@@ -4414,7 +4414,7 @@ void tst_QWidget::winIdChangeEvent()
         const WId winIdBefore = widget.internalWinId();
         const WId winIdAfter = widget.winId();
         QVERIFY(winIdBefore != winIdAfter);
-        QCOMPARE(widget.m_winIdChangeEventCount, 1);
+        QCOMPARE(widget.winIdChangeEventCount(), 1);
     }
 
     {
@@ -4423,11 +4423,13 @@ void tst_QWidget::winIdChangeEvent()
         QWidget parent1, parent2;
         WinIdChangeWidget child(&parent1);
         const WId winIdBefore = child.winId();
-        QCOMPARE(child.m_winIdChangeEventCount, 1);
+        QCOMPARE(child.winIdChangeEventCount(), 1);
         child.setParent(&parent2);
         const WId winIdAfter = child.internalWinId();
         QVERIFY(winIdBefore != winIdAfter);
-        QCOMPARE(child.m_winIdChangeEventCount, 2);
+        QCOMPARE(child.winIdChangeEventCount(), 3);
+        // winId is set to zero during reparenting
+        QVERIFY(0 == child.m_winIdList[1]);
     }
 
     {
@@ -4437,15 +4439,16 @@ void tst_QWidget::winIdChangeEvent()
         QWidget parent(&grandparent1);
         WinIdChangeWidget child(&parent);
         const WId winIdBefore = child.winId();
-        QCOMPARE(child.m_winIdChangeEventCount, 1);
+        QCOMPARE(child.winIdChangeEventCount(), 1);
         parent.setParent(&grandparent2);
         const WId winIdAfter = child.internalWinId();
 #ifdef Q_OS_SYMBIAN
         QVERIFY(winIdBefore != winIdAfter);
-        QCOMPARE(child.m_winIdChangeEventCount, 2);
+        QVERIFY(winIdAfter != 0);
+        QCOMPARE(child.winIdChangeEventCount(), 2);
 #else
         QCOMPARE(winIdBefore, winIdAfter);
-        QCOMPARE(child.m_winIdChangeEventCount, 1);
+        QCOMPARE(child.winIdChangeEventCount(), 1);
 #endif
     }
 
@@ -4457,7 +4460,7 @@ void tst_QWidget::winIdChangeEvent()
         child.setParent(&parent2);
         const WId winIdAfter = child.internalWinId();
         QCOMPARE(winIdBefore, winIdAfter);
-        QCOMPARE(child.m_winIdChangeEventCount, 0);
+        QCOMPARE(child.winIdChangeEventCount(), 0);
     }
 
     {
@@ -4466,12 +4469,14 @@ void tst_QWidget::winIdChangeEvent()
         WinIdChangeWidget child(&parent);
         child.winId();
         const WId winIdBefore = child.internalWinId();
-        QCOMPARE(child.m_winIdChangeEventCount, 1);
+        QCOMPARE(child.winIdChangeEventCount(), 1);
         const Qt::WindowFlags flags = child.windowFlags();
         child.setWindowFlags(flags | Qt::Window);
         const WId winIdAfter = child.internalWinId();
         QVERIFY(winIdBefore != winIdAfter);
-        QCOMPARE(child.m_winIdChangeEventCount, 2);
+        QCOMPARE(child.winIdChangeEventCount(), 3);
+        // winId is set to zero during reparenting
+        QVERIFY(0 == child.m_winIdList[1]);
     }
 }
 
-- 
cgit v0.12


From a17a8bfe860b6a055f60068ef04f9e31278cd6c4 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 23 Nov 2010 17:11:42 +0100
Subject: Enable the no-undefined flag on the linker for icc

Reviewed-by: Thiago
---
 src/qbase.pri | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/qbase.pri b/src/qbase.pri
index 4217618..8460b9c 100644
--- a/src/qbase.pri
+++ b/src/qbase.pri
@@ -36,7 +36,7 @@ CONFIG		+= qt warn_on depend_includepath
 CONFIG          += qmake_cache target_qt 
 CONFIG          -= fix_output_dirs
 win32|mac:!macx-xcode:CONFIG += debug_and_release
-linux*-g++*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
+linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
 
 contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
 unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
-- 
cgit v0.12


From e1cde7c26b4923299b78e6165416788fbf8cd30e Mon Sep 17 00:00:00 2001
From: hawcroft <derick.hawcroft@nokia.com>
Date: Thu, 25 Nov 2010 10:10:27 +1000
Subject: fix inf loop bug

Task-number: QTBUG-15409
Reviewed-by: Andrew Den-Exter
---
 src/gui/kernel/qsound_s60.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/kernel/qsound_s60.cpp b/src/gui/kernel/qsound_s60.cpp
index df2830b..accfce2 100644
--- a/src/gui/kernel/qsound_s60.cpp
+++ b/src/gui/kernel/qsound_s60.cpp
@@ -150,7 +150,7 @@ void QAuServerS60::playCompleted(QAuBucketS60 *bucket, int error)
     } else {
         // We don't have a way to inform about errors -> just decrement loops
         // in order that QSound::isFinished will return true;
-        while (decLoop(sound)) {}
+        while (decLoop(sound) > 0) {}
         if (staticPlayingSounds.removeAll(sound))
             delete sound;
     }
-- 
cgit v0.12


From b04df748d8c170a969eb6a3097cbda7a08fb3ea1 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 25 Nov 2010 10:11:01 +1000
Subject: Document KeyEvent::modifiers

Task-number: QTBUG-15569
---
 .../graphicsitems/qdeclarativeevents.cpp           | 30 +++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeevents.cpp b/src/declarative/graphicsitems/qdeclarativeevents.cpp
index 61fd562..4b5e777 100644
--- a/src/declarative/graphicsitems/qdeclarativeevents.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeevents.cpp
@@ -108,6 +108,34 @@ Item {
     so that ancestor items do not also respond to the same event.
 */
 
+/*!
+    \qmlproperty int KeyEvent::modifiers
+
+    This property holds the keyboard modifier flags that existed immediately
+    before the event occurred.
+
+    It contains a bitwise combination of:
+    \list
+    \o Qt.NoModifier - No modifier key is pressed.
+    \o Qt.ShiftModifier - A Shift key on the keyboard is pressed.
+    \o Qt.ControlModifier - A Ctrl key on the keyboard is pressed.
+    \o Qt.AltModifier - An Alt key on the keyboard is pressed.
+    \o Qt.MetaModifier - A Meta key on the keyboard is pressed.
+    \o Qt.KeypadModifier - A keypad button is pressed.
+    \endlist
+
+    For example, to react to a Shift key + Enter key combination:
+    \qml
+    Item {
+        focus: true
+        Keys.onPressed: {
+            if ((event.key == Qt.Key_Enter) && (event.modifiers & Qt.ShiftModifier))
+                doSomething();
+        }
+    }
+    \endqml
+*/
+
 
 /*!
     \qmlclass MouseEvent QDeclarativeMouseEvent
@@ -199,7 +227,7 @@ Item {
     \qml
     MouseArea {
         onClicked: {
-            if (mouse.button == Qt.LeftButton && mouse.modifiers & Qt.ShiftModifier)
+            if ((mouse.button == Qt.LeftButton) && (mouse.modifiers & Qt.ShiftModifier))
                 doSomething();
         }
     }
-- 
cgit v0.12


From 9e353ea7a1fedd020d39e83322286931f536dc16 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Thu, 25 Nov 2010 13:36:24 +1000
Subject: End painting of Rectangle pixmap before inserting it to pixmap cache
 to avoid an unnecessary copy

Task-number: QTBUG-15534
Reviewed-by: Martin Jones
---
 src/declarative/graphicsitems/qdeclarativerectangle.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
index 7686dde..dedb3f7 100644
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
@@ -420,6 +420,10 @@ void QDeclarativeRectangle::generateRoundedRect()
                 p.drawRoundedRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)), d->radius, d->radius);
             else
                 p.drawRoundedRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw), d->radius, d->radius);
+
+            // end painting before inserting pixmap
+            // to pixmap cache to avoid a deep copy
+            p.end();
             QPixmapCache::insert(key, d->rectImage);
         }
     }
@@ -454,6 +458,10 @@ void QDeclarativeRectangle::generateBorderedRect()
                 p.drawRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)));
             else
                 p.drawRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw));
+
+            // end painting before inserting pixmap
+            // to pixmap cache to avoid a deep copy
+            p.end();
             QPixmapCache::insert(key, d->rectImage);
         }
     }
-- 
cgit v0.12


From bb575d308350036eff913a6b61c680712613c540 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 25 Nov 2010 14:21:11 +1000
Subject: Update visual tests

Just a frame here or there, probably warranted.
---
 .../qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml     | 2 +-
 .../qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml       | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
index 5cb4f78..a94aca8 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
@@ -994,7 +994,7 @@ VisualTest {
     }
     Frame {
         msec: 3264
-        hash: "10a89da9887cb4bbd812c090a8a56797"
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
     }
     Mouse {
         type: 5
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
index 8c746bf..920a48f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
@@ -1922,7 +1922,7 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "155a834ddaa7128b6f5a2a406b340315"
+        hash: "16b99c9cf5297a5251869a3935084cf7"
     }
     Mouse {
         type: 5
@@ -2106,7 +2106,7 @@ VisualTest {
     }
     Frame {
         msec: 4768
-        hash: "155a834ddaa7128b6f5a2a406b340315"
+        hash: "d315f82e175361fed83193ce550cb6e9"
     }
     Mouse {
         type: 5
-- 
cgit v0.12


From 852f4811453cb0b082748f2fcefac5898e603ab0 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 25 Nov 2010 15:33:13 +1000
Subject: Fixup visual tests on Mac

Disable sub-pixel antialiasing and skip text on 10.5
---
 tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp | 8 +++++++-
 tools/qml/qdeclarativetester.cpp                   | 9 +++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
index 2a15102..18fbfca 100644
--- a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
+++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
@@ -105,10 +105,16 @@ void tst_qmlvisual::visual_data()
     files << findQmlFiles(QDir(QT_TEST_SOURCE_DIR));
     if (qgetenv("QMLVISUAL_ALL") != "1") {
 #if defined(Q_WS_X11)
-        //Text on X11 varies per distro - and the CI system is currently using something outdated.
+        //Text on X11 varies per version - and the CI system is currently using something outdated.
         foreach(const QString &str, files.filter(QRegExp(".*text.*")))
             files.removeAll(str);
 #endif
+#if defined(Q_WS_MAC)
+        //Text on Mac also varies per version. Only check the text on 10.6
+        if(QSysInfo::MacintoshVersion != QSysInfo::MV_10_6)
+            foreach(const QString &str, files.filter(QRegExp(".*text.*")))
+                files.removeAll(str);
+#endif
 #if defined(Q_WS_QWS)
         //We don't want QWS test results to mire down the CI system
         files.clear();
diff --git a/tools/qml/qdeclarativetester.cpp b/tools/qml/qdeclarativetester.cpp
index a516fd7..e3a1f59 100644
--- a/tools/qml/qdeclarativetester.cpp
+++ b/tools/qml/qdeclarativetester.cpp
@@ -274,7 +274,16 @@ void QDeclarativeTester::updateCurrentTime(int msec)
 
     if (options & QDeclarativeViewer::TestImages) {
         img.fill(qRgb(255,255,255));
+
+#ifdef Q_WS_MAC
+        bool oldSmooth = qt_applefontsmoothing_enabled;
+        qt_applefontsmoothing_enabled = false;
+#endif
         QPainter p(&img);
+#ifdef Q_WS_MAC
+        qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+
         m_view->render(&p);
     }
 
-- 
cgit v0.12


From d11f5011f84099a6558840118588c293605b05d4 Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Thu, 25 Nov 2010 17:36:11 +1000
Subject: Update qml visual tests for mac.

---
 .../data-MAC/flickable-horizontal.0.png            |  Bin 0 -> 1439 bytes
 .../data-MAC/flickable-horizontal.1.png            |  Bin 0 -> 1424 bytes
 .../data-MAC/flickable-horizontal.2.png            |  Bin 0 -> 1428 bytes
 .../data-MAC/flickable-horizontal.3.png            |  Bin 0 -> 1396 bytes
 .../data-MAC/flickable-horizontal.4.png            |  Bin 0 -> 1454 bytes
 .../data-MAC/flickable-horizontal.qml              | 1575 +++++++++++++++++
 .../data-MAC/follow.0.png                          |  Bin 0 -> 941 bytes
 .../data-MAC/follow.1.png                          |  Bin 0 -> 975 bytes
 .../data-MAC/follow.2.png                          |  Bin 0 -> 1235 bytes
 .../data-MAC/follow.3.png                          |  Bin 0 -> 1225 bytes
 .../data-MAC/follow.4.png                          |  Bin 0 -> 1247 bytes
 .../data-MAC/follow.5.png                          |  Bin 0 -> 1243 bytes
 .../data-MAC/follow.6.png                          |  Bin 0 -> 1234 bytes
 .../data-MAC/follow.7.png                          |  Bin 0 -> 1242 bytes
 .../data-MAC/follow.qml                            | 1763 ++++++++++++++++++++
 .../align/data-MAC/multilineAlign.0.png            |  Bin 2569 -> 801 bytes
 .../align/data-MAC/multilineAlign.qml              |  118 +-
 .../baseline/data-MAC/parentanchor.0.png           |  Bin 5648 -> 1392 bytes
 .../baseline/data-MAC/parentanchor.qml             |   60 +-
 .../bugs/data-MAC/QTBUG-14469.0.png                |  Bin 0 -> 210 bytes
 .../bugs/data-MAC/QTBUG-14469.1.png                |  Bin 0 -> 270 bytes
 .../qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml |  475 ++++++
 .../qdeclarativetext/data-MAC/qtbug_14865.0.png    |  Bin 1083 -> 322 bytes
 .../qdeclarativetext/data-MAC/qtbug_14865.1.png    |  Bin 1083 -> 322 bytes
 .../qdeclarativetext/data-MAC/qtbug_14865.qml      |  122 +-
 .../qdeclarativetext/elide/data-MAC/elide.0.png    |  Bin 1353 -> 491 bytes
 .../qdeclarativetext/elide/data-MAC/elide.1.png    |  Bin 1353 -> 491 bytes
 .../qdeclarativetext/elide/data-MAC/elide.qml      |  130 +-
 .../qdeclarativetext/elide/data-MAC/elide2.0.png   |  Bin 3572 -> 1240 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.1.png   |  Bin 3320 -> 1106 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.2.png   |  Bin 2953 -> 999 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.3.png   |  Bin 2386 -> 864 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.4.png   |  Bin 1650 -> 703 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.qml     |  480 +++---
 .../elide/data-MAC/multilength.0.png               |  Bin 2748 -> 791 bytes
 .../elide/data-MAC/multilength.1.png               |  Bin 3064 -> 854 bytes
 .../elide/data-MAC/multilength.qml                 |  144 +-
 .../qdeclarativetext/font/data-MAC/plaintext.0.png |  Bin 60155 -> 14238 bytes
 .../font/data-MAC/plaintext2.0.png                 |  Bin 3805 -> 1563 bytes
 .../font/data-MAC/plaintext3.0.png                 |  Bin 21056 -> 6348 bytes
 .../qdeclarativetext/font/data-MAC/richtext.0.png  |  Bin 62489 -> 9321 bytes
 .../qdeclarativetext/font/data-MAC/richtext2.0.png |  Bin 29962 -> 10663 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.1.png  |  Bin 715 -> 343 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.2.png  |  Bin 1295 -> 461 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.3.png  |  Bin 1922 -> 539 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.qml    |  332 ++--
 .../data-MAC/usingLineEdit.qml                     |   12 +-
 47 files changed, 4512 insertions(+), 699 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png
new file mode 100644
index 0000000..9a81b29
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png
new file mode 100644
index 0000000..2d9c4fd
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png
new file mode 100644
index 0000000..2bb0cb0
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png
new file mode 100644
index 0000000..8260a65
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png
new file mode 100644
index 0000000..0abcbc2
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml
new file mode 100644
index 0000000..f1bb428
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml
@@ -0,0 +1,1575 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "flickable-horizontal.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 48
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 64
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 80
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 96
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 112
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 128
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 144
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 160
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 176
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 192
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 208
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 224
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 240
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 256
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 272
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 288
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 304
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 320
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 336
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 352
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 368
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 384
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 400
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 416
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 432
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 448
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 464
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 480
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 496
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 512
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 528
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 544
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 560
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 576
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 592
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 608
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 624
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 640
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 656
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 672
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 688
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 704
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 720
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 447; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 736
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 752
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 768
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 446; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 784
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 440; y: 146
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 800
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 425; y: 151
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 407; y: 157
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 816
+        hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 359; y: 169
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 832
+        hash: "90f94986ab44ab59618e9a5da17b8cc9"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 309; y: 181
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 848
+        hash: "0154a65f8693b98576101ac1c2fc8761"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 282; y: 187
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 282; y: 187
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 864
+        hash: "792c1b5267f14c891dae2348a8188a92"
+    }
+    Frame {
+        msec: 880
+        hash: "15ce9e88d4ad2e698bf167d1432c0b8a"
+    }
+    Frame {
+        msec: 896
+        hash: "8f4109ef4c24d286d73f689565a0d056"
+    }
+    Frame {
+        msec: 912
+        hash: "f5728190bf5c94742686f063b4a4b09b"
+    }
+    Frame {
+        msec: 928
+        hash: "a38c7527a9a818b7bc25466b0e4939f9"
+    }
+    Frame {
+        msec: 944
+        hash: "ed3902455fc31a4e3232308b815a4daa"
+    }
+    Frame {
+        msec: 960
+        hash: "a2093589363ac2d50491412e99e0193a"
+    }
+    Frame {
+        msec: 976
+        image: "flickable-horizontal.1.png"
+    }
+    Frame {
+        msec: 992
+        hash: "c32349580e3a9586cc1133c935607cf0"
+    }
+    Frame {
+        msec: 1008
+        hash: "cd2068492e346eb20d50aee69e3a3559"
+    }
+    Frame {
+        msec: 1024
+        hash: "f43a1a38894b8ffad009ba995d84b0ee"
+    }
+    Frame {
+        msec: 1040
+        hash: "2d5c4a73df2a054801571f1ce119e31f"
+    }
+    Frame {
+        msec: 1056
+        hash: "b8825cc6bdca8102a655d797ea41b5b1"
+    }
+    Frame {
+        msec: 1072
+        hash: "3f0be15b85220743d004f2d54b6e137c"
+    }
+    Frame {
+        msec: 1088
+        hash: "4b0952d33149b44ffa0a06723a4116c7"
+    }
+    Frame {
+        msec: 1104
+        hash: "9056bda43259e92cfe56fdf394e2ca54"
+    }
+    Frame {
+        msec: 1120
+        hash: "82ec9f09d2303e5b0b9c05b9a10a84db"
+    }
+    Frame {
+        msec: 1136
+        hash: "751a9b3054c09d900364d7c9cac8bc2b"
+    }
+    Frame {
+        msec: 1152
+        hash: "17dfdfef20f9da7e8b6f16df974baea9"
+    }
+    Frame {
+        msec: 1168
+        hash: "108e6d9a5a81df32823bfd7a90a000a7"
+    }
+    Frame {
+        msec: 1184
+        hash: "71dd0d55a3e837d3a8e4b4e318579ade"
+    }
+    Frame {
+        msec: 1200
+        hash: "8013cdb2615bca89134ea040409af509"
+    }
+    Frame {
+        msec: 1216
+        hash: "4b2826ad4c755690bd837994133f5fac"
+    }
+    Frame {
+        msec: 1232
+        hash: "52d0da7f138bd37ac587a448d6402aca"
+    }
+    Frame {
+        msec: 1248
+        hash: "e634724c5bb294d338210845bf64d2cf"
+    }
+    Frame {
+        msec: 1264
+        hash: "59bc5f0d057ee431f289806377f19213"
+    }
+    Frame {
+        msec: 1280
+        hash: "6ef2c5f7766c2cc77b30d636bfaa4422"
+    }
+    Frame {
+        msec: 1296
+        hash: "578d056c3db094420dbaa51bd08ced20"
+    }
+    Frame {
+        msec: 1312
+        hash: "14c6f7a04a52caffefa07af556ccb262"
+    }
+    Frame {
+        msec: 1328
+        hash: "7cb63d56fec144d0509ce219fc6fe459"
+    }
+    Frame {
+        msec: 1344
+        hash: "462dafa7f6427aecf6c28a5dcf5a10cc"
+    }
+    Frame {
+        msec: 1360
+        hash: "45360814f985ed780a443568a91fc170"
+    }
+    Frame {
+        msec: 1376
+        hash: "0d18ceb2436e4f7eb56a3443fab706e6"
+    }
+    Frame {
+        msec: 1392
+        hash: "1d83f367ba9f7f1d4496208271e925ed"
+    }
+    Frame {
+        msec: 1408
+        hash: "fdbd00ee4c122aef779df42ea53f403a"
+    }
+    Frame {
+        msec: 1424
+        hash: "bedd1cb304efd4851813b39a746198a4"
+    }
+    Frame {
+        msec: 1440
+        hash: "9aa7bed86efa9634466736f20ee0ab5b"
+    }
+    Frame {
+        msec: 1456
+        hash: "00fc8186a7ae44e10195a7b13defa0d2"
+    }
+    Frame {
+        msec: 1472
+        hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+    }
+    Frame {
+        msec: 1488
+        hash: "df074f8c210249e5ef652349479b6325"
+    }
+    Frame {
+        msec: 1504
+        hash: "4f94020437e35cf44dd3576997990ab7"
+    }
+    Frame {
+        msec: 1520
+        hash: "8ca6c3b4fa3be73ac35073356b680a35"
+    }
+    Frame {
+        msec: 1536
+        hash: "c25eee1c5791383ebc59974e7754eacb"
+    }
+    Frame {
+        msec: 1552
+        hash: "f4917ada78942428cc6b9aa5e56c013d"
+    }
+    Frame {
+        msec: 1568
+        hash: "23e1e607101fc7260a4ac841344f5fe0"
+    }
+    Frame {
+        msec: 1584
+        hash: "2dcc7d187d8e0493e5766efbf09ef37c"
+    }
+    Frame {
+        msec: 1600
+        hash: "c1e5602753e80cf44d7b330140c6912e"
+    }
+    Frame {
+        msec: 1616
+        hash: "febaf72d01a3763461b4b7d2ddd7a23e"
+    }
+    Frame {
+        msec: 1632
+        hash: "071262b911b61576f451be25691a57cf"
+    }
+    Frame {
+        msec: 1648
+        hash: "44705db9289fd8753b9d63e8bc963b38"
+    }
+    Frame {
+        msec: 1664
+        hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+    }
+    Frame {
+        msec: 1680
+        hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+    }
+    Frame {
+        msec: 1696
+        hash: "071262b911b61576f451be25691a57cf"
+    }
+    Frame {
+        msec: 1712
+        hash: "a00aa90e894b48203b0446ca287ee712"
+    }
+    Frame {
+        msec: 1728
+        hash: "26c9ca53ee4b084c6595ad65bf4880df"
+    }
+    Frame {
+        msec: 1744
+        hash: "f4917ada78942428cc6b9aa5e56c013d"
+    }
+    Frame {
+        msec: 1760
+        hash: "ffedee7bf2d8099e361b8b1706b03f88"
+    }
+    Frame {
+        msec: 1776
+        hash: "1778ef1629ce977015b641448b46634f"
+    }
+    Frame {
+        msec: 1792
+        hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+    }
+    Frame {
+        msec: 1808
+        hash: "99e843ec69b79b79b0792e0a2f28cd1b"
+    }
+    Frame {
+        msec: 1824
+        hash: "8b3ebca70b50a6a93823e015ea80f0f9"
+    }
+    Frame {
+        msec: 1840
+        hash: "8eaa7f076064ce55051237b04861e408"
+    }
+    Frame {
+        msec: 1856
+        hash: "6acc0ca5e5808d911287edfa78c8ac02"
+    }
+    Frame {
+        msec: 1872
+        hash: "e9f05899e0b53c21f6efe834095a3ea4"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 91; y: 208
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 209
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1888
+        hash: "e9f05899e0b53c21f6efe834095a3ea4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 99; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 108; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1904
+        hash: "d2dece405f5f6ed1de2acb6615a931de"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 142; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1920
+        hash: "21e0f21edc77424e8327c9a3350ecc1d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 198; y: 216
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1936
+        image: "flickable-horizontal.2.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 229; y: 218
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 266; y: 220
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1952
+        hash: "c10c8b0c94f899414d8b3ef0b7c97646"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 322; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 322; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1968
+        hash: "807aff4e6c96a9d0de7fa55e233446b1"
+    }
+    Frame {
+        msec: 1984
+        hash: "dbd02848cefacbb26f4bcb7d8f073d6c"
+    }
+    Frame {
+        msec: 2000
+        hash: "9a60608d8ea1b39fa2d3851873f2f08e"
+    }
+    Frame {
+        msec: 2016
+        hash: "e7b3e3a40281f63889808211d6746374"
+    }
+    Frame {
+        msec: 2032
+        hash: "188c225c46ec00105df230bfeea09974"
+    }
+    Frame {
+        msec: 2048
+        hash: "e2e977b42e91d8c5dee57fd8245692eb"
+    }
+    Frame {
+        msec: 2064
+        hash: "ca2f12fb173c405f95e608858ab982ad"
+    }
+    Frame {
+        msec: 2080
+        hash: "fa86ee5f25fa425cf2569c8ef570b9d8"
+    }
+    Frame {
+        msec: 2096
+        hash: "9b74656866fb8c7394bbbecec6414aca"
+    }
+    Frame {
+        msec: 2112
+        hash: "87147326d1baab174c0f9a5ccdc2cb84"
+    }
+    Frame {
+        msec: 2128
+        hash: "c0d00f98c71bf3f8e5954b45fbab95a8"
+    }
+    Frame {
+        msec: 2144
+        hash: "c087d1d62e56e573b55c1d8599bba8a6"
+    }
+    Frame {
+        msec: 2160
+        hash: "dd5a94c6febdee58e8f115cb75131aaa"
+    }
+    Frame {
+        msec: 2176
+        hash: "a7465d6137f865f512ce65ceb29533b4"
+    }
+    Frame {
+        msec: 2192
+        hash: "409086f6bb661aab8b548fea56d7e6b1"
+    }
+    Frame {
+        msec: 2208
+        hash: "6a22911e0fb58df31271baa463ff599d"
+    }
+    Frame {
+        msec: 2224
+        hash: "c4f6dd30d5fdfcf91a8b29cf5c622423"
+    }
+    Frame {
+        msec: 2240
+        hash: "5a95b83f237c7243a198a43e9a587179"
+    }
+    Frame {
+        msec: 2256
+        hash: "d79ed290efc6dbd976d574bf0b14a6a3"
+    }
+    Frame {
+        msec: 2272
+        hash: "a7bcb436e96d7c981852239462573495"
+    }
+    Frame {
+        msec: 2288
+        hash: "f63cc82e351daab503e316f8b516990f"
+    }
+    Frame {
+        msec: 2304
+        hash: "4ea63cd25a1424042ffc60549a78563c"
+    }
+    Frame {
+        msec: 2320
+        hash: "ef0fb776012575b3b0dbf6e5f4dee571"
+    }
+    Frame {
+        msec: 2336
+        hash: "e2508faec7737be2666d87ad715b5f74"
+    }
+    Frame {
+        msec: 2352
+        hash: "9fe4e897c6b853f774d11817a0eb53bf"
+    }
+    Frame {
+        msec: 2368
+        hash: "c122ce2e73cbfedcc99d649c21d91f9d"
+    }
+    Frame {
+        msec: 2384
+        hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+    }
+    Frame {
+        msec: 2400
+        hash: "d0808284e431da60f61d571c257a3011"
+    }
+    Frame {
+        msec: 2416
+        hash: "df90f19450bf4d9496aab987a89e3a02"
+    }
+    Frame {
+        msec: 2432
+        hash: "5640c1e64556b90e7fbd4448fa9db462"
+    }
+    Frame {
+        msec: 2448
+        hash: "6d9b5c2f7d0dedbbc444e69bb39fed08"
+    }
+    Frame {
+        msec: 2464
+        hash: "485c4a8049068cf73bf22db5fd3618be"
+    }
+    Frame {
+        msec: 2480
+        hash: "9e25da59c9e7e4cf7796902e8e2ff92a"
+    }
+    Frame {
+        msec: 2496
+        hash: "bd45e8f2442d7c1a1b16a762bc29e7cf"
+    }
+    Frame {
+        msec: 2512
+        hash: "ec1013d23e581dbb39b1549d2e1b3b32"
+    }
+    Frame {
+        msec: 2528
+        hash: "1ea3c2fde8ee3a14406e027f2124d793"
+    }
+    Frame {
+        msec: 2544
+        hash: "3c3f31a05fb2f32538872c9fa158aaab"
+    }
+    Frame {
+        msec: 2560
+        hash: "05a84d9c55e634ec01edd2a63e13613b"
+    }
+    Frame {
+        msec: 2576
+        hash: "0f7ccd2da58e2e73b0ab18bb681dafd5"
+    }
+    Frame {
+        msec: 2592
+        hash: "e481ff78029f8bc4bf7c697db6824f6a"
+    }
+    Frame {
+        msec: 2608
+        hash: "efb92b8b7a90acabeb4a8d5cae52fe3c"
+    }
+    Frame {
+        msec: 2624
+        hash: "4728dd0fac4edf40cfd5ef5a422b4ed9"
+    }
+    Frame {
+        msec: 2640
+        hash: "27641dcd772c979ae22d12bfbadbb67f"
+    }
+    Frame {
+        msec: 2656
+        hash: "26268714105bc4832d336a38a859fc50"
+    }
+    Frame {
+        msec: 2672
+        hash: "caf0d351d3b6914ca52853a30643ea48"
+    }
+    Frame {
+        msec: 2688
+        hash: "319824b1143925162f04aaddcfaa65d9"
+    }
+    Frame {
+        msec: 2704
+        hash: "73aa36815f34bf5e005000e7da38555e"
+    }
+    Frame {
+        msec: 2720
+        hash: "73aa36815f34bf5e005000e7da38555e"
+    }
+    Frame {
+        msec: 2736
+        hash: "319824b1143925162f04aaddcfaa65d9"
+    }
+    Frame {
+        msec: 2752
+        hash: "caf0d351d3b6914ca52853a30643ea48"
+    }
+    Frame {
+        msec: 2768
+        hash: "6608412ee80d14e13a1a05fb4716e719"
+    }
+    Frame {
+        msec: 2784
+        hash: "f4f6f002fb76407a5120329972285dc4"
+    }
+    Frame {
+        msec: 2800
+        hash: "474d8b566b9e4ef7dc125a8df30ccbb1"
+    }
+    Frame {
+        msec: 2816
+        hash: "0133138f30be4ffc7f3af3d9f477c4b4"
+    }
+    Frame {
+        msec: 2832
+        hash: "e9ee9d7d0ab9dcea3f28ae71ee19270f"
+    }
+    Frame {
+        msec: 2848
+        hash: "9fd9eb665a42b48583bc28c6c0118799"
+    }
+    Frame {
+        msec: 2864
+        hash: "94231107bc4a7e900fe5f4eb823bd9bf"
+    }
+    Frame {
+        msec: 2880
+        hash: "6011b10728fb1c83f10d3c27366ea3a5"
+    }
+    Frame {
+        msec: 2896
+        image: "flickable-horizontal.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "e456c5fddb5fbcb02662716f19755622"
+    }
+    Frame {
+        msec: 2928
+        hash: "88cef15940302e2b8b43e73234fd7b9c"
+    }
+    Frame {
+        msec: 2944
+        hash: "041aecec2b0b0d59a56e1dd26b45cab1"
+    }
+    Frame {
+        msec: 2960
+        hash: "0d519463c713f3da46ecacd155e1a0f3"
+    }
+    Frame {
+        msec: 2976
+        hash: "5dd0c855b97d298244fb599c9f781651"
+    }
+    Frame {
+        msec: 2992
+        hash: "8677cec5e559e51095d89abfeda8e542"
+    }
+    Frame {
+        msec: 3008
+        hash: "b05fb6e798ab3fed940b5ac4d88ca378"
+    }
+    Frame {
+        msec: 3024
+        hash: "6bc9cc0d3b11ea91856296b0ec934a8b"
+    }
+    Frame {
+        msec: 3040
+        hash: "f4e63f3af69dacbf2d1d719d4d03a266"
+    }
+    Frame {
+        msec: 3056
+        hash: "31ab08997eb86fab062a3128aecbccb5"
+    }
+    Frame {
+        msec: 3072
+        hash: "90736b240ba1e634bd0ea86423908e16"
+    }
+    Frame {
+        msec: 3088
+        hash: "90736b240ba1e634bd0ea86423908e16"
+    }
+    Frame {
+        msec: 3104
+        hash: "e74982557dc06aac572078840c7e889a"
+    }
+    Frame {
+        msec: 3120
+        hash: "e74982557dc06aac572078840c7e889a"
+    }
+    Frame {
+        msec: 3136
+        hash: "ca30c14c7344d1711a35c707f8804f6e"
+    }
+    Frame {
+        msec: 3152
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 3168
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 3184
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 3200
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 412; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3216
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 3232
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 3248
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 408; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 407; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3264
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 403; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3280
+        hash: "1991cbb0fb053937f922731d5716032c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 398; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3296
+        hash: "df447575a4734bb5bd9badc6e27d98e4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 391; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3312
+        hash: "0fbfe1e0d7fb54450188398aa40690cd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 383; y: 214
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3328
+        hash: "cb62e60296046c73d301d7186e14faed"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 369; y: 213
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3344
+        hash: "909cbd1292476584554e22232cb43639"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 352; y: 211
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3360
+        hash: "e63b7e502dfb2834c06a969b683b9bd3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 331; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3376
+        hash: "4ea63cd25a1424042ffc60549a78563c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 314; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3392
+        hash: "77e39d2d4bfcacecdae4f014e4506d71"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 300; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3408
+        hash: "db576eca8bad67cb8b994f12fc448969"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 288; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3424
+        hash: "efeb3f616da9d78505c3c82fc34ee31c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 278; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3440
+        hash: "e4f8bb02f8ac6bc40e1801cc8f360078"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 266; y: 210
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3456
+        hash: "82118ef71809e3867717232c4d9c5518"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 252; y: 208
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3472
+        hash: "5363451c696f6c6eb792b23d086243d7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 238; y: 208
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3488
+        hash: "fe6afe8ae8a7c216a1cffc5515f273d5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 227; y: 206
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3504
+        hash: "9b165741d86c70380c15e15cff3fabb6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 206
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3520
+        hash: "f5e176355468f4fa224d4dfcdd7525a3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 222; y: 206
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3536
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Frame {
+        msec: 3552
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Frame {
+        msec: 3568
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Frame {
+        msec: 3584
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Frame {
+        msec: 3600
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Frame {
+        msec: 3616
+        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 206
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3632
+        hash: "f5e176355468f4fa224d4dfcdd7525a3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 232; y: 204
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3648
+        hash: "acf538fce5f1b90b83474d9898b7cdd7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 246; y: 203
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3664
+        hash: "5a0ee016b8732fbc36064e8a35d91215"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 265; y: 203
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3680
+        hash: "8fd06a14c1de175813845ce8f07db6ec"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 292; y: 201
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3696
+        hash: "26b0ff6ffda0725e0800f7ea3af510ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 310; y: 201
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3712
+        hash: "80443f134511be0356a687c9b542b3e7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 321; y: 199
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3728
+        hash: "3eeb98a829d29b3dc52f3d145ac49d58"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 323; y: 199
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3744
+        hash: "f4d43069b16f41a30e5549aae911d4cd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 324; y: 199
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3760
+        hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 324; y: 199
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3776
+        hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+    }
+    Frame {
+        msec: 3792
+        hash: "1520f54b6c8606b9e8372c5c06180453"
+    }
+    Frame {
+        msec: 3808
+        hash: "0fcf5e2ce47348cbb5bb485f101fe5ac"
+    }
+    Frame {
+        msec: 3824
+        hash: "2eb070e69de07c89830543e0475fc110"
+    }
+    Frame {
+        msec: 3840
+        hash: "d73c1059219c0655968af268d22e2c18"
+    }
+    Frame {
+        msec: 3856
+        image: "flickable-horizontal.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "cc969b2c64839ca6d3b5069c0ed938d0"
+    }
+    Frame {
+        msec: 3888
+        hash: "1f819e18d1297a1c7eeebb7b040bdef8"
+    }
+    Frame {
+        msec: 3904
+        hash: "3643b99afbd8af0953cb39b2c8c04b9f"
+    }
+    Frame {
+        msec: 3920
+        hash: "713fd2e2fa38ab27604cb9cae59f1777"
+    }
+    Frame {
+        msec: 3936
+        hash: "e2508faec7737be2666d87ad715b5f74"
+    }
+    Frame {
+        msec: 3952
+        hash: "fc33b1c7479caeff676ffd885a18d618"
+    }
+    Frame {
+        msec: 3968
+        hash: "aca01143db4f870a56bb7546e84cbc5e"
+    }
+    Frame {
+        msec: 3984
+        hash: "442b58c39fd3745c61a1eb5043fcbb53"
+    }
+    Frame {
+        msec: 4000
+        hash: "7983d7183cc11d6819fa0a006c2d67b4"
+    }
+    Frame {
+        msec: 4016
+        hash: "9fe4e897c6b853f774d11817a0eb53bf"
+    }
+    Frame {
+        msec: 4032
+        hash: "43f528c81ccfa5b9921dfa3564a24c68"
+    }
+    Frame {
+        msec: 4048
+        hash: "dfe04ff0b3ccf205bb38beeab58a4411"
+    }
+    Frame {
+        msec: 4064
+        hash: "32ff30b50b500e9feb51e8eef205783c"
+    }
+    Frame {
+        msec: 4080
+        hash: "7d83ab4c336b05bcf2cde4e7d8031f6c"
+    }
+    Frame {
+        msec: 4096
+        hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+    }
+    Frame {
+        msec: 4112
+        hash: "02eec604d0c00965aae4ac61b91bdc22"
+    }
+    Frame {
+        msec: 4128
+        hash: "df447575a4734bb5bd9badc6e27d98e4"
+    }
+    Frame {
+        msec: 4144
+        hash: "bac10d8f94a39573313b3b8b2f871c49"
+    }
+    Frame {
+        msec: 4160
+        hash: "e5944c5dc6dec8f0c28b7ec3cd58723d"
+    }
+    Frame {
+        msec: 4176
+        hash: "1991cbb0fb053937f922731d5716032c"
+    }
+    Frame {
+        msec: 4192
+        hash: "50d6538bcaffc343f6626635a3e5899c"
+    }
+    Frame {
+        msec: 4208
+        hash: "f3613f57cdb9ed38d8e3fa636962aa99"
+    }
+    Frame {
+        msec: 4224
+        hash: "10a89da9887cb4bbd812c090a8a56797"
+    }
+    Frame {
+        msec: 4240
+        hash: "89ba74d46970ad2edff701475c059ec8"
+    }
+    Frame {
+        msec: 4256
+        hash: "6e8b84c70e81578a2216e9e975b35434"
+    }
+    Frame {
+        msec: 4272
+        hash: "6e8b84c70e81578a2216e9e975b35434"
+    }
+    Frame {
+        msec: 4288
+        hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+    }
+    Frame {
+        msec: 4304
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4320
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4336
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4352
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4368
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4384
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4400
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4416
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4432
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4448
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4464
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4480
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4496
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4512
+        hash: "e616110d39009f0d636b816828cc0ccb"
+    }
+    Frame {
+        msec: 4528
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4544
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4560
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4576
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4592
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4608
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4624
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4640
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4656
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4672
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4688
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+    Frame {
+        msec: 4704
+        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png
new file mode 100644
index 0000000..8714f58
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png
new file mode 100644
index 0000000..05e4a98
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png
new file mode 100644
index 0000000..29df073
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png
new file mode 100644
index 0000000..b38486e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png
new file mode 100644
index 0000000..4de915b
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png
new file mode 100644
index 0000000..61a4684
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png
new file mode 100644
index 0000000..4ce5e30
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png
new file mode 100644
index 0000000..2376b13
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml
new file mode 100644
index 0000000..893355b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml
@@ -0,0 +1,1763 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "follow.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "e94ba580322887dbbbf9cb6309e39c23"
+    }
+    Frame {
+        msec: 48
+        hash: "787a59cda2c0b27d8959026e6d1b9427"
+    }
+    Frame {
+        msec: 64
+        hash: "9ca724d4b31aa16015b5cbb50eea0c3a"
+    }
+    Frame {
+        msec: 80
+        hash: "8a2c62a0190da1b7c1bade243baea6b8"
+    }
+    Frame {
+        msec: 96
+        hash: "e129bebca7ad348c3134569d8eee4efc"
+    }
+    Frame {
+        msec: 112
+        hash: "fd6387415e1c02fe6d17d9c3aa1d1ed8"
+    }
+    Frame {
+        msec: 128
+        hash: "a82a4042fdca7c30facd2c4740c455f7"
+    }
+    Frame {
+        msec: 144
+        hash: "62195722eb3acbfbad137ec71fd50bfe"
+    }
+    Frame {
+        msec: 160
+        hash: "449819cdc880d59650732b5447ec6237"
+    }
+    Frame {
+        msec: 176
+        hash: "552a838ebcacc0e08fa93b64a2433831"
+    }
+    Frame {
+        msec: 192
+        hash: "3984992606d54f05eb31dd0974af2183"
+    }
+    Frame {
+        msec: 208
+        hash: "3fd7225bbb0215ca8b6397580f2352a5"
+    }
+    Frame {
+        msec: 224
+        hash: "0fd8f26f40a9049de1cf2a9493d579d1"
+    }
+    Frame {
+        msec: 240
+        hash: "d08f0c57f071dc42e79fc5e0e3c32eeb"
+    }
+    Frame {
+        msec: 256
+        hash: "084c2db330ee82cd032df248ecc9629d"
+    }
+    Frame {
+        msec: 272
+        hash: "98da0d7f280d7fc4579c970c9a173b51"
+    }
+    Frame {
+        msec: 288
+        hash: "4c819c54ced1b6ef0574417a7e11f2e7"
+    }
+    Frame {
+        msec: 304
+        hash: "3dc5f7b412cb176c3b23d37cda3ef87c"
+    }
+    Frame {
+        msec: 320
+        hash: "c368a01b43d94205c03f9c750c37f330"
+    }
+    Frame {
+        msec: 336
+        hash: "8842bd0c8b17cac4fc9df84835999174"
+    }
+    Frame {
+        msec: 352
+        hash: "26829e9c7ca44dfcb0c03852f4158a18"
+    }
+    Frame {
+        msec: 368
+        hash: "ecffdb0888f1721e27b163e1f29a1950"
+    }
+    Frame {
+        msec: 384
+        hash: "eaead96f2683c464a12df8aadba20691"
+    }
+    Frame {
+        msec: 400
+        hash: "1e931963925bd208dce1ec9011372a3b"
+    }
+    Frame {
+        msec: 416
+        hash: "1c3fd049001c1e883f21d0d1e0e32cba"
+    }
+    Frame {
+        msec: 432
+        hash: "e8c3422ca637750ac52565594737d092"
+    }
+    Frame {
+        msec: 448
+        hash: "b1c36322cf89e15a80af7c43f2aebca1"
+    }
+    Frame {
+        msec: 464
+        hash: "f676c3171495f7bb2cb1812cfebaa17a"
+    }
+    Frame {
+        msec: 480
+        hash: "255119e2efa99c8e31fee611aaaa5137"
+    }
+    Frame {
+        msec: 496
+        hash: "e0bd32e3d44cfc2351db105f4595f18a"
+    }
+    Frame {
+        msec: 512
+        hash: "b7f23b8f3769f929b42491efda7ebe19"
+    }
+    Frame {
+        msec: 528
+        hash: "718cee11d869a8a8c5191cc0c09f2d30"
+    }
+    Frame {
+        msec: 544
+        hash: "fbdbf92f8c5f507605ff50abc594682b"
+    }
+    Frame {
+        msec: 560
+        hash: "c07fdc69c72b40d3c8dd1cc499008888"
+    }
+    Frame {
+        msec: 576
+        hash: "38e17ecd537dc0f51211ad672a2ebb21"
+    }
+    Frame {
+        msec: 592
+        hash: "2cbdc8728ef779c62f9938672986658a"
+    }
+    Frame {
+        msec: 608
+        hash: "7fb66509d5d1df34861e9c70f9a579f0"
+    }
+    Frame {
+        msec: 624
+        hash: "410b89392e859058718a08b79ec3d8fa"
+    }
+    Frame {
+        msec: 640
+        hash: "9bd90f80700217d08dafed93b81ee9cf"
+    }
+    Frame {
+        msec: 656
+        hash: "6d83671504a4274887b4e0d9bd2b24e7"
+    }
+    Frame {
+        msec: 672
+        hash: "51ff7bd3fd4a776af33fce7b935b145c"
+    }
+    Frame {
+        msec: 688
+        hash: "20f27392368b63b248bcd455cf3c9106"
+    }
+    Frame {
+        msec: 704
+        hash: "1a5ab296bd55aa215c9b04a7ff6c73a1"
+    }
+    Frame {
+        msec: 720
+        hash: "020fd7b14e8662fc006b0c39adca7c6a"
+    }
+    Frame {
+        msec: 736
+        hash: "2619120bdb25a153963bdf05c4a16d44"
+    }
+    Frame {
+        msec: 752
+        hash: "fd321314031efeb9ce71146764289d9f"
+    }
+    Frame {
+        msec: 768
+        hash: "378a71f09445dfff284db919787cbf87"
+    }
+    Frame {
+        msec: 784
+        hash: "d59eefe82ab8a00c903141dd9ea767ef"
+    }
+    Frame {
+        msec: 800
+        hash: "0a65004d69a4567f2a5c7e84dab3a905"
+    }
+    Frame {
+        msec: 816
+        hash: "92a4631716a51ff484ca14d9cfe05b2e"
+    }
+    Frame {
+        msec: 832
+        hash: "87203f627cf410cad56d6ba38a140efa"
+    }
+    Frame {
+        msec: 848
+        hash: "054cc085998cc059a6b7b4a7300dd36b"
+    }
+    Frame {
+        msec: 864
+        hash: "af3fefeb908a0485c723d36f61eff0a4"
+    }
+    Frame {
+        msec: 880
+        hash: "3f905d1e1ea79858b5a9bbfeab4eb255"
+    }
+    Frame {
+        msec: 896
+        hash: "f935f1fc5f26a201098d894fca9a4d1f"
+    }
+    Frame {
+        msec: 912
+        hash: "42b003dbb531da514716b9c32bdd3614"
+    }
+    Frame {
+        msec: 928
+        hash: "a82fed83ee4efee7896b639c7691b13a"
+    }
+    Frame {
+        msec: 944
+        hash: "31ad8cbf875233ea495330b0d3d4d2dd"
+    }
+    Frame {
+        msec: 960
+        hash: "00586f2f1d49fa81f90f7b06614311b4"
+    }
+    Frame {
+        msec: 976
+        image: "follow.1.png"
+    }
+    Frame {
+        msec: 992
+        hash: "5d71ff48b865ad4266eb8292f981b04e"
+    }
+    Frame {
+        msec: 1008
+        hash: "df599d934d131c92b209284277009efb"
+    }
+    Frame {
+        msec: 1024
+        hash: "5aaf33d11eb70ffdfe89246c637caed7"
+    }
+    Frame {
+        msec: 1040
+        hash: "9648cf623a66ded145c4fd23a42917b3"
+    }
+    Frame {
+        msec: 1056
+        hash: "9d33c2cc44ceac5a527ddcf809a51df6"
+    }
+    Frame {
+        msec: 1072
+        hash: "6d0ad2e0d012e53a03e246e6d5e49e13"
+    }
+    Frame {
+        msec: 1088
+        hash: "d33fa68796e38b19f44571d11c1bcd33"
+    }
+    Frame {
+        msec: 1104
+        hash: "636680f49bbf30b0fac31a6c581f18dd"
+    }
+    Frame {
+        msec: 1120
+        hash: "66801dbc39301e6b46b244fe502e0340"
+    }
+    Frame {
+        msec: 1136
+        hash: "f8fa6a033483279e78636f26493b10ac"
+    }
+    Frame {
+        msec: 1152
+        hash: "11b46611550173df42986dee4339d907"
+    }
+    Frame {
+        msec: 1168
+        hash: "5c9afdb519006079ee8d28b2b60d0b76"
+    }
+    Frame {
+        msec: 1184
+        hash: "9a55c38b2cd8abf25fbe448c7ef80971"
+    }
+    Frame {
+        msec: 1200
+        hash: "27ebdf1424e892b35c93ec009d942407"
+    }
+    Frame {
+        msec: 1216
+        hash: "2d9e3f0ae56f7337012b51c4dd173108"
+    }
+    Frame {
+        msec: 1232
+        hash: "e6f89ca892131d68ff1f4ca95c95d807"
+    }
+    Frame {
+        msec: 1248
+        hash: "f75791f1b12a217d37acb09bdb114cc5"
+    }
+    Frame {
+        msec: 1264
+        hash: "94c5ab1460fb1b0f957a9718b45bca36"
+    }
+    Frame {
+        msec: 1280
+        hash: "e246c8a0ec3d01ea20258b24a5673fe1"
+    }
+    Frame {
+        msec: 1296
+        hash: "529de7735e73409dff266d8c1275215c"
+    }
+    Frame {
+        msec: 1312
+        hash: "330400763a670580570cb62241ebec62"
+    }
+    Frame {
+        msec: 1328
+        hash: "ae444d1de9c509fc6f74136ca90f927a"
+    }
+    Frame {
+        msec: 1344
+        hash: "c43631ca8ee90ea5dc7664be5bc45429"
+    }
+    Frame {
+        msec: 1360
+        hash: "b366ac4a5b66c331a7667e9df0fc4eda"
+    }
+    Frame {
+        msec: 1376
+        hash: "1c7f4c47a9c57a34787cc9703e99bff1"
+    }
+    Frame {
+        msec: 1392
+        hash: "5555535609d512e8d34549b6624f74b8"
+    }
+    Frame {
+        msec: 1408
+        hash: "be59df714541923494b59f31f57e310e"
+    }
+    Frame {
+        msec: 1424
+        hash: "63e434f053032e54298f6e61c8d4da7d"
+    }
+    Frame {
+        msec: 1440
+        hash: "b0bb838637eceb6f8993ebc5b887afed"
+    }
+    Frame {
+        msec: 1456
+        hash: "fc39f33add4ebcaf578558ecd4aea281"
+    }
+    Frame {
+        msec: 1472
+        hash: "3f36faa7cc1e5898d4d5890c47633ff3"
+    }
+    Frame {
+        msec: 1488
+        hash: "4b328002b4461869b1f7de48e7291902"
+    }
+    Frame {
+        msec: 1504
+        hash: "26252c63924d2abcaebea2c7caf1d7aa"
+    }
+    Frame {
+        msec: 1520
+        hash: "a9a6023484ae439be86b2c2ff59dc40b"
+    }
+    Frame {
+        msec: 1536
+        hash: "620dab11bd4aab84cc0d949c48dd9a5d"
+    }
+    Frame {
+        msec: 1552
+        hash: "3b45ef80ee3e6fbbd3533bfa0d666e2f"
+    }
+    Frame {
+        msec: 1568
+        hash: "b33306abcb6a8402e491b7216495c778"
+    }
+    Frame {
+        msec: 1584
+        hash: "3cc52e8649a02e87785f1dc63f5c1efd"
+    }
+    Frame {
+        msec: 1600
+        hash: "fe21141f48da685213ed9d7641b2e7a0"
+    }
+    Frame {
+        msec: 1616
+        hash: "205aac4e822e20bd32f637256250f3c8"
+    }
+    Frame {
+        msec: 1632
+        hash: "124df0948f36aaf6151556d301f4b930"
+    }
+    Frame {
+        msec: 1648
+        hash: "c1701edd5eaf143fd1dbdc4a5324b48a"
+    }
+    Frame {
+        msec: 1664
+        hash: "117402df55367c918a3835958f4ab1d6"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 195; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1680
+        hash: "73e3b86a1da28490cae4b03fdceefe19"
+    }
+    Frame {
+        msec: 1696
+        hash: "172e329fb47d6db0180242990a84fe3b"
+    }
+    Frame {
+        msec: 1712
+        hash: "82cf704cdfd406bab22689bc888ddc8d"
+    }
+    Frame {
+        msec: 1728
+        hash: "4c288f198a06d1b2815d34c3c8f97051"
+    }
+    Frame {
+        msec: 1744
+        hash: "6404d81456bb95a6b1c1ae55a181e40e"
+    }
+    Frame {
+        msec: 1760
+        hash: "6c11b9f079936ea08d11aa1172bfd954"
+    }
+    Frame {
+        msec: 1776
+        hash: "95388037c1f79a9dab951031f1d7c307"
+    }
+    Frame {
+        msec: 1792
+        hash: "c4ee57d9bffbb5f0ff173db48eadf2e3"
+    }
+    Frame {
+        msec: 1808
+        hash: "703ac9672a9c55cf08e6381ef76ac13c"
+    }
+    Frame {
+        msec: 1824
+        hash: "ea7726d2a2923290398262c8f70d511e"
+    }
+    Frame {
+        msec: 1840
+        hash: "9897c12603326a30c62381015c9adae3"
+    }
+    Frame {
+        msec: 1856
+        hash: "a52aa37b10a05382f1b136896b7e00e8"
+    }
+    Frame {
+        msec: 1872
+        hash: "a5acc1a45c95a67725e5e15084b7be18"
+    }
+    Frame {
+        msec: 1888
+        hash: "c9fac8b5a4110493958d49b073ea96ed"
+    }
+    Frame {
+        msec: 1904
+        hash: "6fca3a5c6d1cfbf1b905aca25b7785c5"
+    }
+    Frame {
+        msec: 1920
+        hash: "a40e5e2744d1d84c8b9a45525801a745"
+    }
+    Frame {
+        msec: 1936
+        image: "follow.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "b2f980ab19d44ee98ab3e82a19adfe2d"
+    }
+    Frame {
+        msec: 1968
+        hash: "e01732623930aebefd76ab62c81dc722"
+    }
+    Frame {
+        msec: 1984
+        hash: "3a59c6851bc89eb31100092b1ceddbd9"
+    }
+    Frame {
+        msec: 2000
+        hash: "2949de19eacb9f35816aa7ba69614f2c"
+    }
+    Frame {
+        msec: 2016
+        hash: "f2c4c1f4429cbb6bd10f2318b2cb6904"
+    }
+    Frame {
+        msec: 2032
+        hash: "2c48af64162e7e028cd536dba03eab71"
+    }
+    Frame {
+        msec: 2048
+        hash: "7fe13b8f9253f720b6591b396cfba2d1"
+    }
+    Frame {
+        msec: 2064
+        hash: "559947a03e650575a764801366cc504b"
+    }
+    Frame {
+        msec: 2080
+        hash: "a8d09f6c862fd5ec2dcf34f06d1ef744"
+    }
+    Frame {
+        msec: 2096
+        hash: "e3bb4b62209631ff84134f2243bfdb42"
+    }
+    Frame {
+        msec: 2112
+        hash: "a1956a9d1939bc154ea0c88d596948cc"
+    }
+    Frame {
+        msec: 2128
+        hash: "c98a375727860da1e827d4dd74af8f63"
+    }
+    Frame {
+        msec: 2144
+        hash: "df4edcbb2ef5348341ff55c808609b6c"
+    }
+    Frame {
+        msec: 2160
+        hash: "6287564be85b7cbadc6bb6f0232bc837"
+    }
+    Frame {
+        msec: 2176
+        hash: "9826fdb48f7ea770fa5f198ec49d7cb7"
+    }
+    Frame {
+        msec: 2192
+        hash: "56f82641a5591df9bb929cc0d32eb95d"
+    }
+    Frame {
+        msec: 2208
+        hash: "526c55e555fb2e58796561efa3568c50"
+    }
+    Frame {
+        msec: 2224
+        hash: "6b4b74613421c1841a17c369cb316754"
+    }
+    Frame {
+        msec: 2240
+        hash: "37f785c30947d5eec113dcf6af649abf"
+    }
+    Frame {
+        msec: 2256
+        hash: "5ff2c975dd9e261c764537c836627c4d"
+    }
+    Frame {
+        msec: 2272
+        hash: "efe554981583749c3d09988bce7fed02"
+    }
+    Frame {
+        msec: 2288
+        hash: "0f7204b4afb0ea5d58e49650e8027c0c"
+    }
+    Frame {
+        msec: 2304
+        hash: "817291f91f4b309710ad3aed53a7d47a"
+    }
+    Frame {
+        msec: 2320
+        hash: "c15c9cd03089090cf8a777c1f0d88de7"
+    }
+    Frame {
+        msec: 2336
+        hash: "05f45cb8d0856dcc81091351615e35d6"
+    }
+    Frame {
+        msec: 2352
+        hash: "99785a16fed6d6409b4b47ec55afb56b"
+    }
+    Frame {
+        msec: 2368
+        hash: "39032cb4432ee9536af500673fccf526"
+    }
+    Frame {
+        msec: 2384
+        hash: "9057653e3cd6042831037d3590e7595b"
+    }
+    Frame {
+        msec: 2400
+        hash: "76c772eb2ab8f117c260c9c96bc99e1d"
+    }
+    Frame {
+        msec: 2416
+        hash: "b6474665b8f8bcdd76d1a38efecad889"
+    }
+    Frame {
+        msec: 2432
+        hash: "106c2d2efafad0181e3ded3a6805f2c6"
+    }
+    Frame {
+        msec: 2448
+        hash: "5275fa4ffef6c1909f9d03bb1e7b9cae"
+    }
+    Frame {
+        msec: 2464
+        hash: "0c1043c0087d60000dc7259d4ac03618"
+    }
+    Frame {
+        msec: 2480
+        hash: "645748569b4f5cb9b206b0808bb7d23d"
+    }
+    Frame {
+        msec: 2496
+        hash: "dd95dfa80e1b3ff511e7c75efd0d87ce"
+    }
+    Frame {
+        msec: 2512
+        hash: "86b3dd03b04d7610837cdc67cad07e0a"
+    }
+    Frame {
+        msec: 2528
+        hash: "8264f67ac92e4ebcfe4cc8e954f8c5d2"
+    }
+    Frame {
+        msec: 2544
+        hash: "6bf52377d822b09eb28a1ec36d3a36a9"
+    }
+    Frame {
+        msec: 2560
+        hash: "7ae1d65cdaf7fa71eb4ec318b37bb0aa"
+    }
+    Frame {
+        msec: 2576
+        hash: "860f5ce9844c90cf9e6a6d383ff0972f"
+    }
+    Frame {
+        msec: 2592
+        hash: "5502229c038dfc59d966f69ae6ed8957"
+    }
+    Frame {
+        msec: 2608
+        hash: "21843c027bc1434ae60b3bb0fced2c54"
+    }
+    Frame {
+        msec: 2624
+        hash: "962df45680949c3eb6c968f98cd76b20"
+    }
+    Frame {
+        msec: 2640
+        hash: "f313c26fa76a0edce61244bdf92528e4"
+    }
+    Frame {
+        msec: 2656
+        hash: "b7bbde239e98cbd66b1e51b54b747f51"
+    }
+    Frame {
+        msec: 2672
+        hash: "62340707fbc832fcb805c8f80ab353d1"
+    }
+    Frame {
+        msec: 2688
+        hash: "d008a3f7af1810ff70b68b38a4cd0f0d"
+    }
+    Frame {
+        msec: 2704
+        hash: "e651dd628af24faf34d716beb392b052"
+    }
+    Frame {
+        msec: 2720
+        hash: "a97733963c7a7616b25741545b07ffba"
+    }
+    Frame {
+        msec: 2736
+        hash: "3e017cc1db720cf16521bd17308e4f44"
+    }
+    Frame {
+        msec: 2752
+        hash: "13652ebaa610cca71486517e2eed21a5"
+    }
+    Frame {
+        msec: 2768
+        hash: "09f0f500c6f7d11be39c31f9e589b38a"
+    }
+    Frame {
+        msec: 2784
+        hash: "b87968cbc60ddc6a5f5699e830410eab"
+    }
+    Frame {
+        msec: 2800
+        hash: "50e65b043d1f07a321a08ee4c25204f6"
+    }
+    Frame {
+        msec: 2816
+        hash: "122d1ffa1510468e8c4067e0f511588f"
+    }
+    Frame {
+        msec: 2832
+        hash: "585f6c25caaafb99a22a23d8a998d202"
+    }
+    Frame {
+        msec: 2848
+        hash: "9b245a00ad576666c10f509d8a80a61e"
+    }
+    Frame {
+        msec: 2864
+        hash: "9b245a00ad576666c10f509d8a80a61e"
+    }
+    Frame {
+        msec: 2880
+        hash: "3c5d3d10bacc093afc6a9c0b5aa4cddc"
+    }
+    Frame {
+        msec: 2896
+        image: "follow.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "31926d69c2309fdf13fbd7f0e9868c3d"
+    }
+    Frame {
+        msec: 2928
+        hash: "eb3acacce5dd31b0e94b59b9e546ccae"
+    }
+    Frame {
+        msec: 2944
+        hash: "9a51cff3276d75803a0a6e480f7ecb70"
+    }
+    Frame {
+        msec: 2960
+        hash: "fbbd8b9d519993a699815d935bcd2b9f"
+    }
+    Frame {
+        msec: 2976
+        hash: "0314190c6de73f9f374a4eaed0709645"
+    }
+    Frame {
+        msec: 2992
+        hash: "8ca1a203bdb5446094eb948aeb0a333e"
+    }
+    Frame {
+        msec: 3008
+        hash: "301e1b86ce38e11ad9d0d7aba0909985"
+    }
+    Frame {
+        msec: 3024
+        hash: "922095867d0a91b73ab7a63df2041279"
+    }
+    Frame {
+        msec: 3040
+        hash: "ba8275f3ba4633bf64a1f81f630c90f1"
+    }
+    Frame {
+        msec: 3056
+        hash: "efe39545279a7bd015d2de75d2b9d8b1"
+    }
+    Frame {
+        msec: 3072
+        hash: "78926c3c0c6fcf89b9291f9902710964"
+    }
+    Frame {
+        msec: 3088
+        hash: "ea63dcb7f00d3ddede0d8be59ad9d6bc"
+    }
+    Frame {
+        msec: 3104
+        hash: "286ad493301b713a49e378f123482a53"
+    }
+    Frame {
+        msec: 3120
+        hash: "a4bbbb8bb88188d3e99996502e3eebd1"
+    }
+    Frame {
+        msec: 3136
+        hash: "a6100e79f3dc5af594e86ab6cd8dfb76"
+    }
+    Frame {
+        msec: 3152
+        hash: "d9e3f777dc89bcf1b7f712206db768e2"
+    }
+    Frame {
+        msec: 3168
+        hash: "768045c600c0aa0b1e9e6f012733c600"
+    }
+    Frame {
+        msec: 3184
+        hash: "d8b4caa641ddee786f7898359efe9d07"
+    }
+    Frame {
+        msec: 3200
+        hash: "f7c3b76d5bb7c263ac9447eaad685158"
+    }
+    Frame {
+        msec: 3216
+        hash: "f7f97db815d653ec29fa31b87f72af2a"
+    }
+    Frame {
+        msec: 3232
+        hash: "18524623762487b60943312cd8bd4388"
+    }
+    Frame {
+        msec: 3248
+        hash: "5823dee5dd56e9f7515601f9629ccbae"
+    }
+    Frame {
+        msec: 3264
+        hash: "5823dee5dd56e9f7515601f9629ccbae"
+    }
+    Frame {
+        msec: 3280
+        hash: "5823dee5dd56e9f7515601f9629ccbae"
+    }
+    Frame {
+        msec: 3296
+        hash: "5823dee5dd56e9f7515601f9629ccbae"
+    }
+    Frame {
+        msec: 3312
+        hash: "18524623762487b60943312cd8bd4388"
+    }
+    Frame {
+        msec: 3328
+        hash: "430995770b655054aaeda383df8e27f7"
+    }
+    Frame {
+        msec: 3344
+        hash: "16a3a00f2b89aed676f80d63c4933ec3"
+    }
+    Frame {
+        msec: 3360
+        hash: "6c55aa62079ec546522edbf69c37b270"
+    }
+    Frame {
+        msec: 3376
+        hash: "0d68ca3ccecdd831013950cc7405e46e"
+    }
+    Frame {
+        msec: 3392
+        hash: "9da2511bc8b434218695fa74ed543439"
+    }
+    Frame {
+        msec: 3408
+        hash: "05afdd0b99dab81a500cdc2b2f0786fe"
+    }
+    Frame {
+        msec: 3424
+        hash: "e6f8882d146ae60bcc6ea47ff41a637b"
+    }
+    Frame {
+        msec: 3440
+        hash: "154542ed0e88321294f382501819aefc"
+    }
+    Frame {
+        msec: 3456
+        hash: "8f47b6980c387c5020145bf04645fd2d"
+    }
+    Frame {
+        msec: 3472
+        hash: "b34b055c7602f1f4e1cde875b258120c"
+    }
+    Frame {
+        msec: 3488
+        hash: "5a697f675575f05e297d4877604b9a47"
+    }
+    Frame {
+        msec: 3504
+        hash: "729dff1d1b357d19fc81804ec8940d0e"
+    }
+    Frame {
+        msec: 3520
+        hash: "c6f3fee46baa94a6139d2ee40254b160"
+    }
+    Frame {
+        msec: 3536
+        hash: "af0e700bb8ae34834510830f8b44afdb"
+    }
+    Frame {
+        msec: 3552
+        hash: "9c87bb54c2dfe58c2da9194dae6f7502"
+    }
+    Frame {
+        msec: 3568
+        hash: "2132356a92c75d725f9feafb8201b142"
+    }
+    Frame {
+        msec: 3584
+        hash: "50d855d2595eeae2bfd6aaa8c2fa0454"
+    }
+    Frame {
+        msec: 3600
+        hash: "5fde3c62d6e53a9056e3586f9dcda59e"
+    }
+    Frame {
+        msec: 3616
+        hash: "8f04460254a1e9fb949d5165894cd92a"
+    }
+    Frame {
+        msec: 3632
+        hash: "2b514c5e3b20d30f9c7e71092c69f081"
+    }
+    Frame {
+        msec: 3648
+        hash: "2c1ba6224037790e15f5c0f2864ace4d"
+    }
+    Frame {
+        msec: 3664
+        hash: "0d5b8e7bd5f560888aacaf2b3c6827a8"
+    }
+    Frame {
+        msec: 3680
+        hash: "ae25004530e7df134414018e4a34780e"
+    }
+    Frame {
+        msec: 3696
+        hash: "1a8fd9eaf9a91f1b42924f8986fbed9a"
+    }
+    Frame {
+        msec: 3712
+        hash: "2ea6de2025d40ed5beeff12a5b70ccc9"
+    }
+    Frame {
+        msec: 3728
+        hash: "624e417718d3cac1e4b7e4ce258ce6ea"
+    }
+    Frame {
+        msec: 3744
+        hash: "8b56d29391257c7be8966af6be26ea9f"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 195; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3760
+        hash: "5c0d977d8b446d9191bde57335cf1062"
+    }
+    Frame {
+        msec: 3776
+        hash: "100be2b21d069e3a5dbb694a90da4d4f"
+    }
+    Frame {
+        msec: 3792
+        hash: "caab03f6c81080dd8fdbedb4e94ae4a5"
+    }
+    Frame {
+        msec: 3808
+        hash: "3328a4d06f2f80a7e9ccf2ff21522fca"
+    }
+    Frame {
+        msec: 3824
+        hash: "a534e6cc28daf3eff6a9cf8379bd6375"
+    }
+    Frame {
+        msec: 3840
+        hash: "6686f9c1a814c6a6b785b70f94937b68"
+    }
+    Frame {
+        msec: 3856
+        image: "follow.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "d3f1c3593375ca5c022a1361a7ec70bd"
+    }
+    Frame {
+        msec: 3888
+        hash: "67843e6192e2ecaa3820c37dc2f93106"
+    }
+    Frame {
+        msec: 3904
+        hash: "19a022f678e5b8f4ebdff936162323dc"
+    }
+    Frame {
+        msec: 3920
+        hash: "34e55ae70c9e156db339ae15642359c3"
+    }
+    Frame {
+        msec: 3936
+        hash: "3784778c817f9d9bb73d990cfe12685a"
+    }
+    Frame {
+        msec: 3952
+        hash: "0403fdf79e3ba339c7e3786db0c9c0f0"
+    }
+    Frame {
+        msec: 3968
+        hash: "93e4a0d5645d1cfc916f1e8422655555"
+    }
+    Frame {
+        msec: 3984
+        hash: "29080bfabb87160b7c51385fb36b474b"
+    }
+    Frame {
+        msec: 4000
+        hash: "9da2d83edc9d35f00fb8a159e79de4d9"
+    }
+    Frame {
+        msec: 4016
+        hash: "5505a42d4788f00cfc7499fbfda851ce"
+    }
+    Frame {
+        msec: 4032
+        hash: "bdd3040ab16fa9ffdd2fbc66b06699f8"
+    }
+    Frame {
+        msec: 4048
+        hash: "2a347e30a20c693a9440caa60ade0a0f"
+    }
+    Frame {
+        msec: 4064
+        hash: "0307f1857c091a639d47f112ce1a2f5a"
+    }
+    Frame {
+        msec: 4080
+        hash: "778d18e539bbd562ebe39283a6315df1"
+    }
+    Frame {
+        msec: 4096
+        hash: "0369cf6c3d1f5db2e92ee1f7c5d3b8ed"
+    }
+    Frame {
+        msec: 4112
+        hash: "9f7413587ab50f1abf776bf180ec2d6f"
+    }
+    Frame {
+        msec: 4128
+        hash: "7d04a27236485808e571e8a39f23ea17"
+    }
+    Frame {
+        msec: 4144
+        hash: "a1dff63b723473d5a4c9c59975a2fb81"
+    }
+    Frame {
+        msec: 4160
+        hash: "9795ea70a3b9d3b7805221a58c19e5da"
+    }
+    Frame {
+        msec: 4176
+        hash: "f1392c489e21107136eb8e0d1e8b427e"
+    }
+    Frame {
+        msec: 4192
+        hash: "95c225ef07171a96335e99078195b06a"
+    }
+    Frame {
+        msec: 4208
+        hash: "d46ef3e7f9cec06e8c18afc0d07be4f3"
+    }
+    Frame {
+        msec: 4224
+        hash: "b017f5b51d423bb0fca0d6df3aaded8b"
+    }
+    Frame {
+        msec: 4240
+        hash: "60584d085b0cd6fbc436773be678597e"
+    }
+    Frame {
+        msec: 4256
+        hash: "117951465dfd5c386826b295560d2dec"
+    }
+    Frame {
+        msec: 4272
+        hash: "1b70137da5f4e024593999e93121fe8b"
+    }
+    Frame {
+        msec: 4288
+        hash: "bd50dffd41941fef127f39b55c4748e0"
+    }
+    Frame {
+        msec: 4304
+        hash: "8eec34d8e1d2e22d11b85a671cd4d3aa"
+    }
+    Frame {
+        msec: 4320
+        hash: "9e3c97cfad5002ef5f3fcc365aeb7bd0"
+    }
+    Frame {
+        msec: 4336
+        hash: "28e1cf1ee033915ea2ee39c9ab00a73d"
+    }
+    Frame {
+        msec: 4352
+        hash: "99101a156a553f441f00221f6facbf1f"
+    }
+    Frame {
+        msec: 4368
+        hash: "419023e5d59d16c26b35bee7d3cea559"
+    }
+    Frame {
+        msec: 4384
+        hash: "485d23519293975b04031fe4baa5c276"
+    }
+    Frame {
+        msec: 4400
+        hash: "c8bc60735e0ede26dbaf228294853f9a"
+    }
+    Frame {
+        msec: 4416
+        hash: "ada3680b807d59843e3adf6640704066"
+    }
+    Frame {
+        msec: 4432
+        hash: "3e28f3adf9241512cd0d6918d81ffffb"
+    }
+    Frame {
+        msec: 4448
+        hash: "8f339acc33cbc89ae1c62391ce021bb3"
+    }
+    Frame {
+        msec: 4464
+        hash: "d303960c0853a90557d64a04b8283c94"
+    }
+    Frame {
+        msec: 4480
+        hash: "f907dbdacf2cfa9fdf8f9c8dead5b4c4"
+    }
+    Frame {
+        msec: 4496
+        hash: "30c6e6f283f4a3f538cdda9c2e92de8c"
+    }
+    Frame {
+        msec: 4512
+        hash: "04d2ac55774b43107a43a7d33764199b"
+    }
+    Frame {
+        msec: 4528
+        hash: "cddf3e111cbc59e721725daa1d8a0c31"
+    }
+    Frame {
+        msec: 4544
+        hash: "15b1b63cd1695207ebf9f04387be0739"
+    }
+    Frame {
+        msec: 4560
+        hash: "690769b9bbe86a3c5b1fbdee39615fbd"
+    }
+    Frame {
+        msec: 4576
+        hash: "2bd640d8ddbf878d808f22656fef1ed9"
+    }
+    Frame {
+        msec: 4592
+        hash: "a654f1e4519bf883d554276ebbe96323"
+    }
+    Frame {
+        msec: 4608
+        hash: "68f0313cfc3f51a0bb9b47c5407c19b6"
+    }
+    Frame {
+        msec: 4624
+        hash: "77f29806b084de4cabf7ab9bf1a93d5e"
+    }
+    Frame {
+        msec: 4640
+        hash: "f9991189e3282d107b98fb0ae5f5ef00"
+    }
+    Frame {
+        msec: 4656
+        hash: "0cd1f2f6e347d48feea1b26a4968dec7"
+    }
+    Frame {
+        msec: 4672
+        hash: "e75a6f6a088e2289042572a161ffb0e9"
+    }
+    Frame {
+        msec: 4688
+        hash: "5a541081444c0a71128223a4c4c3144c"
+    }
+    Frame {
+        msec: 4704
+        hash: "6813d442cc610f346a5441ed0cd723e5"
+    }
+    Frame {
+        msec: 4720
+        hash: "24ec539bc57899819915f833f26deacd"
+    }
+    Frame {
+        msec: 4736
+        hash: "3a7ed1b4b533b817674aa141c420cd61"
+    }
+    Frame {
+        msec: 4752
+        hash: "d0a643fae97bb152e97ca60e96299003"
+    }
+    Frame {
+        msec: 4768
+        hash: "c84093931520f4661eff6645091a294b"
+    }
+    Frame {
+        msec: 4784
+        hash: "81e7ceaece82505a4a16ead195a66162"
+    }
+    Frame {
+        msec: 4800
+        hash: "315764d20b647f6ab1ba30239a69bf72"
+    }
+    Frame {
+        msec: 4816
+        image: "follow.5.png"
+    }
+    Frame {
+        msec: 4832
+        hash: "d1824ced8af34ad9edb36a58ae9aa7f5"
+    }
+    Frame {
+        msec: 4848
+        hash: "167b9a49fbb94908e09e7e9c9147cd8b"
+    }
+    Frame {
+        msec: 4864
+        hash: "442d5f0906840de526d59a80ada322c0"
+    }
+    Frame {
+        msec: 4880
+        hash: "78206c4d4d23c7c1ba888b9062b09432"
+    }
+    Frame {
+        msec: 4896
+        hash: "e898202cfebbff1952efc6e01254d855"
+    }
+    Frame {
+        msec: 4912
+        hash: "ab31dc7bbad2b0552359866bb8d92f0c"
+    }
+    Frame {
+        msec: 4928
+        hash: "f093304e88964376baf9721d53d4fb49"
+    }
+    Frame {
+        msec: 4944
+        hash: "3ef76f3e1c44d13c3a469bd192ff7b5d"
+    }
+    Frame {
+        msec: 4960
+        hash: "5d3b6d0d91f8cc5b89e39407bc3b5a15"
+    }
+    Frame {
+        msec: 4976
+        hash: "3c73573f12f49b34e1d990a55ad913fa"
+    }
+    Frame {
+        msec: 4992
+        hash: "d1bac071b01a1c6fddab90cdc435fad4"
+    }
+    Frame {
+        msec: 5008
+        hash: "36a219aadec910f1dbef616c641e1d2b"
+    }
+    Frame {
+        msec: 5024
+        hash: "5871fc67d361cc988551592ee21dfb23"
+    }
+    Frame {
+        msec: 5040
+        hash: "6e65ee6c814b9a9da205c36925e663bf"
+    }
+    Frame {
+        msec: 5056
+        hash: "290b20fa8e91d34000d7c2d81745f6d2"
+    }
+    Frame {
+        msec: 5072
+        hash: "19e7405a9083a8143f7bb040f8837b29"
+    }
+    Frame {
+        msec: 5088
+        hash: "c0a0fa2b4c1ceb6c70594994a1ac8713"
+    }
+    Frame {
+        msec: 5104
+        hash: "c236224c16743fb606deb78bcb8afc8d"
+    }
+    Frame {
+        msec: 5120
+        hash: "7d44db15eb300b4338ffc26e9bcfce20"
+    }
+    Frame {
+        msec: 5136
+        hash: "067a79148a194c45c6f32d85316a1e11"
+    }
+    Frame {
+        msec: 5152
+        hash: "9075c379044476994a87f0fdcce8e332"
+    }
+    Frame {
+        msec: 5168
+        hash: "b2316988fbd51096a4f512e71fe7d0a2"
+    }
+    Frame {
+        msec: 5184
+        hash: "280f70877d93af5f84e178aad6a102d8"
+    }
+    Frame {
+        msec: 5200
+        hash: "3eef4ae7e43a8cf1cd9dd562237296f8"
+    }
+    Frame {
+        msec: 5216
+        hash: "e3184f77ce3a47ca4dca6386f42d7fec"
+    }
+    Frame {
+        msec: 5232
+        hash: "a2a5df66fe4808ea8d466cac84ba910c"
+    }
+    Frame {
+        msec: 5248
+        hash: "9f8a0e54788112d6c30482e840504f35"
+    }
+    Frame {
+        msec: 5264
+        hash: "ae69cf84798844f9f360c86790feaecd"
+    }
+    Frame {
+        msec: 5280
+        hash: "0244526572acb6266db5b7eb9d29c6fc"
+    }
+    Frame {
+        msec: 5296
+        hash: "8fb53d60b95ddb5aef27442934ea9983"
+    }
+    Frame {
+        msec: 5312
+        hash: "930fcfde491b4f5681e3861764003895"
+    }
+    Frame {
+        msec: 5328
+        hash: "bcdcd0a637112d113ebe11dc18823237"
+    }
+    Frame {
+        msec: 5344
+        hash: "65a564d5a5afbc14c0cdad4d52753507"
+    }
+    Frame {
+        msec: 5360
+        hash: "0c5056d438d2d54938f31ef5f996673a"
+    }
+    Frame {
+        msec: 5376
+        hash: "11c157ad2236fc390ffbdf339366cbc1"
+    }
+    Frame {
+        msec: 5392
+        hash: "6cb341b1f281a97a35c2e41bfd4c4d9d"
+    }
+    Frame {
+        msec: 5408
+        hash: "553a945f7f19f70ddae4ebe88e52a79b"
+    }
+    Frame {
+        msec: 5424
+        hash: "d10b42b4095a2474e66a5a322f72e936"
+    }
+    Frame {
+        msec: 5440
+        hash: "0f943d61e8072d70eddee8aa1ba0de5a"
+    }
+    Frame {
+        msec: 5456
+        hash: "3df18e237b666e78d57857739b759e6d"
+    }
+    Frame {
+        msec: 5472
+        hash: "1ddc0bfdb2ca7b6dee63f1024e62f26e"
+    }
+    Frame {
+        msec: 5488
+        hash: "aaa397714528f41238059e3a88833abc"
+    }
+    Frame {
+        msec: 5504
+        hash: "c94bd69f925c782656afc5f9618180a6"
+    }
+    Frame {
+        msec: 5520
+        hash: "824ff8c0e1ab43e3c0eaa79b7cc19b9c"
+    }
+    Frame {
+        msec: 5536
+        hash: "6c440a0b2293811335bdbf2c4f25f47d"
+    }
+    Frame {
+        msec: 5552
+        hash: "bfc7936cdf833d5b720ec9baca740112"
+    }
+    Frame {
+        msec: 5568
+        hash: "375fa305dbae2872dc9b20e59381cc0c"
+    }
+    Frame {
+        msec: 5584
+        hash: "fffd6173aa49e74164dc17a238bcd830"
+    }
+    Frame {
+        msec: 5600
+        hash: "44d9007e00fab161fd393b653255d7f4"
+    }
+    Frame {
+        msec: 5616
+        hash: "f669ee25c58b4fa20a01705d334f0065"
+    }
+    Frame {
+        msec: 5632
+        hash: "2dbb7d57711b67d5d9e1b81f70e22d34"
+    }
+    Frame {
+        msec: 5648
+        hash: "19351b91448265cb95c1670ee283c611"
+    }
+    Frame {
+        msec: 5664
+        hash: "19351b91448265cb95c1670ee283c611"
+    }
+    Frame {
+        msec: 5680
+        hash: "3a24b99d048348a21f4e4bd69393de89"
+    }
+    Frame {
+        msec: 5696
+        hash: "35a6fe955a52950bbfa954a453e4008e"
+    }
+    Frame {
+        msec: 5712
+        hash: "896f4ec28c976237b34fb2725a44460e"
+    }
+    Frame {
+        msec: 5728
+        hash: "ed3008ea950ec84c57518e573ea36d15"
+    }
+    Frame {
+        msec: 5744
+        hash: "3447c7be992759f772c1db2033eead99"
+    }
+    Frame {
+        msec: 5760
+        hash: "b7133225daa03563d3f5b1dac5f56a23"
+    }
+    Frame {
+        msec: 5776
+        image: "follow.6.png"
+    }
+    Frame {
+        msec: 5792
+        hash: "adc55f2fcf312a90b025a75fa80aa079"
+    }
+    Frame {
+        msec: 5808
+        hash: "3ac85cad400d2b8e4f33798f4f6b7b42"
+    }
+    Frame {
+        msec: 5824
+        hash: "1c115efd84ccbe489d24c3c521c4a61c"
+    }
+    Frame {
+        msec: 5840
+        hash: "39518f1bbc0c4aba6ff517bc3dc7c279"
+    }
+    Frame {
+        msec: 5856
+        hash: "7bd28d32996f4de61c415d3217da16d0"
+    }
+    Frame {
+        msec: 5872
+        hash: "f5d06e25d775bf8db07e95625a712733"
+    }
+    Frame {
+        msec: 5888
+        hash: "4820ea6ea3be88af2f86111c547a19d7"
+    }
+    Frame {
+        msec: 5904
+        hash: "fa6e681c368118b7f135a47ae8fc12ff"
+    }
+    Frame {
+        msec: 5920
+        hash: "f6b30e618aeeb837d2b3eca270b0a060"
+    }
+    Frame {
+        msec: 5936
+        hash: "ac8504bde8d3063a8bf02b9d4b69d755"
+    }
+    Frame {
+        msec: 5952
+        hash: "9670537bb77caa8e23fda7bbfa96ca60"
+    }
+    Frame {
+        msec: 5968
+        hash: "8cd292865ce5c1d240e9ddc93881a0ed"
+    }
+    Frame {
+        msec: 5984
+        hash: "de112013e526203d151c46e6cfba9f92"
+    }
+    Frame {
+        msec: 6000
+        hash: "cd61066e697de8c055aaa168791c2d8c"
+    }
+    Frame {
+        msec: 6016
+        hash: "cd61066e697de8c055aaa168791c2d8c"
+    }
+    Frame {
+        msec: 6032
+        hash: "e68b27ff14aac03c827fd43ac488d23e"
+    }
+    Frame {
+        msec: 6048
+        hash: "e68b27ff14aac03c827fd43ac488d23e"
+    }
+    Frame {
+        msec: 6064
+        hash: "1f61d857a8c26587fbda5895c603441a"
+    }
+    Frame {
+        msec: 6080
+        hash: "1e0dffdd02e05ade1ae444427d4aa345"
+    }
+    Frame {
+        msec: 6096
+        hash: "9a416ee7a1de9ac45ab2d609233c9520"
+    }
+    Frame {
+        msec: 6112
+        hash: "dfa35bf1cd908011c3214a506bcbdcb8"
+    }
+    Frame {
+        msec: 6128
+        hash: "bd502dc72dce4af3036f7af9ed7cf9e9"
+    }
+    Frame {
+        msec: 6144
+        hash: "c77280527612408daa3037aab45da59d"
+    }
+    Frame {
+        msec: 6160
+        hash: "a38ed1532a40210ad7da4c0d4d1a7195"
+    }
+    Frame {
+        msec: 6176
+        hash: "8ac8a8df937da526bbffb9a3590d89ac"
+    }
+    Frame {
+        msec: 6192
+        hash: "07527cb9a4494e11f4c9f99eb72598b9"
+    }
+    Frame {
+        msec: 6208
+        hash: "655b0327ef0f8711810714ba50f2f8cc"
+    }
+    Frame {
+        msec: 6224
+        hash: "549fd25292012a2be1f78118998ca892"
+    }
+    Frame {
+        msec: 6240
+        hash: "7a382ae4e6a48826eaa2c83ee7a73fb2"
+    }
+    Frame {
+        msec: 6256
+        hash: "5acd5f250c5b32d9006ed68dfecbfa1c"
+    }
+    Frame {
+        msec: 6272
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6288
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6304
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Frame {
+        msec: 6320
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Frame {
+        msec: 6336
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Frame {
+        msec: 6352
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Frame {
+        msec: 6368
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Frame {
+        msec: 6384
+        hash: "877aca1c64e588845329ca8a38222604"
+    }
+    Frame {
+        msec: 6400
+        hash: "877aca1c64e588845329ca8a38222604"
+    }
+    Frame {
+        msec: 6416
+        hash: "877aca1c64e588845329ca8a38222604"
+    }
+    Frame {
+        msec: 6432
+        hash: "877aca1c64e588845329ca8a38222604"
+    }
+    Frame {
+        msec: 6448
+        hash: "877aca1c64e588845329ca8a38222604"
+    }
+    Frame {
+        msec: 6464
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6480
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6496
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6512
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6528
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6544
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6560
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6576
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6592
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6608
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6624
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6640
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6656
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6672
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6688
+        hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+    }
+    Frame {
+        msec: 6704
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6720
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6736
+        image: "follow.7.png"
+    }
+    Frame {
+        msec: 6752
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6768
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6784
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6800
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6816
+        hash: "228920e994ebf71d542c71ce8263614e"
+    }
+    Frame {
+        msec: 6832
+        hash: "07e5f1277558bfe7638b00cf9d967baf"
+    }
+    Key {
+        type: 6
+        key: 16777249
+        modifiers: 0
+        text: ""
+        autorep: false
+        count: 1
+    }
+    Frame {
+        msec: 6848
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6864
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6880
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6896
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6912
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+    Frame {
+        msec: 6928
+        hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png
index 87bc640..1b808ef 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
index f56f498..5485174 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
@@ -10,238 +10,238 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 48
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 64
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 80
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 96
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 112
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 128
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 144
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 160
-        hash: "7fb2062f5786da9323db4286688682a0"
+        hash: "3fc7ab44f913d350f7aef342b958e56d"
     }
     Frame {
         msec: 176
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 192
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 208
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 224
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 240
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 256
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 272
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 288
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 304
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 320
-        hash: "c67a5ae840827487ab618ff2d4e9a056"
+        hash: "a495a8a95c8aa82ac437c2f2970bd42d"
     }
     Frame {
         msec: 336
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 352
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 368
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 384
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 400
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 416
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 432
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 448
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 464
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 480
-        hash: "c7986aca05835e238ee95be063bdd032"
+        hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
     }
     Frame {
         msec: 496
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 512
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 528
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 544
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 560
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 576
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 592
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 608
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 624
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 640
-        hash: "dd8ee9c060450beef6cc2494fa463e0a"
+        hash: "00cba961e67c2124ace75dddb657cd6c"
     }
     Frame {
         msec: 656
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 672
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 688
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 704
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 720
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 736
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 752
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 768
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 784
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 800
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 816
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 832
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 848
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 864
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 880
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 896
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 912
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 928
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 944
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
     Frame {
         msec: 960
-        hash: "f55ebe08f1b538d085cda157f566859e"
+        hash: "31d518de83e195def2d957b7d86b98e5"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png
index 4b78165..1fd0213 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
index 7c557e0..c5a5a76 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
@@ -10,122 +10,122 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 48
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 64
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 80
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 96
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 112
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 128
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 144
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 160
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 176
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 192
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 208
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 224
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 240
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 256
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 272
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 288
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 304
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 320
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 336
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 352
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 368
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 384
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 400
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 416
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 432
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 448
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 464
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 480
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
     Frame {
         msec: 496
-        hash: "455caf06270992e3367c2a5a4371b6ac"
+        hash: "f45eda9414f7db5ed1f97a8275459abd"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png
new file mode 100644
index 0000000..4d6bf55
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png
new file mode 100644
index 0000000..a75da16
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml
new file mode 100644
index 0000000..002e1c8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml
@@ -0,0 +1,475 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "QTBUG-14469.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 48
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 64
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 80
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 96
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 112
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 128
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 144
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 160
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 176
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 192
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 208
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 224
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 240
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 256
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 272
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 288
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 304
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 320
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 336
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 352
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 368
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 384
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 400
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 416
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 432
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 448
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 464
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 480
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 496
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 512
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 528
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 544
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 560
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 576
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 592
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 608
+        hash: "067dfe70eca44e2157b723858897c90e"
+    }
+    Frame {
+        msec: 624
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 640
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 656
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 672
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 688
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 704
+        hash: "b1ac0015f173bf5789daa5d45d04dadd"
+    }
+    Frame {
+        msec: 720
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 736
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 752
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 768
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 784
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 800
+        hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+    }
+    Frame {
+        msec: 816
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 832
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 848
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 864
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 880
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 896
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 912
+        hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+    }
+    Frame {
+        msec: 928
+        hash: "cd397908009ddf16ec3101efb0d7468e"
+    }
+    Frame {
+        msec: 944
+        hash: "cd397908009ddf16ec3101efb0d7468e"
+    }
+    Frame {
+        msec: 960
+        hash: "cd397908009ddf16ec3101efb0d7468e"
+    }
+    Frame {
+        msec: 976
+        image: "QTBUG-14469.1.png"
+    }
+    Frame {
+        msec: 992
+        hash: "cd397908009ddf16ec3101efb0d7468e"
+    }
+    Frame {
+        msec: 1008
+        hash: "cd397908009ddf16ec3101efb0d7468e"
+    }
+    Frame {
+        msec: 1024
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1040
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1056
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1072
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1088
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1104
+        hash: "a1eebf1a97314851b5154802f05abe8d"
+    }
+    Frame {
+        msec: 1120
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1136
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1152
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1168
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1184
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1200
+        hash: "71d91d85b9c555eb9b39dac79b35dd46"
+    }
+    Frame {
+        msec: 1216
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1232
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1248
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1264
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1280
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1296
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1312
+        hash: "b1da2d1f4aad2a197a80788607bd867d"
+    }
+    Frame {
+        msec: 1328
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1344
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1360
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1376
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1392
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1408
+        hash: "df14e9cfeba3850bae7cad111fdbc8df"
+    }
+    Frame {
+        msec: 1424
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1440
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1456
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1472
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1488
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1504
+        hash: "fab978e1e0ee5140d8131320ff2322e9"
+    }
+    Frame {
+        msec: 1520
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1536
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1552
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1568
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1584
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1600
+        hash: "cf74324c2a0c8f45c728d42390aac1e0"
+    }
+    Frame {
+        msec: 1616
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1632
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1648
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1664
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1680
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1696
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1712
+        hash: "07c938ac9ff9f591e84fc553291c7c49"
+    }
+    Frame {
+        msec: 1728
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1744
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1760
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1776
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1792
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1808
+        hash: "7b585eb6226e6ce2de355f9730dba377"
+    }
+    Frame {
+        msec: 1824
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 1840
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 1856
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+    Frame {
+        msec: 1872
+        hash: "a7817a7d902ab2fe2875183feb6513dd"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
index 804a443..7e84164 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
index 804a443..7e84164 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
index efdb916..d6d8c2a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
@@ -10,239 +10,239 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 48
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 64
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 80
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 96
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 112
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 128
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 144
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 160
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 176
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 192
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 208
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 224
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 240
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 256
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 272
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 288
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 304
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 320
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 336
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 352
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 368
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 384
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 400
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 416
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 432
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 448
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 464
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 480
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 496
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 512
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 528
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 544
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 560
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 576
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 592
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 608
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 624
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 640
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 656
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 672
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 688
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 704
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 720
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 736
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 752
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 768
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 784
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 800
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 816
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 832
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 848
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 864
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 880
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 896
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 912
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 928
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 944
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 960
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 976
@@ -250,11 +250,11 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 1008
-        hash: "9886d2b883d236bd0a346c6763c1f245"
+        hash: "212d34fa7425fe24398c9de6d4f10422"
     }
     Frame {
         msec: 1024
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png
index 99f0eb7..749a9c5 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png
index 99f0eb7..749a9c5 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
index 6dc7f4f..fbb542e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
@@ -10,239 +10,239 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 48
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 64
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 80
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 96
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 112
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 128
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 144
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 160
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 176
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 192
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 208
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 224
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 240
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 256
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 272
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 288
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 304
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 320
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 336
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 352
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 368
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 384
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 400
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 416
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 432
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 448
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 464
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 480
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 496
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 512
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 528
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 544
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 560
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 576
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 592
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 608
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 624
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 640
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 656
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 672
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 688
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 704
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 720
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 736
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 752
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 768
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 784
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 800
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 816
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 832
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 848
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 864
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 880
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 896
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 912
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 928
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 944
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 960
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 976
@@ -251,29 +251,29 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
     }
     Frame {
         msec: 992
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 1008
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 1024
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 1040
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
     Frame {
         msec: 1056
-        hash: "8401ef19b1e07ca917b8b061888d4e70"
+        hash: "4d49ec1a14a321ea9c0d506663df55c2"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png
index 0b08fba..b84b8a9 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png
index dbf8cd3..dbae0ce 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png
index 09646f8..bf56c80 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png
index b6734b4..c4f6e18 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png
index 861f6b0..ea86925 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
index 026f880..e780ea6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
@@ -10,239 +10,239 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "d482dd54c0f3876a11d80979ada91fa9"
+        hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
     }
     Frame {
         msec: 48
-        hash: "d482dd54c0f3876a11d80979ada91fa9"
+        hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
     }
     Frame {
         msec: 64
-        hash: "d482dd54c0f3876a11d80979ada91fa9"
+        hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
     }
     Frame {
         msec: 80
-        hash: "d482dd54c0f3876a11d80979ada91fa9"
+        hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
     }
     Frame {
         msec: 96
-        hash: "d482dd54c0f3876a11d80979ada91fa9"
+        hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
     }
     Frame {
         msec: 112
-        hash: "3eb1cc8fa11ae88a3bf5004263805264"
+        hash: "452d8e4da326413e4961f20a0d24d0f0"
     }
     Frame {
         msec: 128
-        hash: "3eb1cc8fa11ae88a3bf5004263805264"
+        hash: "452d8e4da326413e4961f20a0d24d0f0"
     }
     Frame {
         msec: 144
-        hash: "3eb1cc8fa11ae88a3bf5004263805264"
+        hash: "452d8e4da326413e4961f20a0d24d0f0"
     }
     Frame {
         msec: 160
-        hash: "3eb1cc8fa11ae88a3bf5004263805264"
+        hash: "452d8e4da326413e4961f20a0d24d0f0"
     }
     Frame {
         msec: 176
-        hash: "3eb1cc8fa11ae88a3bf5004263805264"
+        hash: "452d8e4da326413e4961f20a0d24d0f0"
     }
     Frame {
         msec: 192
-        hash: "b169f3828fafa79245bd5886d94a33b2"
+        hash: "8dc43f316fd36a877c773c10c23b5703"
     }
     Frame {
         msec: 208
-        hash: "b169f3828fafa79245bd5886d94a33b2"
+        hash: "8dc43f316fd36a877c773c10c23b5703"
     }
     Frame {
         msec: 224
-        hash: "b169f3828fafa79245bd5886d94a33b2"
+        hash: "8dc43f316fd36a877c773c10c23b5703"
     }
     Frame {
         msec: 240
-        hash: "b169f3828fafa79245bd5886d94a33b2"
+        hash: "8dc43f316fd36a877c773c10c23b5703"
     }
     Frame {
         msec: 256
-        hash: "c9a22f77cce333ea041730bc76d9bb96"
+        hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
     }
     Frame {
         msec: 272
-        hash: "c9a22f77cce333ea041730bc76d9bb96"
+        hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
     }
     Frame {
         msec: 288
-        hash: "c9a22f77cce333ea041730bc76d9bb96"
+        hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
     }
     Frame {
         msec: 304
-        hash: "c9a22f77cce333ea041730bc76d9bb96"
+        hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
     }
     Frame {
         msec: 320
-        hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+        hash: "e9b0abe5719027348cd267eb4823fc5f"
     }
     Frame {
         msec: 336
-        hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+        hash: "e9b0abe5719027348cd267eb4823fc5f"
     }
     Frame {
         msec: 352
-        hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+        hash: "e9b0abe5719027348cd267eb4823fc5f"
     }
     Frame {
         msec: 368
-        hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+        hash: "e9b0abe5719027348cd267eb4823fc5f"
     }
     Frame {
         msec: 384
-        hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+        hash: "e9b0abe5719027348cd267eb4823fc5f"
     }
     Frame {
         msec: 400
-        hash: "ed14c796dc2980f7a1bdedb15698ae01"
+        hash: "441102f2f69e9f4e10335c1746d47bd3"
     }
     Frame {
         msec: 416
-        hash: "ed14c796dc2980f7a1bdedb15698ae01"
+        hash: "441102f2f69e9f4e10335c1746d47bd3"
     }
     Frame {
         msec: 432
-        hash: "ed14c796dc2980f7a1bdedb15698ae01"
+        hash: "441102f2f69e9f4e10335c1746d47bd3"
     }
     Frame {
         msec: 448
-        hash: "ed14c796dc2980f7a1bdedb15698ae01"
+        hash: "441102f2f69e9f4e10335c1746d47bd3"
     }
     Frame {
         msec: 464
-        hash: "ed14c796dc2980f7a1bdedb15698ae01"
+        hash: "441102f2f69e9f4e10335c1746d47bd3"
     }
     Frame {
         msec: 480
-        hash: "24d811c9b98b0cb140e7e82090e793ab"
+        hash: "95668288170720989adde2a0b41d5ee8"
     }
     Frame {
         msec: 496
-        hash: "24d811c9b98b0cb140e7e82090e793ab"
+        hash: "95668288170720989adde2a0b41d5ee8"
     }
     Frame {
         msec: 512
-        hash: "24d811c9b98b0cb140e7e82090e793ab"
+        hash: "95668288170720989adde2a0b41d5ee8"
     }
     Frame {
         msec: 528
-        hash: "24d811c9b98b0cb140e7e82090e793ab"
+        hash: "95668288170720989adde2a0b41d5ee8"
     }
     Frame {
         msec: 544
-        hash: "afa28a6a682128b1b44df31c78b63b04"
+        hash: "16bba6b72993e474b4c302af3f682834"
     }
     Frame {
         msec: 560
-        hash: "afa28a6a682128b1b44df31c78b63b04"
+        hash: "16bba6b72993e474b4c302af3f682834"
     }
     Frame {
         msec: 576
-        hash: "afa28a6a682128b1b44df31c78b63b04"
+        hash: "16bba6b72993e474b4c302af3f682834"
     }
     Frame {
         msec: 592
-        hash: "afa28a6a682128b1b44df31c78b63b04"
+        hash: "16bba6b72993e474b4c302af3f682834"
     }
     Frame {
         msec: 608
-        hash: "c43bba2d3406fabdafac344102d7d72c"
+        hash: "86c4d8bd1b19116411b6a6e450547425"
     }
     Frame {
         msec: 624
-        hash: "c43bba2d3406fabdafac344102d7d72c"
+        hash: "86c4d8bd1b19116411b6a6e450547425"
     }
     Frame {
         msec: 640
-        hash: "c43bba2d3406fabdafac344102d7d72c"
+        hash: "86c4d8bd1b19116411b6a6e450547425"
     }
     Frame {
         msec: 656
-        hash: "c43bba2d3406fabdafac344102d7d72c"
+        hash: "86c4d8bd1b19116411b6a6e450547425"
     }
     Frame {
         msec: 672
-        hash: "c43bba2d3406fabdafac344102d7d72c"
+        hash: "86c4d8bd1b19116411b6a6e450547425"
     }
     Frame {
         msec: 688
-        hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+        hash: "d0d3cfa922ebca20c590ab7e59985268"
     }
     Frame {
         msec: 704
-        hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+        hash: "d0d3cfa922ebca20c590ab7e59985268"
     }
     Frame {
         msec: 720
-        hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+        hash: "d0d3cfa922ebca20c590ab7e59985268"
     }
     Frame {
         msec: 736
-        hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+        hash: "d0d3cfa922ebca20c590ab7e59985268"
     }
     Frame {
         msec: 752
-        hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+        hash: "d0d3cfa922ebca20c590ab7e59985268"
     }
     Frame {
         msec: 768
-        hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+        hash: "397d72a090171090f897283729b19bc8"
     }
     Frame {
         msec: 784
-        hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+        hash: "397d72a090171090f897283729b19bc8"
     }
     Frame {
         msec: 800
-        hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+        hash: "397d72a090171090f897283729b19bc8"
     }
     Frame {
         msec: 816
-        hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+        hash: "397d72a090171090f897283729b19bc8"
     }
     Frame {
         msec: 832
-        hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+        hash: "2b038e59289d2e3cef02245d2d128271"
     }
     Frame {
         msec: 848
-        hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+        hash: "2b038e59289d2e3cef02245d2d128271"
     }
     Frame {
         msec: 864
-        hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+        hash: "2b038e59289d2e3cef02245d2d128271"
     }
     Frame {
         msec: 880
-        hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+        hash: "2b038e59289d2e3cef02245d2d128271"
     }
     Frame {
         msec: 896
-        hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+        hash: "2b038e59289d2e3cef02245d2d128271"
     }
     Frame {
         msec: 912
-        hash: "e34a9080716cebc0260e682960cc7c6e"
+        hash: "5f64aa763acdd8f5d6cc249be36e226a"
     }
     Frame {
         msec: 928
-        hash: "e34a9080716cebc0260e682960cc7c6e"
+        hash: "5f64aa763acdd8f5d6cc249be36e226a"
     }
     Frame {
         msec: 944
-        hash: "e34a9080716cebc0260e682960cc7c6e"
+        hash: "5f64aa763acdd8f5d6cc249be36e226a"
     }
     Frame {
         msec: 960
-        hash: "e34a9080716cebc0260e682960cc7c6e"
+        hash: "5f64aa763acdd8f5d6cc249be36e226a"
     }
     Frame {
         msec: 976
@@ -250,247 +250,247 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+        hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
     }
     Frame {
         msec: 1008
-        hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+        hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
     }
     Frame {
         msec: 1024
-        hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+        hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
     }
     Frame {
         msec: 1040
-        hash: "47794b18771d6d558ebbca881de92377"
+        hash: "91a7a0c0f686975d0087ee0e066911eb"
     }
     Frame {
         msec: 1056
-        hash: "47794b18771d6d558ebbca881de92377"
+        hash: "91a7a0c0f686975d0087ee0e066911eb"
     }
     Frame {
         msec: 1072
-        hash: "47794b18771d6d558ebbca881de92377"
+        hash: "91a7a0c0f686975d0087ee0e066911eb"
     }
     Frame {
         msec: 1088
-        hash: "47794b18771d6d558ebbca881de92377"
+        hash: "91a7a0c0f686975d0087ee0e066911eb"
     }
     Frame {
         msec: 1104
-        hash: "47794b18771d6d558ebbca881de92377"
+        hash: "91a7a0c0f686975d0087ee0e066911eb"
     }
     Frame {
         msec: 1120
-        hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+        hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
     }
     Frame {
         msec: 1136
-        hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+        hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
     }
     Frame {
         msec: 1152
-        hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+        hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
     }
     Frame {
         msec: 1168
-        hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+        hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
     }
     Frame {
         msec: 1184
-        hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+        hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
     }
     Frame {
         msec: 1200
-        hash: "e94344268d2a118053ecc3aef278d91d"
+        hash: "456542b672303ddae500b96e9b66a558"
     }
     Frame {
         msec: 1216
-        hash: "e94344268d2a118053ecc3aef278d91d"
+        hash: "456542b672303ddae500b96e9b66a558"
     }
     Frame {
         msec: 1232
-        hash: "e94344268d2a118053ecc3aef278d91d"
+        hash: "456542b672303ddae500b96e9b66a558"
     }
     Frame {
         msec: 1248
-        hash: "e94344268d2a118053ecc3aef278d91d"
+        hash: "456542b672303ddae500b96e9b66a558"
     }
     Frame {
         msec: 1264
-        hash: "df1959605d3bd74e84e51cbd4d322235"
+        hash: "8ec69f05d929c3b397dc721198ccacd4"
     }
     Frame {
         msec: 1280
-        hash: "df1959605d3bd74e84e51cbd4d322235"
+        hash: "8ec69f05d929c3b397dc721198ccacd4"
     }
     Frame {
         msec: 1296
-        hash: "df1959605d3bd74e84e51cbd4d322235"
+        hash: "8ec69f05d929c3b397dc721198ccacd4"
     }
     Frame {
         msec: 1312
-        hash: "df1959605d3bd74e84e51cbd4d322235"
+        hash: "8ec69f05d929c3b397dc721198ccacd4"
     }
     Frame {
         msec: 1328
-        hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+        hash: "2d63fd91f4b01f6b178c795838e78990"
     }
     Frame {
         msec: 1344
-        hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+        hash: "2d63fd91f4b01f6b178c795838e78990"
     }
     Frame {
         msec: 1360
-        hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+        hash: "2d63fd91f4b01f6b178c795838e78990"
     }
     Frame {
         msec: 1376
-        hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+        hash: "2d63fd91f4b01f6b178c795838e78990"
     }
     Frame {
         msec: 1392
-        hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+        hash: "2d63fd91f4b01f6b178c795838e78990"
     }
     Frame {
         msec: 1408
-        hash: "fd1344db48093182eb2c2872ceb887df"
+        hash: "c7c1d2c288653b414fe534ff6fab3381"
     }
     Frame {
         msec: 1424
-        hash: "fd1344db48093182eb2c2872ceb887df"
+        hash: "c7c1d2c288653b414fe534ff6fab3381"
     }
     Frame {
         msec: 1440
-        hash: "fd1344db48093182eb2c2872ceb887df"
+        hash: "c7c1d2c288653b414fe534ff6fab3381"
     }
     Frame {
         msec: 1456
-        hash: "fd1344db48093182eb2c2872ceb887df"
+        hash: "c7c1d2c288653b414fe534ff6fab3381"
     }
     Frame {
         msec: 1472
-        hash: "fd1344db48093182eb2c2872ceb887df"
+        hash: "c7c1d2c288653b414fe534ff6fab3381"
     }
     Frame {
         msec: 1488
-        hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+        hash: "23188e926a855a7a06211783ee51d22a"
     }
     Frame {
         msec: 1504
-        hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+        hash: "23188e926a855a7a06211783ee51d22a"
     }
     Frame {
         msec: 1520
-        hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+        hash: "23188e926a855a7a06211783ee51d22a"
     }
     Frame {
         msec: 1536
-        hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+        hash: "23188e926a855a7a06211783ee51d22a"
     }
     Frame {
         msec: 1552
-        hash: "072a6c0e64853f57487845f2ff376c12"
+        hash: "cfc64d8876d59e0d75f079c2e08cea5f"
     }
     Frame {
         msec: 1568
-        hash: "072a6c0e64853f57487845f2ff376c12"
+        hash: "cfc64d8876d59e0d75f079c2e08cea5f"
     }
     Frame {
         msec: 1584
-        hash: "072a6c0e64853f57487845f2ff376c12"
+        hash: "cfc64d8876d59e0d75f079c2e08cea5f"
     }
     Frame {
         msec: 1600
-        hash: "072a6c0e64853f57487845f2ff376c12"
+        hash: "cfc64d8876d59e0d75f079c2e08cea5f"
     }
     Frame {
         msec: 1616
-        hash: "072a6c0e64853f57487845f2ff376c12"
+        hash: "cfc64d8876d59e0d75f079c2e08cea5f"
     }
     Frame {
         msec: 1632
-        hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+        hash: "766c679eaec4bd28dc92cb3642d5be83"
     }
     Frame {
         msec: 1648
-        hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+        hash: "766c679eaec4bd28dc92cb3642d5be83"
     }
     Frame {
         msec: 1664
-        hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+        hash: "766c679eaec4bd28dc92cb3642d5be83"
     }
     Frame {
         msec: 1680
-        hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+        hash: "766c679eaec4bd28dc92cb3642d5be83"
     }
     Frame {
         msec: 1696
-        hash: "31cb8e151b34187f712b269b38a317a7"
+        hash: "a86ba05a854fde208e6cf7849327d5d0"
     }
     Frame {
         msec: 1712
-        hash: "31cb8e151b34187f712b269b38a317a7"
+        hash: "a86ba05a854fde208e6cf7849327d5d0"
     }
     Frame {
         msec: 1728
-        hash: "31cb8e151b34187f712b269b38a317a7"
+        hash: "a86ba05a854fde208e6cf7849327d5d0"
     }
     Frame {
         msec: 1744
-        hash: "31cb8e151b34187f712b269b38a317a7"
+        hash: "a86ba05a854fde208e6cf7849327d5d0"
     }
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
     }
     Frame {
         msec: 1760
-        hash: "31cb8e151b34187f712b269b38a317a7"
+        hash: "a86ba05a854fde208e6cf7849327d5d0"
     }
     Frame {
         msec: 1776
-        hash: "e24ad0aed6a071d6da9f51af00c69300"
+        hash: "23b60817be2a741cada2af663b0d7f54"
     }
     Frame {
         msec: 1792
-        hash: "e24ad0aed6a071d6da9f51af00c69300"
+        hash: "23b60817be2a741cada2af663b0d7f54"
     }
     Frame {
         msec: 1808
-        hash: "e24ad0aed6a071d6da9f51af00c69300"
+        hash: "23b60817be2a741cada2af663b0d7f54"
     }
     Frame {
         msec: 1824
-        hash: "e24ad0aed6a071d6da9f51af00c69300"
+        hash: "23b60817be2a741cada2af663b0d7f54"
     }
     Frame {
         msec: 1840
-        hash: "760eea420a5eb52ccd1f6a29d6701338"
+        hash: "c098c1c0d5239c59735a5c9450e9d531"
     }
     Frame {
         msec: 1856
-        hash: "760eea420a5eb52ccd1f6a29d6701338"
+        hash: "c098c1c0d5239c59735a5c9450e9d531"
     }
     Frame {
         msec: 1872
-        hash: "760eea420a5eb52ccd1f6a29d6701338"
+        hash: "c098c1c0d5239c59735a5c9450e9d531"
     }
     Frame {
         msec: 1888
-        hash: "760eea420a5eb52ccd1f6a29d6701338"
+        hash: "c098c1c0d5239c59735a5c9450e9d531"
     }
     Frame {
         msec: 1904
-        hash: "760eea420a5eb52ccd1f6a29d6701338"
+        hash: "c098c1c0d5239c59735a5c9450e9d531"
     }
     Frame {
         msec: 1920
-        hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+        hash: "09f6ee218d314d3a405ae43e32588c07"
     }
     Frame {
         msec: 1936
@@ -498,239 +498,239 @@ VisualTest {
     }
     Frame {
         msec: 1952
-        hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+        hash: "09f6ee218d314d3a405ae43e32588c07"
     }
     Frame {
         msec: 1968
-        hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+        hash: "09f6ee218d314d3a405ae43e32588c07"
     }
     Frame {
         msec: 1984
-        hash: "ec4dada16fb19fb4cf24367c9f25f161"
+        hash: "6ee480e7d8b0abe295ae12a660119102"
     }
     Frame {
         msec: 2000
-        hash: "ec4dada16fb19fb4cf24367c9f25f161"
+        hash: "6ee480e7d8b0abe295ae12a660119102"
     }
     Frame {
         msec: 2016
-        hash: "ec4dada16fb19fb4cf24367c9f25f161"
+        hash: "6ee480e7d8b0abe295ae12a660119102"
     }
     Frame {
         msec: 2032
-        hash: "ec4dada16fb19fb4cf24367c9f25f161"
+        hash: "6ee480e7d8b0abe295ae12a660119102"
     }
     Frame {
         msec: 2048
-        hash: "ec4dada16fb19fb4cf24367c9f25f161"
+        hash: "6ee480e7d8b0abe295ae12a660119102"
     }
     Frame {
         msec: 2064
-        hash: "f5ef19dc69f8b6060056f7005f613ca3"
+        hash: "b43ca0ea75f4c17c09248f78170d3839"
     }
     Frame {
         msec: 2080
-        hash: "f5ef19dc69f8b6060056f7005f613ca3"
+        hash: "b43ca0ea75f4c17c09248f78170d3839"
     }
     Frame {
         msec: 2096
-        hash: "f5ef19dc69f8b6060056f7005f613ca3"
+        hash: "b43ca0ea75f4c17c09248f78170d3839"
     }
     Frame {
         msec: 2112
-        hash: "f5ef19dc69f8b6060056f7005f613ca3"
+        hash: "b43ca0ea75f4c17c09248f78170d3839"
     }
     Frame {
         msec: 2128
-        hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+        hash: "92e0ee1174ffcb710403bb831aeec353"
     }
     Frame {
         msec: 2144
-        hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+        hash: "92e0ee1174ffcb710403bb831aeec353"
     }
     Frame {
         msec: 2160
-        hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+        hash: "92e0ee1174ffcb710403bb831aeec353"
     }
     Frame {
         msec: 2176
-        hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+        hash: "92e0ee1174ffcb710403bb831aeec353"
     }
     Frame {
         msec: 2192
-        hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+        hash: "92e0ee1174ffcb710403bb831aeec353"
     }
     Frame {
         msec: 2208
-        hash: "1c3e491e889e408f705477f060103243"
+        hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
     }
     Frame {
         msec: 2224
-        hash: "1c3e491e889e408f705477f060103243"
+        hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
     }
     Frame {
         msec: 2240
-        hash: "1c3e491e889e408f705477f060103243"
+        hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
     }
     Frame {
         msec: 2256
-        hash: "1c3e491e889e408f705477f060103243"
+        hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
     }
     Frame {
         msec: 2272
-        hash: "80bc59211ffab64820e306e6eb13d2fc"
+        hash: "7efeb1565125f25252ce3f03dadc3bea"
     }
     Frame {
         msec: 2288
-        hash: "80bc59211ffab64820e306e6eb13d2fc"
+        hash: "7efeb1565125f25252ce3f03dadc3bea"
     }
     Frame {
         msec: 2304
-        hash: "80bc59211ffab64820e306e6eb13d2fc"
+        hash: "7efeb1565125f25252ce3f03dadc3bea"
     }
     Frame {
         msec: 2320
-        hash: "80bc59211ffab64820e306e6eb13d2fc"
+        hash: "7efeb1565125f25252ce3f03dadc3bea"
     }
     Frame {
         msec: 2336
-        hash: "80bc59211ffab64820e306e6eb13d2fc"
+        hash: "7efeb1565125f25252ce3f03dadc3bea"
     }
     Frame {
         msec: 2352
-        hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+        hash: "9086d24dff90f8c9e4543c6b14c99bf6"
     }
     Frame {
         msec: 2368
-        hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+        hash: "9086d24dff90f8c9e4543c6b14c99bf6"
     }
     Frame {
         msec: 2384
-        hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+        hash: "9086d24dff90f8c9e4543c6b14c99bf6"
     }
     Frame {
         msec: 2400
-        hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+        hash: "9086d24dff90f8c9e4543c6b14c99bf6"
     }
     Frame {
         msec: 2416
-        hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+        hash: "9086d24dff90f8c9e4543c6b14c99bf6"
     }
     Frame {
         msec: 2432
-        hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+        hash: "15d8e99a0676e0a1588dfddc00ab0d16"
     }
     Frame {
         msec: 2448
-        hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+        hash: "15d8e99a0676e0a1588dfddc00ab0d16"
     }
     Frame {
         msec: 2464
-        hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+        hash: "15d8e99a0676e0a1588dfddc00ab0d16"
     }
     Frame {
         msec: 2480
-        hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+        hash: "15d8e99a0676e0a1588dfddc00ab0d16"
     }
     Frame {
         msec: 2496
-        hash: "4f26d7ab05e6d39a869be1259e33c739"
+        hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
     }
     Frame {
         msec: 2512
-        hash: "4f26d7ab05e6d39a869be1259e33c739"
+        hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
     }
     Frame {
         msec: 2528
-        hash: "4f26d7ab05e6d39a869be1259e33c739"
+        hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
     }
     Frame {
         msec: 2544
-        hash: "4f26d7ab05e6d39a869be1259e33c739"
+        hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
     }
     Frame {
         msec: 2560
-        hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+        hash: "905c81686d8d2ecdde513622c35c0ea6"
     }
     Frame {
         msec: 2576
-        hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+        hash: "905c81686d8d2ecdde513622c35c0ea6"
     }
     Frame {
         msec: 2592
-        hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+        hash: "905c81686d8d2ecdde513622c35c0ea6"
     }
     Frame {
         msec: 2608
-        hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+        hash: "905c81686d8d2ecdde513622c35c0ea6"
     }
     Frame {
         msec: 2624
-        hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+        hash: "905c81686d8d2ecdde513622c35c0ea6"
     }
     Frame {
         msec: 2640
-        hash: "6d91b100f369381b24052e5a4466e24d"
+        hash: "537a2cf41a5e15220d2ca2218ac49a5a"
     }
     Frame {
         msec: 2656
-        hash: "6d91b100f369381b24052e5a4466e24d"
+        hash: "537a2cf41a5e15220d2ca2218ac49a5a"
     }
     Frame {
         msec: 2672
-        hash: "6d91b100f369381b24052e5a4466e24d"
+        hash: "537a2cf41a5e15220d2ca2218ac49a5a"
     }
     Frame {
         msec: 2688
-        hash: "6d91b100f369381b24052e5a4466e24d"
+        hash: "537a2cf41a5e15220d2ca2218ac49a5a"
     }
     Frame {
         msec: 2704
-        hash: "2d6082b41e3cfdc3be9c130311ac854a"
+        hash: "53325ce7d011eeb72369463721f15e87"
     }
     Frame {
         msec: 2720
-        hash: "2d6082b41e3cfdc3be9c130311ac854a"
+        hash: "53325ce7d011eeb72369463721f15e87"
     }
     Frame {
         msec: 2736
-        hash: "2d6082b41e3cfdc3be9c130311ac854a"
+        hash: "53325ce7d011eeb72369463721f15e87"
     }
     Frame {
         msec: 2752
-        hash: "2d6082b41e3cfdc3be9c130311ac854a"
+        hash: "53325ce7d011eeb72369463721f15e87"
     }
     Frame {
         msec: 2768
-        hash: "2d6082b41e3cfdc3be9c130311ac854a"
+        hash: "53325ce7d011eeb72369463721f15e87"
     }
     Frame {
         msec: 2784
-        hash: "78732b58812f202768fa224aefce187d"
+        hash: "9ad2565cc95647a83d3ce3acc106485a"
     }
     Frame {
         msec: 2800
-        hash: "78732b58812f202768fa224aefce187d"
+        hash: "9ad2565cc95647a83d3ce3acc106485a"
     }
     Frame {
         msec: 2816
-        hash: "78732b58812f202768fa224aefce187d"
+        hash: "9ad2565cc95647a83d3ce3acc106485a"
     }
     Frame {
         msec: 2832
-        hash: "78732b58812f202768fa224aefce187d"
+        hash: "9ad2565cc95647a83d3ce3acc106485a"
     }
     Frame {
         msec: 2848
-        hash: "54d728d677cf3a07c4da7727a75e6c59"
+        hash: "de7b66581e0743385a984f76c993b01b"
     }
     Frame {
         msec: 2864
-        hash: "54d728d677cf3a07c4da7727a75e6c59"
+        hash: "de7b66581e0743385a984f76c993b01b"
     }
     Frame {
         msec: 2880
-        hash: "54d728d677cf3a07c4da7727a75e6c59"
+        hash: "de7b66581e0743385a984f76c993b01b"
     }
     Frame {
         msec: 2896
@@ -738,239 +738,239 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "54d728d677cf3a07c4da7727a75e6c59"
+        hash: "de7b66581e0743385a984f76c993b01b"
     }
     Frame {
         msec: 2928
-        hash: "45ec3534077f6fa66d7710010cceb332"
+        hash: "f66852df1738e4fe29ac1f6938d814c2"
     }
     Frame {
         msec: 2944
-        hash: "45ec3534077f6fa66d7710010cceb332"
+        hash: "f66852df1738e4fe29ac1f6938d814c2"
     }
     Frame {
         msec: 2960
-        hash: "45ec3534077f6fa66d7710010cceb332"
+        hash: "f66852df1738e4fe29ac1f6938d814c2"
     }
     Frame {
         msec: 2976
-        hash: "45ec3534077f6fa66d7710010cceb332"
+        hash: "f66852df1738e4fe29ac1f6938d814c2"
     }
     Frame {
         msec: 2992
-        hash: "ef909728fa59292ffed1d047835439d6"
+        hash: "cf6dde6c590879a9e905a0f559f089ca"
     }
     Frame {
         msec: 3008
-        hash: "ef909728fa59292ffed1d047835439d6"
+        hash: "cf6dde6c590879a9e905a0f559f089ca"
     }
     Frame {
         msec: 3024
-        hash: "ef909728fa59292ffed1d047835439d6"
+        hash: "cf6dde6c590879a9e905a0f559f089ca"
     }
     Frame {
         msec: 3040
-        hash: "ef909728fa59292ffed1d047835439d6"
+        hash: "cf6dde6c590879a9e905a0f559f089ca"
     }
     Frame {
         msec: 3056
-        hash: "ef909728fa59292ffed1d047835439d6"
+        hash: "cf6dde6c590879a9e905a0f559f089ca"
     }
     Frame {
         msec: 3072
-        hash: "454741313d087e5d13ddeaf02663746f"
+        hash: "bd63e4df280010ed9f67fc7976b86cb5"
     }
     Frame {
         msec: 3088
-        hash: "454741313d087e5d13ddeaf02663746f"
+        hash: "bd63e4df280010ed9f67fc7976b86cb5"
     }
     Frame {
         msec: 3104
-        hash: "454741313d087e5d13ddeaf02663746f"
+        hash: "bd63e4df280010ed9f67fc7976b86cb5"
     }
     Frame {
         msec: 3120
-        hash: "454741313d087e5d13ddeaf02663746f"
+        hash: "bd63e4df280010ed9f67fc7976b86cb5"
     }
     Frame {
         msec: 3136
-        hash: "454741313d087e5d13ddeaf02663746f"
+        hash: "bd63e4df280010ed9f67fc7976b86cb5"
     }
     Frame {
         msec: 3152
-        hash: "02928f0a8f8f1011028114487b8dccf8"
+        hash: "065d3d370faa58aed9899cae0f86f032"
     }
     Frame {
         msec: 3168
-        hash: "02928f0a8f8f1011028114487b8dccf8"
+        hash: "065d3d370faa58aed9899cae0f86f032"
     }
     Frame {
         msec: 3184
-        hash: "02928f0a8f8f1011028114487b8dccf8"
+        hash: "065d3d370faa58aed9899cae0f86f032"
     }
     Frame {
         msec: 3200
-        hash: "02928f0a8f8f1011028114487b8dccf8"
+        hash: "065d3d370faa58aed9899cae0f86f032"
     }
     Frame {
         msec: 3216
-        hash: "e0fca67bb095c9891831cd9355b4880d"
+        hash: "b5623d05c578a6f09bcfacd4d3163b09"
     }
     Frame {
         msec: 3232
-        hash: "e0fca67bb095c9891831cd9355b4880d"
+        hash: "b5623d05c578a6f09bcfacd4d3163b09"
     }
     Frame {
         msec: 3248
-        hash: "e0fca67bb095c9891831cd9355b4880d"
+        hash: "b5623d05c578a6f09bcfacd4d3163b09"
     }
     Frame {
         msec: 3264
-        hash: "e0fca67bb095c9891831cd9355b4880d"
+        hash: "b5623d05c578a6f09bcfacd4d3163b09"
     }
     Frame {
         msec: 3280
-        hash: "f5ae54931d953fc95cfbdbde1993bebe"
+        hash: "83c70529d05911ea26a5cbbab5aa20f2"
     }
     Frame {
         msec: 3296
-        hash: "f5ae54931d953fc95cfbdbde1993bebe"
+        hash: "83c70529d05911ea26a5cbbab5aa20f2"
     }
     Frame {
         msec: 3312
-        hash: "f5ae54931d953fc95cfbdbde1993bebe"
+        hash: "83c70529d05911ea26a5cbbab5aa20f2"
     }
     Frame {
         msec: 3328
-        hash: "f5ae54931d953fc95cfbdbde1993bebe"
+        hash: "83c70529d05911ea26a5cbbab5aa20f2"
     }
     Frame {
         msec: 3344
-        hash: "f5ae54931d953fc95cfbdbde1993bebe"
+        hash: "83c70529d05911ea26a5cbbab5aa20f2"
     }
     Frame {
         msec: 3360
-        hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+        hash: "17927c706da1bc222ba5462af66a9d2f"
     }
     Frame {
         msec: 3376
-        hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+        hash: "17927c706da1bc222ba5462af66a9d2f"
     }
     Frame {
         msec: 3392
-        hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+        hash: "17927c706da1bc222ba5462af66a9d2f"
     }
     Frame {
         msec: 3408
-        hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+        hash: "17927c706da1bc222ba5462af66a9d2f"
     }
     Frame {
         msec: 3424
-        hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+        hash: "17927c706da1bc222ba5462af66a9d2f"
     }
     Frame {
         msec: 3440
-        hash: "f3f5a81d3b5f644a00cea6203f38994c"
+        hash: "f49627ba8d3e257e0e94404da24d12dc"
     }
     Frame {
         msec: 3456
-        hash: "f3f5a81d3b5f644a00cea6203f38994c"
+        hash: "f49627ba8d3e257e0e94404da24d12dc"
     }
     Frame {
         msec: 3472
-        hash: "f3f5a81d3b5f644a00cea6203f38994c"
+        hash: "f49627ba8d3e257e0e94404da24d12dc"
     }
     Frame {
         msec: 3488
-        hash: "f3f5a81d3b5f644a00cea6203f38994c"
+        hash: "f49627ba8d3e257e0e94404da24d12dc"
     }
     Frame {
         msec: 3504
-        hash: "bd9884712fd5afe67a3622c809bf4e76"
+        hash: "37a0c9dc20431c8398409d4522a0fdd3"
     }
     Frame {
         msec: 3520
-        hash: "bd9884712fd5afe67a3622c809bf4e76"
+        hash: "37a0c9dc20431c8398409d4522a0fdd3"
     }
     Frame {
         msec: 3536
-        hash: "bd9884712fd5afe67a3622c809bf4e76"
+        hash: "37a0c9dc20431c8398409d4522a0fdd3"
     }
     Frame {
         msec: 3552
-        hash: "bd9884712fd5afe67a3622c809bf4e76"
+        hash: "37a0c9dc20431c8398409d4522a0fdd3"
     }
     Frame {
         msec: 3568
-        hash: "c9324386954380a72ef4084d13e623b5"
+        hash: "67bebfe9fb5ac745f40040ff8083e999"
     }
     Frame {
         msec: 3584
-        hash: "c9324386954380a72ef4084d13e623b5"
+        hash: "67bebfe9fb5ac745f40040ff8083e999"
     }
     Frame {
         msec: 3600
-        hash: "c9324386954380a72ef4084d13e623b5"
+        hash: "67bebfe9fb5ac745f40040ff8083e999"
     }
     Frame {
         msec: 3616
-        hash: "c9324386954380a72ef4084d13e623b5"
+        hash: "67bebfe9fb5ac745f40040ff8083e999"
     }
     Frame {
         msec: 3632
-        hash: "c9324386954380a72ef4084d13e623b5"
+        hash: "67bebfe9fb5ac745f40040ff8083e999"
     }
     Frame {
         msec: 3648
-        hash: "6d05fd8e8690e44293af1809f359aa72"
+        hash: "84f8b27b83b566c99e65ea39b29772c1"
     }
     Frame {
         msec: 3664
-        hash: "6d05fd8e8690e44293af1809f359aa72"
+        hash: "84f8b27b83b566c99e65ea39b29772c1"
     }
     Frame {
         msec: 3680
-        hash: "6d05fd8e8690e44293af1809f359aa72"
+        hash: "84f8b27b83b566c99e65ea39b29772c1"
     }
     Frame {
         msec: 3696
-        hash: "6d05fd8e8690e44293af1809f359aa72"
+        hash: "84f8b27b83b566c99e65ea39b29772c1"
     }
     Frame {
         msec: 3712
-        hash: "6d05fd8e8690e44293af1809f359aa72"
+        hash: "84f8b27b83b566c99e65ea39b29772c1"
     }
     Frame {
         msec: 3728
-        hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+        hash: "c6ba663536f19b9f291ef35b7a70e490"
     }
     Frame {
         msec: 3744
-        hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+        hash: "c6ba663536f19b9f291ef35b7a70e490"
     }
     Frame {
         msec: 3760
-        hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+        hash: "c6ba663536f19b9f291ef35b7a70e490"
     }
     Frame {
         msec: 3776
-        hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+        hash: "c6ba663536f19b9f291ef35b7a70e490"
     }
     Frame {
         msec: 3792
-        hash: "edb5d50f23a293a7791122fc159aaaa0"
+        hash: "65f22784730aa27b2628d015a1cc4abe"
     }
     Frame {
         msec: 3808
-        hash: "edb5d50f23a293a7791122fc159aaaa0"
+        hash: "65f22784730aa27b2628d015a1cc4abe"
     }
     Frame {
         msec: 3824
-        hash: "edb5d50f23a293a7791122fc159aaaa0"
+        hash: "65f22784730aa27b2628d015a1cc4abe"
     }
     Frame {
         msec: 3840
-        hash: "edb5d50f23a293a7791122fc159aaaa0"
+        hash: "65f22784730aa27b2628d015a1cc4abe"
     }
     Frame {
         msec: 3856
@@ -978,14 +978,14 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "a863480fec9abf817752c5eb62a2ddf4"
+        hash: "b11a511d80de87329501b9c11aebbc58"
     }
     Frame {
         msec: 3888
-        hash: "a863480fec9abf817752c5eb62a2ddf4"
+        hash: "b11a511d80de87329501b9c11aebbc58"
     }
     Frame {
         msec: 3904
-        hash: "a863480fec9abf817752c5eb62a2ddf4"
+        hash: "b11a511d80de87329501b9c11aebbc58"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png
index e1d3b75..3861b4f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png
index 8013dc9..ce166f1 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
index 77a7b2f..84778ac 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
@@ -10,239 +10,239 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "ef2b4cc93e5bf5e64d3338921fe36336"
+        hash: "58d757783e6d57c5ac2596219dfd37be"
     }
     Frame {
         msec: 48
-        hash: "3ddbd1a53a36b0f8b36d87e742f3b1bd"
+        hash: "e76b3b98f447b706c59ba0c175e1829d"
     }
     Frame {
         msec: 64
-        hash: "f7acfdaf29a3d7bd179b30db784ca01b"
+        hash: "f0dbb0b55d1d27bf7c0260db5b5782a2"
     }
     Frame {
         msec: 80
-        hash: "b5277d02ed63180e845c60e1dd4da7d0"
+        hash: "00845517336befd7ead0141312ea38ce"
     }
     Frame {
         msec: 96
-        hash: "a7964577d77943d5a62c02ea1e689eb7"
+        hash: "99723ae092407e5291ed3a13f5a7be61"
     }
     Frame {
         msec: 112
-        hash: "fc597a07209bfea49227ec491b033af1"
+        hash: "2d531f1dd1545a4e2f8ca4c65338e0c3"
     }
     Frame {
         msec: 128
-        hash: "429a7dd5a23a5012f1985bcddd27ba0c"
+        hash: "9f273323f48a70be279302b194203a36"
     }
     Frame {
         msec: 144
-        hash: "fbf845e137e0b389babdcd71a95c3060"
+        hash: "7de4bd5f82369953c2a4a990ddaf4339"
     }
     Frame {
         msec: 160
-        hash: "1d1272df3a53cb9860d23be3343a143e"
+        hash: "96c5f74c01723a15a57db161604bc245"
     }
     Frame {
         msec: 176
-        hash: "cef05f6564b21fd2cbd02f6def604c0b"
+        hash: "df2eac6300919044cfe2a2f591c3bd99"
     }
     Frame {
         msec: 192
-        hash: "be0ca54bc7aa23c2b9c56e3a0444197a"
+        hash: "a153904cdfa0be697a25bebc4ce1fbca"
     }
     Frame {
         msec: 208
-        hash: "5372a7052d10b8c6c2204efdc88c2f48"
+        hash: "de243731b92ac1cac05e194aed0acd1e"
     }
     Frame {
         msec: 224
-        hash: "43b775c558843c1334e86ca4fcf07ae2"
+        hash: "f6ccc0f127bfc6212885c3c6470639ed"
     }
     Frame {
         msec: 240
-        hash: "10daf71511454ef4db3692a19ecbcbaa"
+        hash: "a2d56227aebedb9590a1124e44fe8e84"
     }
     Frame {
         msec: 256
-        hash: "5c545ecb0ddfaa5d6cde266be6fae35c"
+        hash: "5f8c0a42a231580dcfff6a534e77bef8"
     }
     Frame {
         msec: 272
-        hash: "1a3c05b189c3adf87710eeb03296aec2"
+        hash: "e631663ac692ab097cb28095b45e8563"
     }
     Frame {
         msec: 288
-        hash: "de2c6f4d3bf4d245e45e47a743808f5d"
+        hash: "2a03f6ba3c67a9e9732cc1f5cdc42c23"
     }
     Frame {
         msec: 304
-        hash: "7c71dcbd8e2be19ac2d090ab3e012a62"
+        hash: "26b85080d624b232e5209aa082fc11b1"
     }
     Frame {
         msec: 320
-        hash: "3bd42257fe4a5d941a8755e66db94870"
+        hash: "1c027f4a0114bb9050a3a8d9de2b8a56"
     }
     Frame {
         msec: 336
-        hash: "d52f57a1f289d2c697fd1db2086a4df3"
+        hash: "788e6ad3cb5f6e120e40fd3dc6ac8483"
     }
     Frame {
         msec: 352
-        hash: "5d9e22ca6b6f8e4805a49fcf9c6a4dd6"
+        hash: "7e1b0fb71528dfa17a87950c0ff86111"
     }
     Frame {
         msec: 368
-        hash: "cbafada44b434ac7fe64fdebef7a816e"
+        hash: "e1878e6e8ba14d8945e1f71ac8d42c1e"
     }
     Frame {
         msec: 384
-        hash: "4ac900c005cfedb9e3367a4612334cc1"
+        hash: "556f42297eb1e57d6a8af0946651a75e"
     }
     Frame {
         msec: 400
-        hash: "3dbe30edac497ca316bf39e55ff9580a"
+        hash: "73df08e7e3391b339cea9f5f082fd83a"
     }
     Frame {
         msec: 416
-        hash: "e892891c063172d513f4f8c0a0b2644f"
+        hash: "de3bd8a12c2a448738ce77036b97bda7"
     }
     Frame {
         msec: 432
-        hash: "7c214a442c8f37d22f74343fdb7f7faa"
+        hash: "0ab187aa7a478dbf005f35416a93c456"
     }
     Frame {
         msec: 448
-        hash: "c4461c6c26eb9689e640149b7755bf14"
+        hash: "e5baf64ccafa6a4d2bf74aacf52019c6"
     }
     Frame {
         msec: 464
-        hash: "e7be611f007716a80698558d0600f5b6"
+        hash: "0ed2ee4a773ade712ef207549006aa7b"
     }
     Frame {
         msec: 480
-        hash: "5a3abaa7b36fcd7e2279318671597386"
+        hash: "b23dd49bdfe8fb155e2055262e6a1478"
     }
     Frame {
         msec: 496
-        hash: "2dba1fcba5bdce948fa56ffc02a7f80c"
+        hash: "871f82636a03d6fa8cbfb580038bd0b7"
     }
     Frame {
         msec: 512
-        hash: "55043bcce83e4f8899b1a692fe30fa67"
+        hash: "463cdc2cbde034d7d7a5061338b319c7"
     }
     Frame {
         msec: 528
-        hash: "f92df1fb28a7da39ed907dd2bc177ab8"
+        hash: "22ff8e25136877fd6f5dce1b01e65c08"
     }
     Frame {
         msec: 544
-        hash: "7dcf90cd5f81999359ed389c7050d934"
+        hash: "97d4e49622d877e9e1e0102786e1ee55"
     }
     Frame {
         msec: 560
-        hash: "021014366809103b76bd5d472c43b062"
+        hash: "ebf5304185abe4bc33be44c3df09a93a"
     }
     Frame {
         msec: 576
-        hash: "fff5b2c8d63083d132c0f106fad84fa1"
+        hash: "307887d9973e807c52b2143cdfe438ad"
     }
     Frame {
         msec: 592
-        hash: "ab3a6a6c646d31be97884484a6647330"
+        hash: "d89547539741f387fdd6aa80ef239fbd"
     }
     Frame {
         msec: 608
-        hash: "d46a168f89d94a32496b75ee5d3794e4"
+        hash: "b818215b4cdd6e811057f1a0f5eb1a5a"
     }
     Frame {
         msec: 624
-        hash: "f7b62e86595a4d2c7f5a2cd52e0938b9"
+        hash: "84f7e523c0f21236ff8aad1333470d11"
     }
     Frame {
         msec: 640
-        hash: "df95a29a101889c50537cfb1b027f9a6"
+        hash: "7f974663c7add6d10ebdd401794e087a"
     }
     Frame {
         msec: 656
-        hash: "4c6691ef37222260dce72868ae809d68"
+        hash: "4c824dc01e8fead2706608ca68293d11"
     }
     Frame {
         msec: 672
-        hash: "ad816534dcf446a1456894ff2b1afa33"
+        hash: "86b0f617eb3bfff944c3b670b3b51c71"
     }
     Frame {
         msec: 688
-        hash: "bfa9f9f833f38aedf766e061f3a18c48"
+        hash: "86c5660c22003099cc4121381c11de85"
     }
     Frame {
         msec: 704
-        hash: "f4a6786e9db58cf3fd3f3b896d3cf84f"
+        hash: "3c2bd08ea17aaa920949239f06b255cf"
     }
     Frame {
         msec: 720
-        hash: "e51e8b766e5d4a0f061dc6885fcf8eb3"
+        hash: "2380278cc065a3ac5355127d9873796c"
     }
     Frame {
         msec: 736
-        hash: "eab6d261429c36c4e37005f37b7823d5"
+        hash: "e5d8624e841476926b3e2a5ebca8c65f"
     }
     Frame {
         msec: 752
-        hash: "3cc5db209a98daef06127bae53b1929d"
+        hash: "eab70f5005a6b39e3ead6e4452df1a54"
     }
     Frame {
         msec: 768
-        hash: "230cd6e6ca18a921a21379dd85e24822"
+        hash: "46acef023d154bad3f91e0267996421b"
     }
     Frame {
         msec: 784
-        hash: "e3a877e8f01bf17fe6ea8b9fbb780f14"
+        hash: "26ba9f30a4bfd72c9b6dae2a25660ea9"
     }
     Frame {
         msec: 800
-        hash: "a19f504a81409dea775481f21f992ba6"
+        hash: "9fabdd5cf1190fb34bdc7834eba01cd3"
     }
     Frame {
         msec: 816
-        hash: "e77cc3ab14551638e704a1493189d5d1"
+        hash: "b1e7af47d4ee706374365fdd4b4d52be"
     }
     Frame {
         msec: 832
-        hash: "613bdf9d32358ab0db310ae1e2246d52"
+        hash: "86fa2e142e75d9d2a074a5376992f139"
     }
     Frame {
         msec: 848
-        hash: "d4fab0193f567cce4ad1e1cf6b156ce5"
+        hash: "a3dea2bf8f84743d35070e82ec585c9a"
     }
     Frame {
         msec: 864
-        hash: "03ce3083411d10b14ac0bb85b22bfbd1"
+        hash: "ab649fbbe0ca508812de9839d14b3f8c"
     }
     Frame {
         msec: 880
-        hash: "4be10fb14abf82705d8071cf75956ece"
+        hash: "08f8a334e121d4edb0ca1617353bfebc"
     }
     Frame {
         msec: 896
-        hash: "4c1f150fb5ba1194ad198eb32f705af6"
+        hash: "bb7997c1e18b90cfaad4c3e4ec44356e"
     }
     Frame {
         msec: 912
-        hash: "5ddfd98c8a49eefe08ae33d0c0ea52ff"
+        hash: "31a7e5d71c28eebfcd29e9ea4950ad17"
     }
     Frame {
         msec: 928
-        hash: "f2018d16f38e113c9477c19431e3d1e4"
+        hash: "2b759276e03c2884bff7ed863c032dfc"
     }
     Frame {
         msec: 944
-        hash: "9fe6406d65978dba74716f1ba02bdf76"
+        hash: "aa0868f006097a435c46368ea9e3ba36"
     }
     Frame {
         msec: 960
-        hash: "265d92edca113f465e624079c266b213"
+        hash: "6454753699c21589d2523a83da0aaa34"
     }
     Frame {
         msec: 976
@@ -250,54 +250,54 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "6beb60f7645be5f1d07449610b5e13b0"
+        hash: "ac26abff68fbc1cf89dc5efc4a714a04"
     }
     Frame {
         msec: 1008
-        hash: "55c34cb290732a1fa94b5037477fd882"
+        hash: "d3f9dc8cb653d996fb57652f85abcbc1"
     }
     Frame {
         msec: 1024
-        hash: "4d6ed8044e3ac5da61cf61f4d08c5a19"
+        hash: "002a94f067eef532f63b6ef916977c2c"
     }
     Frame {
         msec: 1040
-        hash: "83657cfa447060a01d5fbdb890ad3fb9"
+        hash: "f7935d01ee9b497034cc1d8f007a0fdf"
     }
     Frame {
         msec: 1056
-        hash: "b04b6cb7e5e464ecee15a2c9803a857f"
+        hash: "4a1bfdcc85e5444c1bd836399e86ee05"
     }
     Frame {
         msec: 1072
-        hash: "ea4f1707e49527f6cae0a3df1b75137b"
+        hash: "1b86514f3c85a8438ef183cc4772e997"
     }
     Frame {
         msec: 1088
-        hash: "ae4893aca919be2d89f1107185b5fe9a"
+        hash: "7bf4c1ca946288e9d1a7ad055d8cacaa"
     }
     Frame {
         msec: 1104
-        hash: "d991c469947a94ffcfb63716226fa912"
+        hash: "b3a00861967157786a80c80030d5495b"
     }
     Frame {
         msec: 1120
-        hash: "df63c1dba0399d1fe5e7b9c9c794b598"
+        hash: "b9c6195d3336d7519cc72b16e75d00f6"
     }
     Frame {
         msec: 1136
-        hash: "305d263f68b4ccd78bffccd887870f97"
+        hash: "6dba6d030a5ff6a92a57f0bdcf0fe781"
     }
     Frame {
         msec: 1152
-        hash: "f4d1f7245b519d623defdc12e76285d2"
+        hash: "cc97a2721f4339094819c8b7aec6d74c"
     }
     Frame {
         msec: 1168
-        hash: "5a47e6498ddf8a02cb1df7a3510bac37"
+        hash: "190f67abce51f58fdd1591651633d67e"
     }
     Frame {
         msec: 1184
-        hash: "358b9b6be7f8379815d8ee828eed3e43"
+        hash: "b255f75cfc4918663b8bd47c887cfb3c"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png
index 591c1ef..cfa61a9 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png
index dc90e0d..be676c0 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
index c787029..df2fe2f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png
index fdd64ac..76e5b9f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png
index 1286e54..bb65ade 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png
index 05dd690..060be22 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png
index eb74cc5..d373aef 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png
index 3aed06c..5dad108 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
index 2de4a10..6081aaf 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
@@ -110,23 +110,23 @@ VisualTest {
     }
     Frame {
         msec: 368
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 384
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 400
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 416
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 432
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Key {
         type: 7
@@ -138,27 +138,27 @@ VisualTest {
     }
     Frame {
         msec: 448
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 464
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 480
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 496
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 512
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 528
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Key {
         type: 7
@@ -170,43 +170,43 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 560
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 576
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 592
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 608
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 624
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 640
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 656
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 672
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Frame {
         msec: 688
-        hash: "bc06530170cf26690a09ed9f6c4014fd"
+        hash: "593867b082681c362d7dffda12615284"
     }
     Key {
         type: 6
@@ -218,23 +218,23 @@ VisualTest {
     }
     Frame {
         msec: 704
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 720
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 736
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 752
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 768
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Key {
         type: 7
@@ -246,23 +246,23 @@ VisualTest {
     }
     Frame {
         msec: 784
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 800
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 816
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 832
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Frame {
         msec: 848
-        hash: "8c64a986ce7bd19dcc88785309456f4e"
+        hash: "8d4a4baca932c318fba437b05962a635"
     }
     Key {
         type: 6
@@ -274,15 +274,15 @@ VisualTest {
     }
     Frame {
         msec: 864
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 880
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 896
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Key {
         type: 7
@@ -294,19 +294,19 @@ VisualTest {
     }
     Frame {
         msec: 912
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 928
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 944
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 960
-        hash: "4cfca8edcb96b1d9986db4ee491bf857"
+        hash: "b2698dba3a5ebe80e26f273b32857506"
     }
     Frame {
         msec: 976
@@ -322,19 +322,19 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1008
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1024
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1040
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Key {
         type: 7
@@ -346,51 +346,51 @@ VisualTest {
     }
     Frame {
         msec: 1056
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1072
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1088
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1104
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1120
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1136
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1152
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1168
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1184
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1200
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1216
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Frame {
         msec: 1232
-        hash: "3d25316ea23ace5a88dbe8765b743eb3"
+        hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
     }
     Key {
         type: 6
@@ -402,15 +402,15 @@ VisualTest {
     }
     Frame {
         msec: 1248
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Frame {
         msec: 1264
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Frame {
         msec: 1280
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Key {
         type: 7
@@ -422,15 +422,15 @@ VisualTest {
     }
     Frame {
         msec: 1296
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Frame {
         msec: 1312
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Frame {
         msec: 1328
-        hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+        hash: "a190bbf59ec807391077b9d1183f72b5"
     }
     Key {
         type: 6
@@ -442,39 +442,39 @@ VisualTest {
     }
     Frame {
         msec: 1344
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1360
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1376
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1392
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1408
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1424
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1440
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1456
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Frame {
         msec: 1472
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Key {
         type: 7
@@ -486,7 +486,7 @@ VisualTest {
     }
     Frame {
         msec: 1488
-        hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+        hash: "f171a98a3a726b517ad4b401a0720ba2"
     }
     Key {
         type: 6
@@ -498,19 +498,19 @@ VisualTest {
     }
     Frame {
         msec: 1504
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1520
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1536
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1552
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Key {
         type: 7
@@ -522,27 +522,27 @@ VisualTest {
     }
     Frame {
         msec: 1568
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1584
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1600
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1616
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1632
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Frame {
         msec: 1648
-        hash: "d874584748e4aa14fd71730aa36d676c"
+        hash: "e7199e4284be9dea34caff7bde0f6303"
     }
     Key {
         type: 6
@@ -554,23 +554,23 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "5eac6452c3c01de25633be412b2c9fd6"
+        hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
     }
     Frame {
         msec: 1680
-        hash: "5eac6452c3c01de25633be412b2c9fd6"
+        hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
     }
     Frame {
         msec: 1696
-        hash: "5eac6452c3c01de25633be412b2c9fd6"
+        hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
     }
     Frame {
         msec: 1712
-        hash: "5eac6452c3c01de25633be412b2c9fd6"
+        hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
     }
     Frame {
         msec: 1728
-        hash: "5eac6452c3c01de25633be412b2c9fd6"
+        hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
     }
     Key {
         type: 6
@@ -582,7 +582,7 @@ VisualTest {
     }
     Frame {
         msec: 1744
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Key {
         type: 7
@@ -594,15 +594,15 @@ VisualTest {
     }
     Frame {
         msec: 1760
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Frame {
         msec: 1776
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Frame {
         msec: 1792
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Key {
         type: 7
@@ -614,19 +614,19 @@ VisualTest {
     }
     Frame {
         msec: 1808
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Frame {
         msec: 1824
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Frame {
         msec: 1840
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Frame {
         msec: 1856
-        hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+        hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
     }
     Key {
         type: 6
@@ -638,19 +638,19 @@ VisualTest {
     }
     Frame {
         msec: 1872
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 1888
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 1904
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 1920
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Key {
         type: 7
@@ -666,23 +666,23 @@ VisualTest {
     }
     Frame {
         msec: 1952
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 1968
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 1984
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 2000
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Frame {
         msec: 2016
-        hash: "4a31bba56f9adaccf47e6335ed4e284f"
+        hash: "2af75935ad1d3be02c6481c094737575"
     }
     Key {
         type: 6
@@ -694,11 +694,11 @@ VisualTest {
     }
     Frame {
         msec: 2032
-        hash: "8bbabbbe84de490438d1111aa728c15f"
+        hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
     }
     Frame {
         msec: 2048
-        hash: "8bbabbbe84de490438d1111aa728c15f"
+        hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
     }
     Key {
         type: 7
@@ -710,11 +710,11 @@ VisualTest {
     }
     Frame {
         msec: 2064
-        hash: "8bbabbbe84de490438d1111aa728c15f"
+        hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
     }
     Frame {
         msec: 2080
-        hash: "8bbabbbe84de490438d1111aa728c15f"
+        hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
     }
     Key {
         type: 6
@@ -726,19 +726,19 @@ VisualTest {
     }
     Frame {
         msec: 2096
-        hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+        hash: "064e1fc885ab7f07dad1770361087bef"
     }
     Frame {
         msec: 2112
-        hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+        hash: "064e1fc885ab7f07dad1770361087bef"
     }
     Frame {
         msec: 2128
-        hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+        hash: "064e1fc885ab7f07dad1770361087bef"
     }
     Frame {
         msec: 2144
-        hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+        hash: "064e1fc885ab7f07dad1770361087bef"
     }
     Key {
         type: 6
@@ -758,19 +758,19 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "1593ef669fdff28c33f54c12c7e7424e"
+        hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
     }
     Frame {
         msec: 2176
-        hash: "1593ef669fdff28c33f54c12c7e7424e"
+        hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
     }
     Frame {
         msec: 2192
-        hash: "1593ef669fdff28c33f54c12c7e7424e"
+        hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
     }
     Frame {
         msec: 2208
-        hash: "1593ef669fdff28c33f54c12c7e7424e"
+        hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
     }
     Key {
         type: 6
@@ -782,7 +782,7 @@ VisualTest {
     }
     Frame {
         msec: 2224
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Key {
         type: 7
@@ -794,23 +794,23 @@ VisualTest {
     }
     Frame {
         msec: 2240
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Frame {
         msec: 2256
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Frame {
         msec: 2272
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Frame {
         msec: 2288
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Frame {
         msec: 2304
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Key {
         type: 7
@@ -822,11 +822,11 @@ VisualTest {
     }
     Frame {
         msec: 2320
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Frame {
         msec: 2336
-        hash: "da746581451954d7d941fbac825a1009"
+        hash: "18eff632e106f632aad481ab40f985d7"
     }
     Key {
         type: 6
@@ -838,27 +838,27 @@ VisualTest {
     }
     Frame {
         msec: 2352
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2368
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2384
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2400
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2416
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2432
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Key {
         type: 7
@@ -870,19 +870,19 @@ VisualTest {
     }
     Frame {
         msec: 2448
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2464
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2480
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Frame {
         msec: 2496
-        hash: "3e008b7ead8459c1667f4f385d4c5372"
+        hash: "eaabd4617081e3bc68a5b9099c63272a"
     }
     Key {
         type: 6
@@ -894,15 +894,15 @@ VisualTest {
     }
     Frame {
         msec: 2512
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2528
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2544
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Key {
         type: 7
@@ -914,87 +914,87 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2576
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2592
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2608
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2624
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2640
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2656
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2672
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2688
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2704
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2720
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2736
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2752
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2768
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2784
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2800
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2816
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2832
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2848
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2864
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2880
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2896
@@ -1002,42 +1002,42 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2928
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2944
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2960
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2976
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 2992
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 3008
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 3024
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 3040
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
     Frame {
         msec: 3056
-        hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+        hash: "fec019ea87914d30b5bf4754ce8ba916"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
index a1a0821..fc8a115 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
@@ -379,7 +379,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -583,7 +583,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -783,7 +783,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -1175,7 +1175,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -1823,7 +1823,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -2327,7 +2327,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
-- 
cgit v0.12


From ea814440efc8a4b956ba3a4cddd1f269f1734c96 Mon Sep 17 00:00:00 2001
From: Martin Petersson <martin.petersson@nokia.com>
Date: Thu, 25 Nov 2010 12:57:13 +0100
Subject: Fix QTBUG-13928 non flat mode for project files in VS2010.

Reviewed-by: Joerg
Task-number: QTBUG-13928
---
 qmake/generators/win32/msbuild_objectmodel.cpp | 31 ++++++++++++++++++++------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index c3436b4..3381d53 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -2908,26 +2908,43 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString
 
     if (children.size()) {
         // Filter
+        QString tempFilterName;
         ChildrenMap::ConstIterator it, end = children.constEnd();
         if (!tagName.isEmpty()) {
+            tempFilterName.append(filter);
+            tempFilterName.append("\\");
+            tempFilterName.append(tagName);
+            xmlFilter << tag(_ItemGroup);
             xmlFilter << tag("Filter")
-                      << attrTag("Include", tagName)
-                      << attrTagS("Extensions", "");
+                      << attrTag("Include", tempFilterName)
+                      << closetag();
+            xmlFilter << closetag();
         }
         // First round, do nested filters
         for (it = children.constBegin(); it != end; ++it)
             if ((*it)->children.size())
-                (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+            {
+                if ( !tempFilterName.isEmpty() )
+                    (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
+                else
+                    (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+            }
         // Second round, do leafs
         for (it = children.constBegin(); it != end; ++it)
             if (!(*it)->children.size())
-                (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
-
-        if (!tagName.isEmpty())
-            xml << closetag("Filter");
+            {
+                if ( !tempFilterName.isEmpty() )
+                    (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
+                else
+                    (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+            }
     } else {
         // Leaf
+        xml << tag(_ItemGroup);
+        xmlFilter << tag(_ItemGroup);        
         tool.outputFileConfigs(xml, xmlFilter, info, filter);
+        xmlFilter << closetag();
+        xml << closetag();
     }
 }
 
-- 
cgit v0.12


From a51a29e9f7b63fcefcdf9e9069e219726db1250e Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Thu, 25 Nov 2010 15:46:43 +0100
Subject: Fix possible artifacts under glyphs in texture glyph cache

We would disregard the first glyph in each line when calculating the
required height of the line in the glyph cache. If the first glyph
was taller than any of the other glyphs in the same line, the glyph
drawn underneath it in the cache could potentially overlap it, and
you would see it as dots or lines underneath the glyph in the output.

Task-number: QTBUG-14806
Reviewed-by: Jiang Jiang
---
 src/gui/painting/qtextureglyphcache.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index 2daa1f0..eab9cf6 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -143,7 +143,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
                 // no room on the current line, start new glyph strip
                 m_cx = 0;
                 m_cy += m_currentRowHeight + paddingDoubled;
-                m_currentRowHeight = 0; // New row
+                m_currentRowHeight = c.h + margin * 2; // New row
             }
         }
         if (m_cy + c.h > m_h) {
-- 
cgit v0.12