Commit Graph

36302 Commits (116c2115f84ec2f5f12b5d7680cd83ceeef72a6e)

Author SHA1 Message Date
Andreas Buhr b7d4af3586 Add font function to OffscreenTheme to run unit tests with offscreen
Two unit tests fail at the moment with the offscreen theme because
the font function of the offscreen theme does not return a monospace
font when asked for a monospace font. This patch fixes it.

Change-Id: Id682c75e2a94b246cffe97b342b1b562bac82a68
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-11-24 18:54:45 +01:00
Andreas Buhr 115955069f Update container overview documentation - section on growth strategies
The Qt container overview documentation contained outdated information
on container growth strategies. This patch updates the documentation
to reflect the current implementation.

Task-number: QTBUG-86584
Pick-to: 6.0
Change-Id: I8fd014138f9a2e73925dafaa270d4c98ab672d96
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
2020-11-24 18:54:45 +01:00
Giuseppe D'Angelo c25cd03d79 Re-fix the definition of primitive types
The conditions are AND, not OR. Technically we don't rely on
not having constructors any more, but we may reserve the right
in the future to have uninitialized resizes.

Change-Id: Icfae61079a544f7ac8e90a32ad605c12cfa8b4aa
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit bcd38a96149f5397375b57e948c05c7a8f172194)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2020-11-24 07:17:40 +00:00
Huang Jie 29fca29d1c Reduce the scope of variables in bindInValues()
The scope of the variables 'bind', 'field', 'i' can be
reduced if the variable 'meta' is a null pointer. So
declare the variables when the variable 'meta' is valid.

Change-Id: I599406c034168dd73799c69dfb9c5e676861cdf2
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
2020-11-24 03:10:55 +00:00
Giuseppe D'Angelo 1fcc882d7c QStackedLayout: fix a memory leak
A layout takes ownership of the QLayoutItem passed to addItem.

Change-Id: Iea3c64453f3cbf4f1b5660e505c1a35dca537833
Pick-to: 6.0 5.15 5.12
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-23 21:11:42 +01:00
Giuseppe D'Angelo 910203afb4 Drop a [[maybe_unused]] on a variable
Turn it into an inline variable.

Change-Id: Iab7fa2d53259ced0b1a78bf7368e0e862ba2c799
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-23 21:11:42 +01:00
Allan Sandfeld Jensen 1ff25785ff Avoid integer overflow and division by zero
Restrain patterns to sensible lengths and values.

[ChangeLog][QCosmeticStroker] Pen patterns are restrained to a
maximum length and values of 1024, fixing oss-fuzz issue 25310.

Pick-to: 5.12 5.15 6.0 6.0.0
Change-Id: If062f8336ff5ad113258391b0d70b8ac6f42c4b3
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
2020-11-23 13:33:19 +01:00
Li Xinwei 876b22a425 CMake: Fix entrypoint output directory when multi-config build
When multi-config build, the output directory of Qt6EntryPoint.lib is
<build_dir>/lib/Release, the output directory of Qt6EntryPointd.lib is
<build_dir>/lib/Debug. This behavior is different from other lib files.
Both release and debug lib files should be outputted to <build_dir>/lib.

Pick-to: 6.0
Change-Id: I81d284e4630afebb40ba90fe822dd5bda2b2036a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-23 19:54:08 +08:00
Volker Hilsheimer 146b37cdf3 Return subclass type from overrides of QEvent::clone
C++ allows overrides to return a covariant type, so if calling code has
already cast the callee down to the right type, don't require it to cast
the returned clone down as well.

Pick-to: 6.0 6.0.0
Change-Id: I802f00a3c78e03047046986d0ed0a479b47573b8
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-23 11:52:25 +01:00
Edward Welbourne f884689d04 Clean up docs of QCalendar-related QLocale::toString() variants
Some of the new functions were added without documentation, or without
updating the docs to mention the optional calendars. Shuffle the
methods so that the one with calendar is what the primary
documentation comment describes and the one without is documented as
an overload.

