Commit Graph

30737 Commits

Author SHA1 Message Date
Ulf Hermann ee2154dbfe QmlCompiler: Generate trace info for ConvertThisToObject
Change-Id: I021b8bea01cfcccd062b7e23d265208ae6b3e490
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-09 21:28:06 +02:00
Ulf Hermann 7e19885399 QQuickItem: Do not synthesize replace() for data/resources/children
Those properties are not actually sequential containers. They have some
internal logic that refuses certain operations and changes the semantics
of others. We should not run things like splice() on them.

We can natively implement removeLast(), though.

Pick-to: 6.5
Fixes: QTBUG-112949
Change-Id: Ic9fa84f98a68428df9e958ba7fc72b0987e8601f
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-09 21:28:06 +02:00
Mitch Curtis da863fad2f Fix duplicate data tag warning in tst_tumbler.qml
When the count property was added it wasn't added to the tag.

Amends 4dc0c0d4fa.

Pick-to: 6.2 6.5
Change-Id: Ice7714621cafde1a185b22a6968120eb5194d7f0
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-10 03:28:06 +08:00
Kai Köhne 33422388dc Add Local storage example to IO category
Pick-to: 6.5
Task-number: QTBUG-112372
Change-Id: Ic69a7653bef314625deb7ec2b54688fa7729de63
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2023-05-09 21:28:06 +02:00
Mitch Curtis 5da4d5e808 Material: fix clipped floating placeholder text
The changes to placeholder text in
20e3d1b522 and
5704741a40 result in floating placeholder
text (i.e. the text shown at the top of the control when it has active
focus) being clipped when e.g. in a ScrollView.

This is probably only an issue for TextArea in practice, since you
wouldn't usually put a TextField in a ScrollView, but you can still run
into it if you clip it.

We don't want to unconditionally set topInset by default, because, as
mentioned above, these controls are not always clipped. In most cases
they are used on their own, and this issue won't affect them.
Unconditionally setting topInset would ruin the layout of existing UIs.
So, we set topInset only if the control itself clips (or its Flickable
parent in the case of TextArea).

[ChangeLog][Controls][Material] The outlined TextArea now sets topInset
by default if it or its Flickable parent clips. This avoids the
floating placeholder being clipped in those cases. The outlined
TextField sets topInset by default only if the TextField itself clips.

Fixes: QTBUG-113321
Pick-to: 6.5
Change-Id: I8555e4fc0c7a9800f76b54a84d94f4d04691bc23
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
2023-05-09 13:23:11 +08:00
Volker Hilsheimer 045d2259f8 Doc: make grabToImage example snippet more useful
The example doesn't work as is (when run with the qml binary) because
by the time Component.onCompleted is called, there might not be a window
yet.

Use a key press handler instead (which then needs focus to be set).

Fixes: QTBUG-113312
Change-Id: I2986334aca4ca670e206ceadf1093a87aa304e8e
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
2023-05-09 07:23:09 +02:00
Ulf Hermann c6aa66b163 qml: Straighten out configuration QML module
Use qt_add_qml_module correctly, apply a standard resource path, and
move the files into the same directory as the module. Use upper case
file names for the (re-usable) container definitions and lower case file
names for the configuration entry points. This way we only need one
directory and therefore only one QML module.

Change-Id: Ic45dd0e8866f8f62bbaa639b6f138e9a75e05863
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2023-05-08 17:10:01 +02:00
Jøger Hansegård bd6284d42d Silence signed vs unsigned warning on 32 bit VS 2022 debug build
The warning C4018: '<': signed/unsigned mismatch appears in a Q_ASSERT
when checking a lookup index against the size of the container.

Fixed by changing from unsigned to signed type for the index. Since the
index is already implicitly converted to signed type when used, we can
use a signed type from the start. We rely on implicit conversion from
unsigned instead of static_cast to not hide other warnings in the
future.

