From 4912e1947c15a8694a89719989e5beb56fa7fed8 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 12 Nov 2009 10:55:34 +1000
Subject: Visual tests for positioners

dynamic.qml covers some of the more complex memory management issues,
one of which is also fixed in this commit.
---
 .../graphicsitems/qmlgraphicspositioners.cpp       |   28 +-
 .../qmlgraphicspositioners/data/dynamic.0.png      |  Bin 0 -> 1429 bytes
 .../qmlgraphicspositioners/data/dynamic.1.png      |  Bin 0 -> 1433 bytes
 .../qmlgraphicspositioners/data/dynamic.2.png      |  Bin 0 -> 1431 bytes
 .../qmlgraphicspositioners/data/dynamic.3.png      |  Bin 0 -> 1428 bytes
 .../qmlgraphicspositioners/data/dynamic.4.png      |  Bin 0 -> 1432 bytes
 .../qmlgraphicspositioners/data/dynamic.5.png      |  Bin 0 -> 1434 bytes
 .../visual/qmlgraphicspositioners/data/dynamic.qml | 1603 ++++++++++++++++++++
 .../qmlgraphicspositioners/data/repeater.0.png     |  Bin 0 -> 2790 bytes
 .../qmlgraphicspositioners/data/repeater.qml       |  339 +++++
 .../visual/qmlgraphicspositioners/dynamic.qml      |   65 +
 .../visual/qmlgraphicspositioners/repeater.qml     |   15 +
 12 files changed, 2033 insertions(+), 17 deletions(-)
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.0.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.1.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.2.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.3.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.4.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.5.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.qml
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.0.png
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.qml
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml
 create mode 100644 tests/auto/declarative/visual/qmlgraphicspositioners/repeater.qml

diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
index ced9d55..65e63eb 100644
--- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp
@@ -70,15 +70,18 @@ void QmlGraphicsBasePositionerPrivate::watchChanges(QmlGraphicsItem *other)
 void QmlGraphicsBasePositionerPrivate::unwatchChanges(QmlGraphicsItem* other)
 {
     Q_Q(QmlGraphicsBasePositioner);
-    QObject::disconnect(other, SIGNAL(visibleChanged()),
+    bool stillAlive = false; //Use the return from disconnect to see if it was deleted or just reparented
+    stillAlive |= QObject::disconnect(other, SIGNAL(visibleChanged()),
                      q, SLOT(prePositioning()));
-    QObject::disconnect(other, SIGNAL(opacityChanged()),
+    stillAlive |= QObject::disconnect(other, SIGNAL(opacityChanged()),
                      q, SLOT(prePositioning()));
-    QObject::disconnect(other, SIGNAL(heightChanged()),
+    stillAlive |= QObject::disconnect(other, SIGNAL(heightChanged()),
                      q, SLOT(prePositioning()));
-    QObject::disconnect(other, SIGNAL(widthChanged()),
+    stillAlive |= QObject::disconnect(other, SIGNAL(widthChanged()),
                      q, SLOT(prePositioning()));
-    static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other))->unregisterSiblingOrderNotification(this);
+    if(stillAlive)
+        static_cast<QmlGraphicsItemPrivate*>(QGraphicsItemPrivate::get(other))
+                ->unregisterSiblingOrderNotification(this);
     watched.removeAll(other);
 }
 
@@ -266,18 +269,9 @@ void QmlGraphicsBasePositioner::prePositioning()
         positionedItems << child;
     }
     QSet<QmlGraphicsItem *> deletedItems = d->_items - allItems;
-    foreach(QmlGraphicsItem *child, d->_items){
-        if (!allItems.contains(child)){
-            if (!deletedItems.contains(child)) {
-                QObject::disconnect(child, SIGNAL(opacityChanged()),
-                                 this, SLOT(prePositioning()));
-                QObject::disconnect(child, SIGNAL(heightChanged()),
-                                 this, SLOT(prePositioning()));
-                QObject::disconnect(child, SIGNAL(widthChanged()),
-                                 this, SLOT(prePositioning()));
-            }
-            d->_items -= child;
-        }
+    foreach(QmlGraphicsItem *child, deletedItems){
+        d->unwatchChanges(child);
+        d->_items -= child;
     }
     d->_animated.clear();
     doPositioning();
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.0.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.0.png
new file mode 100644
index 0000000..f474afe
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.0.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.1.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.1.png
new file mode 100644
index 0000000..8b7ae74
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.1.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.2.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.2.png
new file mode 100644
index 0000000..9088bb4
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.2.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.3.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.3.png
new file mode 100644
index 0000000..18cd429
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.3.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.4.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.4.png
new file mode 100644
index 0000000..739afc1
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.4.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.5.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.5.png
new file mode 100644
index 0000000..93f0682
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.5.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.qml b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.qml
new file mode 100644
index 0000000..7091bb3
--- /dev/null
+++ b/tests/auto/declarative/visual/qmlgraphicspositioners/data/dynamic.qml
@@ -0,0 +1,1603 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 32
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 48
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 64
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 80
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 96
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 112
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 128
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 144
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 160
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 176
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 192
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 208
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 224
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 240
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 256
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 272
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 288
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 304
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 320
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 336
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 352
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 368
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 384
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 400
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 416
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 432
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 448
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 464
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 480
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 496
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 512
+        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+    }
+    Frame {
+        msec: 528
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 544
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 560
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 576
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 592
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 608
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 624
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 640
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 656
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 672
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 688
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 704
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 720
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 736
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 752
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 768
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 784
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 800
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 816
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 832
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 848
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 864
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 880
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 896
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 912
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 928
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 944
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 960
+        image: "dynamic.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 992
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 1008
+        hash: "62727b1025930e19bb03c8f533a12ced"
+    }
+    Frame {
+        msec: 1024
+        hash: "3e52e7d7d428cf1b850cb9c60dbb3c21"
+    }
+    Frame {
+        msec: 1040
+        hash: "64f75ab14c979d33d6e0c0d86b76cd35"
+    }
+    Frame {
+        msec: 1056
+        hash: "c198a48f4050f176465649d203d6e09a"
+    }
+    Frame {
+        msec: 1072
+        hash: "6dd8cee5a585a96e78f2cf7478c4da62"
+    }
+    Frame {
+        msec: 1088
+        hash: "09edfbce2ea4b8a547f769ce709dcb6b"
+    }
+    Frame {
+        msec: 1104
+        hash: "e93d01aa6e4f5d3fc82cf5a008e3ea17"
+    }
+    Frame {
+        msec: 1120
+        hash: "0e2e7b5eec0e62853972b0139b8c17c6"
+    }
+    Frame {
+        msec: 1136
+        hash: "26d4f54628ce20f5665bdc6ddc7f3b6a"
+    }
+    Frame {
+        msec: 1152
+        hash: "59836aa6eff85b0152be352b97076d89"
+    }
+    Frame {
+        msec: 1168
+        hash: "47cc9894096731a52ca342ab04df9aad"
+    }
+    Frame {
+        msec: 1184
+        hash: "ec95dd3b34a0f17f6fb9b5bedab73653"
+    }
+    Frame {
+        msec: 1200
+        hash: "e32c2b70882828b5082ca3ec889a0dde"
+    }
+    Frame {
+        msec: 1216
+        hash: "68d3f8e9c9d5388a6f8360368c8f4d2f"
+    }
+    Frame {
+        msec: 1232
+        hash: "17378b2bd8bde7f357fa5463f457c7b2"
+    }
+    Frame {
+        msec: 1248
+        hash: "03db786cd54ec34ce8db15953a5fc847"
+    }
+    Frame {
+        msec: 1264
+        hash: "9e22a82a622ed0287c44cc629059d5bd"
+    }
+    Frame {
+        msec: 1280
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1296
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1312
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1328
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1344
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1360
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1376
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1392
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1408
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1424
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1440
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1456
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1472
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1488
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1504
+        hash: "42955cd23747f7c37d0f0229c0955e90"
+    }
+    Frame {
+        msec: 1520
+        hash: "981fb1ee75e307b548a32df08a86f4cd"
+    }
+    Frame {
+        msec: 1536
+        hash: "f77568307e93d8cd9f0ae417cc19d6e3"
+    }
+    Frame {
+        msec: 1552
+        hash: "3bdd4468e26aceee0dad6b3b97b1c1ea"
+    }
+    Frame {
+        msec: 1568
+        hash: "252c9ebc2c32755b2289ee1b03877fe3"
+    }
+    Frame {
+        msec: 1584
+        hash: "64169b7eb7b7ae8573556c5f80230965"
+    }
+    Frame {
+        msec: 1600
+        hash: "4965dfa709a9ac7d8f7dfb4bf8303c65"
+    }
+    Frame {
+        msec: 1616
+        hash: "8c53cf92510154087341ac65a93aae5a"
+    }
+    Frame {
+        msec: 1632
+        hash: "4dd7502e3e238743d2f3cf038270491e"
+    }
+    Frame {
+        msec: 1648
+        hash: "cd9a58316837eb92f4ac92dbd86bdba3"
+    }
+    Frame {
+        msec: 1664
+        hash: "5de043e3ac8696b59293a2fa60ed7e65"
+    }
+    Frame {
+        msec: 1680
+        hash: "1bf42a6f6be5a3468d2f47cccfac761e"
+    }
+    Frame {
+        msec: 1696
+        hash: "ca05510c1ad25e5d3b002603f4379a09"
+    }
+    Frame {
+        msec: 1712
+        hash: "f6904a918a6475f1965d74372e52a4b1"
+    }
+    Frame {
+        msec: 1728
+        hash: "9e2312ddfc1648b615288107a06c9f9c"
+    }
+    Frame {
+        msec: 1744
+        hash: "95c470273b1cb08d4d602efcce339554"
+    }
+    Frame {
+        msec: 1760
+        hash: "dade96f707d4a21885480e13b258b7e9"
+    }
+    Frame {
+        msec: 1776
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1792
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1808
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1824
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1840
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1856
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1872
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1888
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1904
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1920
+        image: "dynamic.1.png"
+    }
+    Frame {
+        msec: 1936
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1952
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1968
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 1984
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 2000
+        hash: "0bfbd46f1d4cf562253fb383776cb601"
+    }
+    Frame {
+        msec: 2016
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2032
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2048
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2064
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2080
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2096
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2112
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2128
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2144
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2160
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2176
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2192
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2208
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2224
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2240
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2256
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2272
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2288
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2304
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2320
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2336
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2352
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2368
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2384
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2400
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2416
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2432
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2448
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2464
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2480
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2496
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2512
+        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+    }
+    Frame {
+        msec: 2528
+        hash: "fabf4e535bc4cc17497939d2eeae4a2d"
+    }
+    Frame {
+        msec: 2544
+        hash: "a7981035f46869f5ae824d0c58b263b2"
+    }
+    Frame {
+        msec: 2560
+        hash: "86d8e369bdceb499b244f84ed9e80ba3"
+    }
+    Frame {
+        msec: 2576
+        hash: "e28a7dc7ea8690da75670b5a6e93a26b"
+    }
+    Frame {
+        msec: 2592
+        hash: "bf4e815360a67bd80732bd8812269b21"
+    }
+    Frame {
+        msec: 2608
+        hash: "a6f8c56cb93da8acc0c90e35596a60d4"
+    }
+    Frame {
+        msec: 2624
+        hash: "1e60656f0758605169e51b57bd03af36"
+    }
+    Frame {
+        msec: 2640
+        hash: "c069b26b9fae47e0104070d702ba9562"
+    }
+    Frame {
+        msec: 2656
+        hash: "457eb2ca1adff6cbb158afa140b2f20b"
+    }
+    Frame {
+        msec: 2672
+        hash: "4e5e750b0d94b6777aebff85d38225d9"
+    }
+    Frame {
+        msec: 2688
+        hash: "96d9840c2354a8786a8470309be97544"
+    }
+    Frame {
+        msec: 2704
+        hash: "ac7570cc7eeff1acd8c47f2d9328f8be"
+    }
+    Frame {
+        msec: 2720
+        hash: "887f937bb263c54f29659f27f2b7a3e3"
+    }
+    Frame {
+        msec: 2736
+        hash: "616371183c82b97f69a4c6e2367b8066"
+    }
+    Frame {
+        msec: 2752
+        hash: "36de8ffa9abe850fb681b37aea45ef8b"
+    }
+    Frame {
+        msec: 2768
+        hash: "0505101f0edaaf7ff17deeaaddc6bbf9"
+    }
+    Frame {
+        msec: 2784
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2800
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2816
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2832
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2848
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2864
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2880
+        image: "dynamic.2.png"
+    }
+    Frame {
+        msec: 2896
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2912
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2928
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2944
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2960
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2976
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 2992
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 3008
+        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+    }
+    Frame {
+        msec: 3024
+        hash: "99e4d853d64a381e8db27707b5ff2b25"
+    }
+    Frame {
+        msec: 3040
+        hash: "ab0e62aeffc0d57a5e1d63e6cf49b809"
+    }
+    Frame {
+        msec: 3056
+        hash: "4ab11bbf1fb6adb0eec8895f78a24a41"
+    }
+    Frame {
+        msec: 3072
+        hash: "634ff2ceb39a3f263a3362238a4ae252"
+    }
+    Frame {
+        msec: 3088
+        hash: "7f4856873dc23a02297b2497101de9b9"
+    }
+    Frame {
+        msec: 3104
+        hash: "bca3919e9d8e6dc5badd8090401dc934"
+    }
+    Frame {
+        msec: 3120
+        hash: "824bfe40c3657cfe1368563640e4cfce"
+    }
+    Frame {
+        msec: 3136
+        hash: "f831c1600f68bda139697c406ca70c5e"
+    }
+    Frame {
+        msec: 3152
+        hash: "f8102ca251a9ff46a8fe5a24cff0d2d6"
+    }
+    Frame {
+        msec: 3168
+        hash: "f33407ad684aa16efc6615d1cf6fa4b9"
+    }
+    Frame {
+        msec: 3184
+        hash: "a73d27f776a6ebfc90309b34421700e5"
+    }
+    Frame {
+        msec: 3200
+        hash: "ff2a4e2663fc50dfec35152f0e79f935"
+    }
+    Frame {
+        msec: 3216
+        hash: "4935f5f58f2672e9d240625151044bda"
+    }
+    Frame {
+        msec: 3232
+        hash: "f3ad5c203f621fe4d5d321c3c1880743"
+    }
+    Frame {
+        msec: 3248
+        hash: "d4fb7cd2e1f6a533dae65ddbb50da8ac"
+    }
+    Frame {
+        msec: 3264
+        hash: "91705e9234c4f02d0a730f6270f9e95f"
+    }
+    Frame {
+        msec: 3280
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3296
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3312
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3328
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3344
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3360
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3376
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3392
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3408
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3424
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3440
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3456
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3472
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3488
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3504
+        hash: "41e177bec783497b996d6d5f6dac1a15"
+    }
+    Frame {
+        msec: 3520
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3536
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3552
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3568
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3584
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3600
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3616
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3632
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3648
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3664
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3680
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3696
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3712
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3728
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3744
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3760
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3776
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3792
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3808
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3824
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3840
+        image: "dynamic.3.png"
+    }
+    Frame {
+        msec: 3856
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3872
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3888
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3904
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3920
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3936
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3952
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3968
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 3984
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4000
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4016
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4032
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4048
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4064
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4080
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4096
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4112
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4128
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4144
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4160
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4176
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4192
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4208
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4224
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4240
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4256
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4272
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4288
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4304
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4320
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4336
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4352
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4368
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4384
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4400
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4416
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4432
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4448
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4464
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4480
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4496
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4512
+        hash: "496dc6261695bcf04a8e574146544e98"
+    }
+    Frame {
+        msec: 4528
+        hash: "9681be99003f8a14cc5654d06d2c8255"
+    }
+    Frame {
+        msec: 4544
+        hash: "bcb592a2335aa2e35956881fd028f4e6"
+    }
+    Frame {
+        msec: 4560
+        hash: "f914b25fdcb02a02b71220d82b7b2a75"
+    }
+    Frame {
+        msec: 4576
+        hash: "63c82c08eb7f2bd50b54b94c952df3f2"
+    }
+    Frame {
+        msec: 4592
+        hash: "8a8dc82be81fa55605c6c2e749895120"
+    }
+    Frame {
+        msec: 4608
+        hash: "271f8d79b8052dfcd840ffa9ba9ffeec"
+    }
+    Frame {
+        msec: 4624
+        hash: "8f77bbd0585b57e69ac1919bd81ee3b1"
+    }
+    Frame {
+        msec: 4640
+        hash: "b974260a2f90e141ebc33ced98fbca88"
+    }
+    Frame {
+        msec: 4656
+        hash: "77ada180f8a45652a6fa636d7ece4d9d"
+    }
+    Frame {
+        msec: 4672
+        hash: "4c8dc2e33cd989cb3b0938c6c75b5f95"
+    }
+    Frame {
+        msec: 4688
+        hash: "a145954989508b925a444e14f0c27a20"
+    }
+    Frame {
+        msec: 4704
+        hash: "8d27ff203819174747ae4a5cee8d0ae8"
+    }
+    Frame {
+        msec: 4720
+        hash: "830f34b0dab780c6efe2294872ba8508"
+    }
+    Frame {
+        msec: 4736
+        hash: "5d70a4bbd815569cfe5735b596bad080"
+    }
+    Frame {
+        msec: 4752
+        hash: "964527bb82ea006e03b030c787a8597c"
+    }
+    Frame {
+        msec: 4768
+        hash: "1ad54954b818fa9e6032ac4b6114e7db"
+    }
+    Frame {
+        msec: 4784
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4800
+        image: "dynamic.4.png"
+    }
+    Frame {
+        msec: 4816
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4832
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4848
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4864
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4880
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4896
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4912
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4928
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4944
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4960
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4976
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 4992
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 5008
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 5024
+        hash: "47865243cc252aef67774001af70c54c"
+    }
+    Frame {
+        msec: 5040
+        hash: "baeb8adffc13e230e797e0437f2ad5fa"
+    }
+    Frame {
+        msec: 5056
+        hash: "d2e440fcad0ee2b7b35d7e5c4e581f73"
+    }
+    Frame {
+        msec: 5072
+        hash: "fb8acb2f69234d3ee089281d0297ad7c"
+    }
+    Frame {
+        msec: 5088
+        hash: "7fda29a83dc535ed8d6b35e999400311"
+    }
+    Frame {
+        msec: 5104
+        hash: "6482e3eb10cfdbdeb57dd38ba3e3d67e"
+    }
+    Frame {
+        msec: 5120
+        hash: "4d222549bc2565c1598a532460aae4e6"
+    }
+    Frame {
+        msec: 5136
+        hash: "776d1b0f9945c0e1ceda0cf117264919"
+    }
+    Frame {
+        msec: 5152
+        hash: "f2c362b34a0982ee1a11dea6b063945e"
+    }
+    Frame {
+        msec: 5168
+        hash: "115f02b8893972b5b1d63525ce70762e"
+    }
+    Frame {
+        msec: 5184
+        hash: "7f2d53581fe2c6c45a628fa4cd9b5742"
+    }
+    Frame {
+        msec: 5200
+        hash: "b5ed1120c4edf842b15d5144adbd93b0"
+    }
+    Frame {
+        msec: 5216
+        hash: "3511938df57c4cdce316692de204b057"
+    }
+    Frame {
+        msec: 5232
+        hash: "99583918d068ab5d132fe7a699c2a7a6"
+    }
+    Frame {
+        msec: 5248
+        hash: "c0ce9df18479dbb57fb1dbc777f4f0e5"
+    }
+    Frame {
+        msec: 5264
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5280
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5296
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5312
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5328
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5344
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5360
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5376
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5392
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5408
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5424
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5440
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5456
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5472
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5488
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5504
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5520
+        hash: "b24db7b5c406328380fcf9927fb26c5c"
+    }
+    Frame {
+        msec: 5536
+        hash: "98cc64411264d8a635a6afe6b11cee6e"
+    }
+    Frame {
+        msec: 5552
+        hash: "b86434b7af8ad1db946c43a2791d69ab"
+    }
+    Frame {
+        msec: 5568
+        hash: "f45616f9e33658d1dddb537e842c8768"
+    }
+    Frame {
+        msec: 5584
+        hash: "e49d8955e27cdc19a37c331e56c81af1"
+    }
+    Frame {
+        msec: 5600
+        hash: "b2dbe764906b50195f65dc11a5842515"
+    }
+    Frame {
+        msec: 5616
+        hash: "71ce7c63d65c29cdffd83f5ae07f0b93"
+    }
+    Frame {
+        msec: 5632
+        hash: "901d01e1fc777ec185cd023ad0ace4c1"
+    }
+    Frame {
+        msec: 5648
+        hash: "a3f31de30fc2e92bae1f735504216216"
+    }
+    Frame {
+        msec: 5664
+        hash: "0fc52dd8102506e3e7671fa548551b23"
+    }
+    Frame {
+        msec: 5680
+        hash: "fb92809e728416035dbb91116ad8fe0e"
+    }
+    Frame {
+        msec: 5696
+        hash: "9003dc8ca4f781909035cb03dc45864f"
+    }
+    Frame {
+        msec: 5712
+        hash: "2bff1de793ad8521fd54413849c3cf29"
+    }
+    Frame {
+        msec: 5728
+        hash: "8362e4db7c4446282d844a4fc6632d19"
+    }
+    Frame {
+        msec: 5744
+        hash: "b874fa274c6ec77c106ff4a0288f9169"
+    }
+    Frame {
+        msec: 5760
+        image: "dynamic.5.png"
+    }
+    Frame {
+        msec: 5776
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5792
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5808
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5824
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5840
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5856
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5872
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5888
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5904
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5920
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5936
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5952
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5968
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 5984
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 6000
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 6016
+        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+    }
+    Frame {
+        msec: 6032
+        hash: "7621e64568058b82bcb6f6b46cee3ebc"
+    }
+    Frame {
+        msec: 6048
+        hash: "f77f6de6fc88813f49427b4888a59dbf"
+    }
+    Frame {
+        msec: 6064
+        hash: "d3a48f596219372ac25941e4c5ec5b2b"
+    }
+    Frame {
+        msec: 6080
+        hash: "d572d932b613f9ca1e0acf144f127dd1"
+    }
+    Frame {
+        msec: 6096
+        hash: "edf317eaf51d933bcd0f57f214921a81"
+    }
+    Frame {
+        msec: 6112
+        hash: "e0cee7959a5a8a08ad03d75e7b5c6ca1"
+    }
+    Frame {
+        msec: 6128
+        hash: "96877a15f44d4a2c8d9974cb28b9e1b6"
+    }
+    Frame {
+        msec: 6144
+        hash: "c0ffb0ef6dd9d007d201feebd2f68e44"
+    }
+    Frame {
+        msec: 6160
+        hash: "209fb930223243fa19c5dde9e85ec518"
+    }
+    Frame {
+        msec: 6176
+        hash: "ae98ac4dba0e78eb8fb7f7dbe29b2832"
+    }
+    Frame {
+        msec: 6192
+        hash: "c94a7d68ce007d83df77a595a5815a96"
+    }
+    Frame {
+        msec: 6208
+        hash: "4c28e409bf5a6c1289bcab8cd59a9e42"
+    }
+    Frame {
+        msec: 6224
+        hash: "ea1009f1a3446dd5ce937e6949794794"
+    }
+    Frame {
+        msec: 6240
+        hash: "940c16766c2f87feef48e1187672ca9b"
+    }
+    Frame {
+        msec: 6256
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6272
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6288
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6304
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6320
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6336
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6352
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6368
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+    Frame {
+        msec: 6384
+        hash: "93664c87c8dcfadc0345f646b2508625"
+    }
+}
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.0.png b/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.0.png
new file mode 100644
index 0000000..f7018fd
Binary files /dev/null and b/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.0.png differ
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.qml b/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.qml
new file mode 100644
index 0000000..1eb115d
--- /dev/null
+++ b/tests/auto/declarative/visual/qmlgraphicspositioners/data/repeater.qml
@@ -0,0 +1,339 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 32
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 48
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 64
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 80
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 96
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 112
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 128
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 144
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 160
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 176
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 192
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 208
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 224
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 240
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 256
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 272
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 288
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 304
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 320
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 336
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 352
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 368
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 384
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 400
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 416
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 432
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 448
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 464
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 480
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 496
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 512
+        hash: "0273c293855f2b2bdbf579fc5cdce63f"
+    }
+    Frame {
+        msec: 528
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 544
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 560
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 576
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 592
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 608
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 624
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 640
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 656
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 672
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 688
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 704
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 720
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 736
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 752
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 768
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 784
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 800
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 816
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 832
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 848
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 864
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 880
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 896
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 912
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 928
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 944
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 960
+        image: "repeater.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 992
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1008
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1024
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1040
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1056
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1072
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1088
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1104
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1120
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1136
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1152
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1168
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1184
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1200
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1216
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1232
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1248
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1264
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1280
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1296
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1312
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+    Frame {
+        msec: 1328
+        hash: "53a01771047c8ec806a335a1a3d6af71"
+    }
+}
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml b/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml
new file mode 100644
index 0000000..4b03749
--- /dev/null
+++ b/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml
@@ -0,0 +1,65 @@
+import Qt 4.6
+
+Item {
+    width: 400; height: 400;
+    property int step: 0
+    function tick()
+    {
+        step++;
+        if(step == 1){
+            row1.destroy(); //Not dynamically created, so is this valid?
+        }else if(step == 2){
+            r2a.destroy();
+        }else if(step == 3){
+            r2b.destroy();
+        }else if(step == 4){
+            r2c.destroy();
+        }else if(step == 5){
+            r3a.parent = row2;
+        }else if(step == 6){
+            r3b.parent = row2;
+        }else if(step == 7){
+            r3c.parent = row2;
+        }else if(step == 8){
+            row3.destroy();
+        }else{
+            repeater.model++;
+        }
+    }
+
+    //Tests base positioner functionality, so just using row
+    Row{
+        id: row1
+        Rectangle{id: r1a; width:20; height:20; color: "red"}
+        Rectangle{id: r1b; width:20; height:20; color: "green"}
+        Rectangle{id: r1c; width:20; height:20; color: "blue"}
+    }
+    Row{
+        y:20
+        id: row2
+        move: Transition{NumberAnimation{matchProperties:"x"}}
+        Repeater{ 
+            id: repeater 
+            model: 0; 
+            delegate: Component{ Rectangle { color: "yellow"; width:20; height:20;}}
+        }
+        Rectangle{id: r2a; width:20; height:20; color: "red"}
+        Rectangle{id: r2b; width:20; height:20; color: "green"}
+        Rectangle{id: r2c; width:20; height:20; color: "blue"}
+    }
+    Row{
+        move: Transition{NumberAnimation{matchProperties:"x"}}
+        y:40
+        id: row3
+        Rectangle{id: r3a; width:20; height:20; color: "red"}
+        Rectangle{id: r3b; width:20; height:20; color: "green"}
+        Rectangle{id: r3c; width:20; height:20; color: "blue"}
+    }
+    Timer{
+        interval: 500;
+        running: true;
+        repeat: true;
+        onTriggered: tick();
+    }
+}
+
diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/repeater.qml b/tests/auto/declarative/visual/qmlgraphicspositioners/repeater.qml
new file mode 100644
index 0000000..ff60365
--- /dev/null
+++ b/tests/auto/declarative/visual/qmlgraphicspositioners/repeater.qml
@@ -0,0 +1,15 @@
+import Qt 4.6
+
+Item{
+    width: 200; height: 600
+    Column{
+        Rectangle{color:"Red"; width:40; height:40;}
+        Repeater{
+            id: rep
+            model: 3
+            delegate: Component{Rectangle{color:"Green"; width:40; height:40; radius: 20;}}
+        }
+        Rectangle{color:"Blue"; width:40; height:40;}
+    }
+    Timer{ interval: 500; running: true; onTriggered: rep.model=6;}
+}
-- 
cgit v0.12