Pick-to: 5.15
Change-Id: Iee4cdb1d3b0ed21a50e205a5275a0695a2667550
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-11-23 11:31:53 +01:00
Kai Koehne c082213556 Doc: Update CMake functions in Qt Widgets for Qt 6
Pick-to: 6.0 6.0.0
Change-Id: I4110e8695c75c40cec6f94bb94879b07282b29d3
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-23 10:01:06 +00:00
Kai Koehne 9e1aa7fc5f Do not advise using AUTORCC anymore
Task-number: QTBUG-87643
Pick-to: 6.0 6.0.0
Change-Id: Ib07586cc4206312044c0f0c154fa2ab2aada2c19
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-23 10:01:02 +00:00
Kai Koehne f74e572cb7 Doc: Update CMake functions in Qt Core for Qt 6
Pick-to: 6.0 6.0.0
Change-Id: Ica6141f183c75f60e5b1031c0972f79de7821841
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-23 10:00:57 +00:00
Fabian Kosmale 5806ecf5cb QMetaType: Track whether type is QML list type
This information is required in the QML engine to handle list properties
(instances of QQmlListproperty<T> and list<T> types from QML).

Pick-to: 6.0.0 6.0
Change-Id: I1e30572f1c91f58b290cb9b4b07433af99a1db6f
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
2020-11-23 09:57:00 +01:00
Ivan Solovev 54875be84d Add convenience functions for QFuture creation
[ChangeLog][QtCore][QFuture] Add convenience functions to create
a ready QFuture and a QFuture with an exception

Task-number: QTBUG-86713
Change-Id: Ic7f9ca590a8ea8a9696b84f35bad074780794461
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
2020-11-23 09:50:21 +01:00
Allan Sandfeld Jensen f61f8bb966 Replace qt_make_unique with std::make_unique
We can depend on C++14 now.

Change-Id: Iee9796cd22dbfbb70d4bdb25f0eee1662a026d6d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-23 09:50:21 +01:00
Giuseppe D'Angelo 03ab48657d Drop a [[maybe_unused]] on a variable
Turn it into an inline variable.

Change-Id: I491bd8fee3d25f814587db5a1047f15990081d66
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2020-11-23 06:24:24 +01:00
Lorn Potter 0de0a6a54c wasm: fix resizing of qwidget windows
This also fixes the cursor changing during resize mode

Fixes: QTBUG-85361
Pick-to: 5.15
Change-Id: Ic85a5c31a8a2dc4265a84f16fd5fcdc231062c6d
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2020-11-23 07:54:56 +10:00
Lorn Potter f785849768 wasm: fix mouse double click
Two issues here, timestamp value was getting smashed, and
MouseButtonDblClick was not getting sent.

Fixes: QTBUG-85712
Pick-to: 5.15
Change-Id: I912e968f1eb0fb9c6f4cf8548b114e23d182396e
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2020-11-23 07:54:39 +10:00
Giuseppe D'Angelo 8ae9431c79 QMargins(F): add support for structured binding
[ChangeLog][QtCore][QMargins] QMargins is usable in a structured
binding.

[ChangeLog][QtCore][QMarginsF] QMarginsF is usable in a structured
binding.

Change-Id: I0c501847b9377c47bd0e63da3735792075bd0079
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-22 02:22:20 +01:00
Mårten Nordheim f08492c6fd QCache: fix accidental pessimization
By unconditionally removing the existing entry we never
hit the if (result.initialized) branch. Change it to
only remove the existing entry if we don't plan on inserting.

Task-number: QTBUG-88183
Pick-to: 6.0 6.0.0
Change-Id: If4e7ebac23aa63d4b9d4b0a22882dd7d90a58e8b
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-21 13:59:16 +00:00
Shawn Rutledge 45a65cbeb2 QGuiAppPriv: don't clear target and window for TouchCancel
It's nice not to leave garbage in QPointingDevicePrivate::activePoints
between events; on the other hand, this garbage doesn't matter, because
every press event sets the target and window independently, without
caring what was stored there from before.  But it was wrong to clear
it before we've even delivered the TouchCancel event.