Change-Id: I2b1983bdd40104e2c7135eec849a198ac074517c
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2023-05-07 19:05:46 +02:00
Ulf Hermann ef6e9f6b75 QQmlComponent: Remove pending bindings when setting properties
Pick-to: 6.2 6.5
Fixes: QTBUG-99363
Change-Id: I2c731ec0b8c5947192accdeb5ef52903d9c7cd90
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-06 08:21:16 +02:00
Ulf Hermann 567130e2d0 QML: Don't crash when monitoring binding removal
There are more bindings kinds around.

Fixes: QTBUG-113353
Change-Id: If545f56bd61c238431883be3eb013841d96b18bb
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-05 22:24:52 +02:00
Ulf Hermann 30cf4b2b57 QmlCompiler: Fix operator== of VirtualRegister
This should not happen, but let's better be safe than sorry.

Amends commit 4634b6bf54.

Change-Id: I0bac55e8ce4518b2d90f19ea28d58ed629659778
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
2023-05-05 22:24:52 +02:00
David Edmundson aec61932ae Quick: Update documentation of TapHandler to reflect renamed enum
PointerDevice.GenericPointer was the enum value in Qt5, but in Qt6 this
changed to PointerDevice.Generic

Pick-to: 6.2 6.5
Change-Id: Ic5e4a5fe5fd91f7478d00e0d2c643b99eaa7ab14
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2023-05-05 20:24:52 +00:00
Semih Yavuz feca8417f6 qmldom: Add more literals
Dom construction fails before this commit if it encounters one of
null expression, true and false literals. Add dom representation for
them.

Change-Id: I2dbb2ebfce83b32426eb5e159fe9e4f0f68c56c3
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-05 19:56:42 +02:00
Fabian Kosmale d32ccc5f1b Remove conanfile.py
The conan experiment has ended, and the file is only bitrotting
nowadays.

Change-Id: Ida60a3f4e658734520f8cc92ef870622896188f6
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-05-05 14:31:38 +02:00
Friedemann Kleint 442d8cc02e Fix small errors in the C++ integration tutorials
Fix spelling and remove QGraphicsItem::ItemHasNoContents reference.

Pick-to: 6.5
Task-number: QTBUG-111033
Change-Id: I9564fa1bb4eb1af786078d1909a3ad8268dfe290
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-05 09:54:29 +02:00
Mitch Curtis 4a7d15c74b Material: don't set all caps for Button text
The guidelines have changed since Material 2, and they now recommend
to use sentence case:

https://m3.material.io/components/buttons/guidelines

Amends f47f8d6931.

Pick-to: 6.5 6.5.1
Change-Id: I055f4acc9c1e594b5c87818bcce5abd774b01d04
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
2023-05-05 13:32:52 +08:00
Ulf Hermann 96ac9c2599 QmlCompiler: Convert thisObject to correct type
Amends commit 365b781599.

Change-Id: I5775d634ef4e5204cdec2f440b1992b7272866d2
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-04 18:59:34 +02:00
Ulf Hermann 80ed6679cd QmlCompiler: Recognize QList<QObject*> as QObjectList
Since QObjectList is a builtin, we can use it.

Pick-to: 6.5
Fixes: QTBUG-112529
Change-Id: I73c59d575092d5cccf28eecb5baaf2fd1e25c76a
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-04 18:59:34 +02:00
Semih Yavuz 1700675731 tst_qmldomitem: Add more tests
Add test for null statements inside blocks. Also, add tests for const and
var variable declarations.

Change-Id: I7eacb74a848e3ee7a4c0b2053de72c902330ce2b
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-05-04 18:59:34 +02:00
Fabian Kosmale af618915b1 qmllint: Do not crash on invalid alias
We handle already multiple invalid alias constructs, but the case where
the alias is illegal without being an expression was not handled so far.

Pick-to: 6.5
Change-Id: If85bc4b61f645a8f1eff3afa4da394c7373d8d53
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
2023-05-04 16:44:44 +02:00
Ulf Hermann 4634b6bf54 QmlCompiler: Disallow reading from values affected by side effects
Instead of accepting the inconsistency between interpreter and compiled
code here, we can just detect whether a value can be affected by side
effects and refrain from reading it then. Since you can always
explicitly reload a value that may have been changed, the resulting
compile warnings are easily worked around in user code. Refactoring user
code this way also makes it much clearer what is actually going on.

Pick-to: 6.5
Task-number: QTBUG-109221
Change-Id: Ica832e39838ef732b0d181364630737fd7709b74
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-04 16:44:44 +02:00
Olivier De Cannière 8fab8cf39c Examples: Add equality an operator to Extending Qml Advanced tutorials
This allows for more meaningful checks for identical assignment in
Person::setShoe().

Amends: 405bd42998

Pick-to: 6.5
Change-Id: Id731f3f9163fb311ff9b04e2bbf4786a3022a11b
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
2023-05-04 14:01:25 +02:00
Olivier De Cannière b153740606 QmlDom: Remove the standalone version of QmlDom
Change-Id: I2582f3ca0217ec9791ead71393cfa506c28086b8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-05-04 14:01:25 +02:00
Fabian Kosmale 757f50166b Runtime codegen: Avoid memset for zeroing
We can just use calloc and zero-initialization.

Change-Id: I88dc79d5b880253655159ae3b4385b9792a18ec6
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2023-05-04 14:01:25 +02:00
Sami Shalayel 743368d27f qmlls: move common module code to base class
Move boilerplate code that is duplicated (or will be duplicated when
the find usages module will be added in a later commit) into the
qqmlbasemodule and BaseRequest class.
Also rename the BaseRequest members to start with "m_".

Task-number: QTBUG-100084
Task-number: QTBUG-111415
Change-Id: I69ce175a9438feb599c23f13803a673c460c5f3f
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2023-05-04 11:48:09 +02:00
Ulf Hermann 6c0b98f61a tst_qmlcppcodegen: Sort methods alphabetically
This way we won't get so many merge conflicts.

Change-Id: I2630838d4d310141a6a427a6494c87cb73f79063
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-04 11:48:09 +02:00
Ulf Hermann 44ca1085d6 QML: Fix call frame conversion for QVariant return types
The function may return a QVariant in place of the actual type because
it cannot express the actual type as-is. This case needs special care
because QMetaType::convert() doesn't know what to do with it.

Pick-to: 6.5
Fixes: QTBUG-112837
Change-Id: Ibf93a28aa6a60d49c5ab63fa7eed5f5a8e58e163
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-04 11:48:09 +02:00
Ulf Hermann b8814dfb36 QmlCompiler: Do not crash when converting number literals to enums
Amends commit 2a21efb5f7.

Change-Id: Id7d739b58c723eed9f165951b51ee2e5e55d7fe2
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
2023-05-04 11:48:09 +02:00
Sami Shalayel 9a0fe2eddb qmlls: Do not return relative paths to clients for go-to-type-definition
Make sure that there is a file:// in the URI returned to the clients, as
else the path will be interpreted as being relative (which it is not).

Task-number: QTBUG-113336
Change-Id: I4cc781aaf4514759cfb21f949dd8cc12eb93421a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-05-04 09:38:14 +02:00
Sami Shalayel 5eb97a1810 FileLocations::Tree: rename treePtr and fileLocationsPtr
Rename and add documentation to FileLocations::Tree::treePtr and
FileLocations::Tree::fileLocationsPtr.

Also remove a helper method in QQmlLSUtils that did exactly the same as
treePtr.

Both static methods allow to obtain information about the location of
some DomItem in the source code.

treePtr() is now called treeOf() and fileLocationsPtr() is
fileLocationsOf().

Change-Id: Ia6c92f7576b36727ce2fb72b729a4730b5250c3d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2023-05-04 09:38:14 +02:00
Eirik Aavitsland 3c52c5a92e Baseline scenegraph test: support the -keeprunning argument
Change-Id: Id0aa83ce27cda84956a10df18e06a5587432eff1
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
2023-05-04 07:31:13 +02:00
Ulf Hermann 1abfb04fae QmlCompiler: Do not stop parsing on top-level Component elements
This just creates an inconsistent state where some of the document has
been parsed and some hasn't. The only thing we actually need is the log
message. Also, fix the warning message.