Pick-to: 6.0
Pick-to: 6.0.0
Change-Id: I924039a7c7a8ed75f420d1837c63dc19d3cc98b6
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-21 03:54:54 +00:00
Volker Hilsheimer 291e8e729e Delete move constructor and move-assignment for QEvent
As of 19f9b0d5f5 we define a protected copy
constructor and assignment operator. Static analyzers warn about missing
move variants, so delete those in addition.

Pick-to: 6.0 6.0.0
Change-Id: I28c1a2afd4560ce35a258bde507dafd93245b75b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 23:16:07 +01:00
Alex Trotsenko 27e08b0c40 QWin32PrintEngine: fix compilation
On MinGW32 it fails with error:

.../src/corelib/global/global.h: 1186:34: error: unused variable 'q'
...qprintengine_win.cpp: 753:5: note: in expansion of macro 'Q_Q'

Pick-to: 6.0 6.0.0
Change-Id: I8eb0e3c5b72f8542cd3bd11514b12d308481f250
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-20 20:30:30 +00:00
Eskil Abrahamsen Blomfeldt 1d14067680 Fix weight when reading old serialized QFonts
The QFont::fromString() needs to differ between strings
produced before and after Qt 6.0 when interpreting the
weight value, since in older strings this will be the legacy
scale.

Luckily the number of tokens in the string can be used for this
purpose, since many tokens were added in Qt 6.0.

This broke KDE, where font settings are stored in QSettings
and serialized using QFont::toString() from Qt 5.

Fixes: QTBUG-88589
Pick-to: 6.0.0 6.0
Change-Id: I199737fed61917f8b9d8f86176ead29a89eb8e0c
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
2020-11-20 20:29:00 +00:00
Giuseppe D'Angelo c63669bb8c QLayout: add a way to unset user-defined contents margins
Once user-defined margins are set on a layout, there's no way
to unset them, except by abusing setContentsMargins and passing
-1, which is a total API abuse (does a negative margin mean that
contents *overflow* the layout?). Add a proper function.

[ChangeLog][QtWidgets][QLayout] Added unsetContentsMargins().

Change-Id: I089788a7470f9649a8f00e42914dafb7242f12cd
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
2020-11-20 20:48:59 +01:00
Allan Sandfeld Jensen a31484302d Fix safe conversion
Ensure the resulting QScFixed values are no larger than can
be safely returned to int after shifting the fixed factor
away.

Pick-to: 6.0 6.0.0
Fixes: QTBUG-88683
Change-Id: Id0754b021e5fa9a3cf0d15e37ac643cfc1509993
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
2020-11-20 20:42:12 +01:00
Thiago Macieira 47778847ec QCoreApplication: add doc to discourage use of processEvents
Change-Id: If51855da004b4f3fbf43fffd1648fc580c00224a
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
2020-11-20 11:38:03 -08:00
Thiago Macieira 8ec9a48e80 QCoreApplication: add more information to processEvents() docs
Just shows how bad an idea to call this function it is.

Pick-to: 5.15
Fixes: QTBUG-88653
Change-Id: If51855da004b4f3fbf43fffd1648fc294065160d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-20 19:38:02 +00:00
Cristian Adam e395cbb43d CMake: Fix build of plugins/styles/mac using PCH
If a target inherits precompile headers from a different target
that has more languages enabled (CXX, OBJCXX), the target will
depend on PCH artifacts for a language that is not actually
present.

Ammends d9d137c8f3

Fixes: QTBUG-88609
Pick-to: 6.0.0 6.0
Change-Id: I9735317e634b62732df0fce84fe7cf229cfdea1b
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-20 16:06:38 +00:00
Assam Boudjelthia aaed8f283c CMake: add CMAKE_FIND_ROOT_PATH as extraPrefixDirs for androiddeployqt
androiddeployqt has extraPrefixDirs to provide extra prefix paths in
addition to the main Qt install path, however, for some reason, it was
not being used.

With this, apps for Android using Conan can pass the Conan build prefix
for androiddeployqt to use it as well.

Task-number: QTBUG-88519
Change-Id: Iad73055ac6c03e3ffe86fca271dbda67ac29a275
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 00e726ce12431e8c3db8bc9deb8952f930a5a672)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2020-11-20 15:45:52 +00:00
Alexey Edelev eaedd7efbf CMake: Fix resource_name variable name in __qt_propagate_generated_resource
__qt_propagate_generated_resource used resourceName variable from
parent scope instead of one passed to function.

Pick-to: 6.0.0 6.0
Change-Id: I18ce8a9f9c01bcfdbab532def55af4e2780d7753
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-20 15:29:32 +01:00
Giuseppe D'Angelo fb6b7869e8 QPoint(F): add support for structured binding
QPoint(F) are "naturally" destructurable in their x/y
counterparts (hello Mac/Carbon users, we don't live in 1999
any more, it's x and then y, and not vice versa...).

[ChangeLog][QtCore][QPoint] QPoint is usable in a structured
binding.

[ChangeLog][QtCore][QPointF] QPointF is usable in a structured
binding.

Change-Id: I8718a4e80be4ce03f37f012034f1fba009304b32
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 16:01:14 +02:00
Tor Arne Vestbø 7d5ba1c17e widgets: Don't report new focus object during clearFocus() unless needed
We do not unconditionally clear focus_child like the existing comment
said. We only do it if the focus_child was the widget that is clearing
focus. So in many cases we'll end up with the same focus object as
before. We can not report that as a focusObjectChanged to the window,
as that will potentially trigger a reset or cancel of the current
input method for the (unchanged) focus object.

Fixes: QTBUG-86976
Pick-to: 5.15
Pick-to: 5.12
Change-Id: I54367e46eda7a94d967f58960bd926c195dc09cc
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-20 14:51:59 +01:00
Timur Pocheptsov 16f4ce89ed QDtls - remove redundant RAII struct
As noted by LCOV, the part with q_BIO_free(bio) was never executed
since we were taking the result from QScopedPointer before returning.
While it's a what RAII idiom is for, there is quite a low probability
that SSL_set_bio() one day will start throwing exceptions.

Pick-to: 6.0
Pick-to: 5.15
Change-Id: Id24e480dac34166c627b71bb2972de558c644339
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
2020-11-20 14:49:27 +01:00
Tor Arne Vestbø a6aaa2b707 macOS: Propagate device-pixel-ratio of system tray icon
When preparing a system tray icon on a system with a retina screen,
we end up creating a full-height icon of height 44. If there's also
a 1x screen available, macOS will scale down this image for us when
presenting the icon on the 1 screen, but the downscale will fail to
preserve the aspect ratio of the original image on Big Sur.

Telling macOS which device-pixel-ratio the image has seems to fix
this, and is the right thing to do in any case.

Pick-to: 5.15
Pick-to: 5.12
Fixes: QTBUG-88600
Change-Id: Ic31def94d073da1b256bbfcaf5905f92c169f43d
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-20 13:44:15 +00:00
Giuseppe D'Angelo b119b17717 QScopedPointer: streamline code with qExchange
Change-Id: I88059d2c484fa2762ec0fc526d81db543043b58b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 14:34:22 +01:00
Giuseppe D'Angelo dda6a7497e QScopedPointer helper deletes: add operator()
To make them compatible with unique_ptr. Drive-by,

* add missing noexcept
* turn a `if (p) free(p)` into just `free(p)`.

Change-Id: I234dad6f6b953202dbc537875b94f653a09910fb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 14:34:18 +01:00
Giuseppe D'Angelo 37808ee55a Remove QScopedSharedPointer
It's private and unused since ~2012.

Change-Id: Iea11af27f7eebf3eae2467b22b68cd4c26885edd
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 14:34:14 +01:00
Mitch Curtis 5861e06568 Doc: explain how to create a test touch device for use with touchEvent
Change-Id: Ib60eb0754449da7c50f8632ebd5228ddbe8389f1
Pick-to: 6.0 6.0.0 5.15 5.12
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-11-20 13:30:52 +00:00
Andy Shaw d8602ce58b QFont: Prefer setFamilies() over setFamily()
By depending on setFamilies() then we can be sure that font names with
spaces, commas, quotes and so on are correctly handled without being
misinterpreted. For now it will split on the comma when a string
containing one is passed to setFamily. But from Qt 6.2 this will be
removed to preserve the family string as a convenience function.

[ChangeLog][QtGui][QFont] Indicated that setFamilies/families is
preferred over setFamily/family to ensure that font family names are
preserved when spaces, commas and so on are used in the name.

Change-Id: Id3c1a4e827756a4c928fed461a4aafa5a0f06633
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
2020-11-20 14:30:22 +01:00
Giuseppe D'Angelo 612a01be65 Deprecate QScopedPointer::take()
We've decided that QScopedPointer shouldn't be movable,
because it would break the semantics of being "scoped"
(the pointer/pointee won't survive the scope).

Then, QScopedPointer shouldn't allow for take() either.
If you need those semantics, reach for unique_ptr.

[ChangeLog][QtCore][QScopedPointer] The take() function
has been deprecated. This was an API mistake, as it
allowed the pointer/pointee to escape from the scope,
defeating the point of the QScopedPointer class. If you
need such semantics, use std::unique_ptr (and call
release()).

Change-Id: I3236f085f763b04eb98e3242abc06f7c54fb3d8b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-20 14:28:31 +01:00
Giuseppe D'Angelo 5dd7e7b7a8 Add deprecation warnings for 6.1
Change-Id: I8e78f29f338670078488247f233b99125eabb4b6
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-20 14:28:31 +01:00
Kai Koehne ce29ce586f Revert "Allow QWindowsPipe{Reader,Writer} to work with foreign event loops"
This reverts commit ee122077b0.

Reason for revert: This causes QProcess::readAll() to sometimes
return nothing after the process has ended.

Fixes: QTBUG-88624
Change-Id: I34fa27ae7fb38cc7c3a1e8eb2fdae2a5775584c2
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
(cherry picked from commit 23100ee61e33680d20f934dcbc96b57e8da29bf9)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2020-11-20 13:28:31 +00:00
Giuseppe D'Angelo 915be6606e QChar: assert on illegal construction
If the input is out of range for the respective input type,
then fire an assert. Remove a redudant bitwise-and.

The constructors from char have been left alone: we are
documenting that QChar(char) constructs from Latin1 (!), not
ASCII/UTF-8, so all values are valid.

Change-Id: I55e261015d5efa0699c78c25e454f09bb17a913f
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-11-20 03:34:37 +01:00
Andreas Buhr ebaae45ea1 Fix logic error in QString::replace(ch, after, cs)
Coverage analysis showed that an if-branch marked "Q_LIKELY" was never
taken. It turns out the code was incorrect, but behaved correctly.
This patch fixes the logic and adds a unit test.

Pick-to: 5.15
Change-Id: I9b4ba76392b52f07b8e21188496e23f98dba95a9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-11-19 20:28:27 +01:00
Kai Koehne 4153fb8fc3 Update docs about how to configure OpenSSL
Change-Id: Ifd243cd8d3ac3fd52af649fd4507cfd9788e98d3
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-11-19 17:27:30 +01:00
Assam Boudjelthia 4ef3da04c3 Android: use extraPrefixDirs with qmlimportscanner
This will ensure that qmlimportscanner can use the extraPrefixDirs,
when an extra prefix is provided like the case with Conan builds.

Task-number: QTBUG-88519
Change-Id: Idec3916b043822da094973a7e246a6ee4af14c83
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
2020-11-19 13:28:46 +02:00
Mårten Nordheim 456699da93 QSocks5SocketEngine: Fix out-of-bounds access of QBA
This should've been caught a long time ago, but long story short: it wasn't.
This has been deprecated since 5.14 and is now asserting.

Pick-to: 5.15
Change-Id: Iddee22b1a68e5d1a03006831f795db8ec1c472be
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
2020-11-19 12:28:46 +01:00
Topi Reinio 5126e461a2 Doc: Fix documentation warnings for Qt Test
Task-number: QTBUG-86295
Change-Id: If3c48bee8c898a228128ade18fbdeaa2b8de8b20
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-11-19 12:28:45 +01:00