Amends commit 169f0f7166.

Pick-to: 6.5
Fixes: QTBUG-112897
Change-Id: Ie8486909f9bea9ee1b87f2857f7b77fb7cc561e8
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
2023-05-03 14:38:52 +02:00
Semih Yavuz c17226bf98 tst_qmldomitem: Refactor scriptExpressions test
Divide scriptExpressions test into smaller testable units

Change-Id: Ib8a3b58e43bfe9a22ae72f35600f67bef163d855
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
2023-05-03 10:59:08 +02:00
Mitch Curtis 7e745bbba2 Doc: explain how to handle currentIndex changes in TabBar and SwipeView
Add a snippet and link to property change signal handlers to explain
the concept, since that page is hard to find unless you know where to
look.

Pick-to: 6.5
Change-Id: Id4019076d55199a9cafe4acdced1a7efc64bb3f2
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
2023-05-03 10:08:51 +08:00
Mitch Curtis 4ab11d03ac Material: fix placeholder text alignment
The placeholder text should always be aligned to the left
according to my tests on native Android via an emulator.

Fixes: QTBUG-113172
Pick-to: 6.5 6.5.1
Change-Id: I75ae31e1e6b9846d90ab5034c43f8684698e0ab7
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
2023-05-03 08:06:05 +08:00
Ulf Hermann 25b259270d tst_qmlcppcodegen: Sort QML files again
Keeping them sorted reduces the chance of collisions and makes it easier
to find related ones.

Change-Id: Ie05cbfefa5805cd27ec91e566dd922107c70d8e2
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 19:29:25 +02:00
Ulf Hermann 46cc70e2aa QmlCompiler: Relax shadowing check
If we detect a property or method as potentially shadowed, we don't have
to abandon all hope. We can still retrieve it as untyped var. Since
there are a number of things we can do with untyped var, this may still
be useful.

In the same sense, we need to treat function calls as untyped when the
function in question can be shadowed. Calling functions with var
arguments and return types leads to some more interesting situations in
the call frame setup, so we fix that, too.

Task-number: QTBUG-112480
Change-Id: I238d1cf04951f390c73e14ed9e299f2aa72b68cb
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 19:29:25 +02:00
Safiyyah Moosa 961d11e55f Docs: Fix "Can't link to" example warnings
Task-number: QTBUG-113160
Pick-to: 6.5
Change-Id: I49de891c36d778df5d2727f2f0703d534421e2d5
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
2023-05-02 19:29:25 +02:00
Semih Yavuz befaf0cd69 qmlls: Remove leftover method
Change-Id: Ia88f508bbec868497cc72c4ba5b5d81b75e46555
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 19:29:25 +02:00
Marc Mutz f961f5e221 Use new rvalue overload of QMetaProperty::writeOnGadget()
The new overload avoids the unconditional deep copy inside
QMetaProperty::write()'s lvalue overload.

Task-number: QTBUG-112762
Change-Id: Ic224faf72288e73bb6ad9049f1e0dc585e04ca19
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 17:16:07 +02:00
Doris Verria f6fb9252c6 RangeSlider: Don't update position only if mouse/touch is grabbed
A mouseClick will cause the RangeSlider handle to move to the click
position and we should expect the same for a touch press.

We update the position of the handle in handleRelease if keepMouse/
TouchGrab is set to true. However, we don't grab the touch on a
touch press in case eg.: a flickable wants to steal the event.
So we can remove the check as we shouldn't update the position
only if grabbed. This makes the behavior similar to the slider
too.

Fixes: QTBUG-112945
Pick-to: 6.5 6.2 5.15
Change-Id: Id2cf99416a52b5e42989a4adda1532e3ac550a93
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
2023-05-02 10:12:35 +00:00
Mårten Nordheim 6f06068db8 Drop extra resizing of upload pools
It already happens as part of Renderer::map. So, if we set size = 0
before we call uploadBatch then it will implicitly set the size needed.
One of the loops was also grabbing the sizes before the final size
was determined.

Pick-to: 6.5
Change-Id: I610d9850a66011c3d17eea131c063c42fe149962
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
2023-05-02 10:12:35 +00:00
Mårten Nordheim e061d654ea Really release pool resources in Renderer::releaseCachedResources
resize(0) only sets the size and doesn't deallocate anything.
Conversely, shrink(0), which was used before it was changed
to resize(0) doesn't change the size and only deallocates.
Use a mix of both for now.

Pick-to: 6.5
Change-Id: I3e36a766ef7483158a5a300351b0d7864d24e184
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
2023-05-02 10:12:35 +00:00
Kai Köhne 2e6403f8bf Examples: Use versioned CMake targets for Qt modules
Use e.g. Qt6::Core instead of Qt::Core. This is better matching the
find_package(Qt6 ...) call, and also avoids issues that the versionless
targets have.

Pick-to: 6.5
Task-number: QTBUG-113277
Change-Id: Ib80f885e9f73fb9ad54b9e9b22cae2318877dc07
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-05-02 12:12:35 +02:00
Olivier De Cannière 8db22d191f Examples: Replace broken link to Qt logo in networkaccessmanagerfactory
Pick-to: 6.5
Change-Id: Idda2d0e70049873622e43baea2fbcf80f4b5723c
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 12:12:35 +02:00
Mitch Curtis 9829dbd77d QQuickIndicatorButton: fix listeners being called after destruction
Remove the listeners of the indicator upon the button's destruction.

Task-number: QTBUG-98790
Pick-to: 6.2 6.5
Change-Id: I76509ebec601b8f6d004c90cdfbda46e390463a3
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 18:12:35 +08:00
Mitch Curtis 098231ae31 PageIndicator: fix change listeners being called after destruction
Remove the listeners of the contentItem upon the PageIndicator's
destruction.

Task-number: QTBUG-98790
Pick-to: 6.2 6.5
Change-Id: Ic03a0ea149806de524567b4115255e308df90105
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 18:12:35 +08:00
Mitch Curtis 7481dff314 Menu: fix change listeners being called after destruction
Remove the listeners of the contentItem upon the Menu's destruction.

Task-number: QTBUG-98790
Pick-to: 6.2 6.5
Change-Id: Ic1aa842f003c9ced40e88b195021d085e86540eb
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 18:12:35 +08:00
Olivier De Cannière c1983b446b cmake: Fix config for the networkaccessmanagerfactory manual example
Amends: d023d149d9

Pick-to: 6.5 6.5.1
Change-Id: I54adf85c1ff7da2d6cc1aa13b9c9c5e1a334c1d8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-05-02 10:12:35 +00:00
Richard Moe Gustavsen 1bac9de113 QQuickFlickable: avoid processing the same event twice
If Flickable has an exclusive grab (e.g if it's being dragged), and
at the same time, a child has a passive grab (e.g a TapHandler inside
a child of the content item), Flickable ends up getting the same pointer
events twice.

The reason this happens is because Flickable has a childMouseEventFilter.
So the flickable will first get all the pointer events since it has an
exclusive grab, just to see that the filter will receive the same
events once more, as they next are delivered to the passive grabbers.

The result is that Flickable will handle all pointer events
(move, release etc) twice when it has en exclusive grab, which will
even cause the flickable from stop flicking prematurely if the mouse
release ends up outside the bounds of the flickable (because of a double
call to handleReleaseEvent(), which will set stealMouse to false too
early).

To fix this, this patch will make sure that we don't handle any pointer
events in the childMouseEventFilter if we already have an exclusive grab.
After all, having an exclusive grab means that we're already getting the
events the "normal" way, and shouldn't handle the same events once more.

Fixes: QTBUG-104987
Pick-to: 6.5 6.4 6.2
Change-Id: Iaed49cb860cf50ea38a70a6e546d9dcf25cce444
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
2023-05-02 12:12:35 +02:00