Commit Graph

40067 Commits

Author SHA1 Message Date
Marc Mutz
f1404c0ed1 QEvdev: Extract Method parseSpecification()
All four manager classes contained roughly the same code in their
ctors that parsed out devices from a colon-separated string.

Extract shared code, and port the parsing to QStringRef (later to be
ported to QStringView).

Saves ~2.4KiB on optimized Linux GCC 9.1 AMD64 builds across all
.so's that link to libQtInputSupport.a.

Change-Id: I3db826ee2b422cfc02f8d49bd21985a03b6c0935
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-06-13 08:48:26 +02:00
Marc Mutz
e01e848df4 QMimeType: towards re-entrancy: do not cache iconName made from mimetype name
To not write into a shared object without mutex protection. If the
stored icon name is empty, just calculate a new one on each call.

Task-number: QTBUG-45684
Change-Id: I01dfb6697b5275e69451da91fdc7346f40bc424e
Reviewed-by: David Faure <david.faure@kdab.com>
2019-06-16 16:56:35 +02:00
Marc Mutz
3bc10fb9bb QEvdev: Replace manual memory management with unique_ptr
Make create() return, and m_mice/m_keyboards/etc store, handlers by unique_ptr.
In most cases, we can't use qt_make_unique(), since the ctor we're calling is
marked as private.

Since QHash can't hold move-only types, use a std::vector<{QString, unique_ptr}>
instead. As this pattern repeats in all four QEvdev*Manager classes, create a
small class template.

Saves almost 6KiB on optimized Linux AMD64 GCC 9.1 builds across all .so's that
link to QtInputSupport.a.

Change-Id: I8f62b6b629d6e1855314c0a4fb4fc069db9ae0ce
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2019-06-12 13:43:52 +02:00
Marc Mutz
12938ba70b QMimeType: make deep const breakages explicit
QExplicitlySharedDataPointer is propagating const in my tree, and I will be proposing
this for inclusion into Qt 6, so proactively fix the breakage here.

QMimeType is known to be non-reentrant (QTBUG-45684), and this patch doesn't fix it.

Change-Id: If68b148c44439d76ab1d95e8db93b90d12650e51
Reviewed-by: David Faure <david.faure@kdab.com>
2019-06-16 16:06:57 +02:00
Giuseppe D'Angelo
a2632f90db QGradient: add a last-enum enumerator to the presets
It's needed to prepare qtdeclarative for the upcoming patch that
won't make QGradient accept illegal presets any more.

Change-Id: I4ca929e75214ebe24c7d762d0c37ca254c640c57
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2019-06-14 16:26:27 +00:00
Marc Mutz
cbd5a2dcb8 AtSpiAdaptor: eradicate remaining Q_FOREACH loops
... and replace them by C++11 range-for loops.

Change-Id: I6975121f606ec1fcda7a624b02a68edf829bb70b
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
2019-06-13 22:53:04 +02:00
Marc Mutz
3f5d27bfda QEvdev: Extract Method updateDeviceCount()
The code is noisy and repeats, so wrap it in a function.

Change-Id: I5e6e924e22b0bc631eb8176de96c49066b1c9029
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2019-06-11 23:30:05 +02:00
Marc Mutz
d6cd1a3c2b QUrl: replace manual memory management of QUrlPrivate::Error with unique_ptr
Change-Id: I837866dbeff4b3f4ba4eb5b564041fecbd59e70e
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
2019-06-12 17:59:58 +00:00
Marc Mutz
c4a94edbbc QMessagePattern: replace manual memory handling with std::unique_ptr
Dealing with 'tokens' is straight-forward.

With 'literals', it is not quite so straight-forward, because the
ownership chain here is two levels deep. But it's still worthwhile,
because it replaces quite error-prone code with code which may be a
bit more verbose, but is totally safe.

As a drive-by, moved initialization of the fromEnvironment member to
the body of the ctor in order to avoid code-churn (I needed to touch
the ctor-init-list anyway).

The QMessagePattern dtor is now empty and consequently defaulted.

Change-Id: Iadb25e7aba1c5a94fd9068be7ae03f17e975328b
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-06-13 22:12:00 +02:00
Morten Johan Sørvig
6faa4d4a87 QFuture: Wait for result on iterator advance
Wait for the result at the target index if the future
is running and the iterator index is past the current
result count.

Determine if there is a result at the target index
after waitForResult() returns, and return -1/end if
not.

Also support decrementing the end iterator. In this
case wait for the future to finish in order to get
the final result count.

Task-number: QTBUG-59811
Change-Id: I8fcc711bab2e72c3c5196a55b794d25e18bb324d
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-05-13 10:41:25 +02:00
Andreas Hartmetz
486c55d743 constify, and micro-optimize not detaching
Change-Id: I08c3c35e27a2b5e816a1532d0bd7cc09459800ab
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
2019-06-10 14:44:26 +02:00
Liang Qi
c0ae93fdf9 Merge "Merge remote-tracking branch 'origin/5.13' into dev" 2019-06-14 13:45:18 +02:00
Liang Qi
b1a216649e Merge remote-tracking branch 'origin/5.13' into dev
Conflicts:
	qmake/generators/makefile.cpp
	qmake/generators/unix/unixmake2.cpp
	src/corelib/thread/qthread_unix.cpp
	tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp

Change-Id: I1df0d4ba20685de7f9300bf07458c13376493408
2019-06-14 13:45:18 +02:00
Qt Forward Merge Bot
1632786f00 Merge "Merge remote-tracking branch 'origin/5.12' into 5.13" 2019-06-14 01:00:09 +02:00
Qt Forward Merge Bot
2a9cf3aeab Merge remote-tracking branch 'origin/5.12' into 5.13
Change-Id: I53a50669face6f68ddc046fd2102de8c1f888b4b
2019-06-14 01:00:09 +02:00
BogDan Vatra
0676645318 Android: Fix build with NDKr20
In NDK r20 clang adds -lc++ library automatically which leads to link fails.

[ChangeLog][Android] Fix NDK r20 linking.

Task-number: QTBUG-76293
Change-Id: I6675180a3555d1ad9047d7a9ce1c03333cf0ab35
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
2019-06-13 07:14:54 +00:00
Friedemann Kleint
2e20ae3c1b uic: Fix some clang warnings
- Use range-based for
- Use isEmpty() instead .size(), streamline code
- Fix warnings about class definitions, use Q_DISABLE_COPY_MOVE
  and '= default' for trivial constructors

Change-Id: I76255fd9d80c3faffebda9a438e86e918c16d289
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
2019-06-06 11:08:01 +02:00
Friedemann Kleint
5343a7018e uic: Replace 'typedef' by 'using'
Apply Fixits by Qt Creator with some amendments.

Change-Id: I152cb5935ff7d649de297b010b9253c625c7da84
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
2019-06-06 10:57:04 +02:00
Friedemann Kleint
2f84ec4bcd uic: Introduce nullptr
Apply Fixits by Qt Creator.

Change-Id: Ic2d65b2604d1d71d910773e02bcdf2466f49e52c
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
2019-06-11 09:05:38 +02:00
Friedemann Kleint
38f1a36f60 Windows QPA: Fix clang warnings about repetitive type names
Fix warning like:
warning: use auto when initializing with new/reinterpret_cast to avoid duplicating the type name [modernize-use-auto]

Change-Id: Ieb7f052919173f6923e68de9f9e849dee45e36e7
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
2019-06-13 10:04:44 +02:00
Laszlo Agocs
7f7eaf1cad Add VulkanMemoryAllocator
The Vulkan backend of QRhi relies on vk_mem_alloc.h from AMD in order
to get a stable, performant, and tested GPU memory allocator. It is not
unthinkable that we will move away from this in the future, especially
considering that a potential future D3D12 backend may need a similar
solution, but until then this will do.

Change-Id: I198a898f216d0795b4bf339ccea80b0cd2efbabc
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2019-06-12 12:42:38 +02:00
Laszlo Agocs
53599592e0 Introduce the Qt graphics abstraction as private QtGui helpers
Comes with backends for Vulkan, Metal, Direct3D 11.1, and OpenGL (ES).

All APIs are private for now.

Shader conditioning (i.e. generating a QRhiShader in memory or on disk
from some shader source code) is done via the tools and APIs provided
by qt-labs/qtshadertools.

The OpenGL support follows the cross-platform tradition of requiring
ES 2.0 only, while optionally using some (ES) 3.x features. It can
operate in core profile contexts as well.

Task-number: QTBUG-70287
Change-Id: I246f2e36d562e404012c05db2aa72487108aa7cc
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2019-06-13 10:13:45 +02:00
Lorn Potter
df9f9fb368 wasm: handle mouse events even when not over a window
If the mouse button is held and mouse moves from over the window, that
window would never register the button up event, and cause issue like
being able to move a dialog around by simply moving the mouse around.

Change-Id: I1363ac9c9f4113a79bf6863668ba74b90b1cea4a
Fixes: QTBUG-75951
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2019-05-30 18:30:17 +10:00
Martin Smith
8d2df3002b doc: Fix tr() documentation issue
The declaration of tr() in the Q_OBJECT macro interferes with the
tr() declaration in the QObject class. This update fixes that bug
by resetting QT_TR_FUNCTIONS to be empty and by ensuring that the
tr() declaration in class QObject is seen by clang when qdoc is
running.

Change-Id: If55339fc417f3eee1a1e1ce3df75a18af443d630
Task-number: QTBUG-75864
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2019-06-13 04:52:57 +00:00
Laszlo Agocs
c143161608 Avoid uninitialized texture data in image glyph cache
The problem becomes visible with styled native text materials in Quick,
but only in certain cases: the regions not used by glyphs in the QImage
are undefined (if they are 0 there's no problem) - but the whole
code path is only used when the fbo readback workaround is enabled.

When these conditions met, the styled text materials may sample locations
with uninitialized data in the texture, showing small artifacts around
the glyphs when shifting is involved in the styling.

The non-image based GL glyph cache handles this by an explicit upload
with all 0's when creating the texture - the QImage code path should do
the same then.

Change-Id: I818ee19f87c6a147e42cd3ead39645da4d0fef11
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
2019-05-28 17:48:03 +02:00
Joerg Bornemann
29fa59d244 Fix parallel lex/yacc invocation for debug_and_release builds
[ChangeLog][qmake] Introduced the variables LEX_DIR and YACC_DIR which
determine the location of lex/yacc output. Fixed parallel execution of
lex/yacc for debug_and_release builds.

Fixes: QTBUG-65730
Change-Id: I68c8260a95609e11bb5205a91aff2c098ed7009c
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
 
 
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
2019-06-06 15:21:37 +02:00
Joerg Bornemann
274882a58c De-duplicate elements of QMAKE_DIR_REPLACE[_SANE]
Elements that appear in QMAKE_DIR_REPLACE_SANE must appear in
QMAKE_DIR_REPLACE to be considered due to the algorithm used in
exclusive_builds_post.prf.

Change-Id: Ibce7e6c988b3e8a141075890a2f547eb34090b3a
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
2019-06-06 15:21:37 +02:00
Shawn Rutledge
dd3229e672 Remove a few usages of deprecated API
Change-Id: I94bad0b8d3891c6b4a55178836cfff2a4312e330
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2019-06-13 16:49:41 +02:00
Marc Mutz
d2ed1074d0 tests: remove the last uses of Java-style iterators
... except where they are actually the component under test.

Java-style iterators are scheduled for deprecation.

Change-Id: If4399f7f74c5ffc0f7e65205e422edfa1d908ee8
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2019-06-13 09:40:26 +02:00
Lorn Potter
762d4afdc1 wasm: fix crash in case network js event becomes null or undefined
also fix data progress

Task-number: QTBUG-75489
Change-Id: I5222fda64d258a6ae78ba0ca20194b81c289c27e
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2019-05-27 11:08:47 +10:00
Marc Mutz
18e7e82d3f Remove the last uses of Java-style iterators in QtCore
They are going to be deprecated.

Add a strategic break. This was a pre-existing problem: the comment
claims that h is invalid (though I personally don't see it), but
then goes on to check the loop condition (which, in the mutable
Java iterator case, involves calling h.cend()). We now cache the
end iterator, so if there ever was a problem, it's probably a
lesser one now, but it's still not kosher, and a debug version of
QHash would find it, so break out explicitly.

Saves ~200b in text size on optimized GCC 9.1 Linux AMD64 builds,
ie. ~100b per loop.

Change-Id: I7684485b55fb23a8cf882f89621ebb75a0e607b5
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2019-05-23 10:09:27 +02:00
Marc Mutz
ac608b7bd2 QDebug: add nothrow move special member functions
This requires making QDebugStateSaver hold QDebug::Stream directly, not
QDebug by reference, as the referenced object will have been moved from
when ~QDebugStateSaver executes. The stream object, however, will still
be around.

Change-Id: I0ca2eb60cb9b68ea3835d9a9ff5e295d9b1c5fb5
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: David Faure <david.faure@kdab.com>
2019-06-06 22:25:58 +02:00
Friedemann Kleint
8c9e41cc78 Use QSaveFile in MainWindow examples
QSaveFile should preferably be used by editor applications to catch
write errors.

Task-number: QTBUG-60635
Change-Id: Ia609435871b56b45714c3dd3d32bbc85b5cb4dd5
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-06-12 09:29:31 +02:00
Marc Mutz
0ad5e16268 QEvdev: use printf-style qCDebug()/qWarning()
Also use qUtf16Printable() and qErrnoWarning (removing explicit errno, where
present).

Saves 6.6KiB in text size on optimized Linux AMD64 GCC 9.1 build across
all .so's that link to QtInputSupport.a.

Change-Id: I1def2cfabd2eed65390099cd1d06f8061a9355be
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-06-11 21:38:47 +00:00
Marc Mutz
c6a3507de2 SecureUDPServer example: use std::unique_ptr instead of QSharedPointer
The only reason the code used QSharedPointer is that it used QVector
to hold a collection of them, and QVector infamously cannot hold
move-only types such as std::unique_ptr.

Fix by using std::vector<std::unique_ptr> instead. Also, pass the
objeccts into non-sink functions by raw pointer instead of shared_ptr.

As a drive-by, replace clear-following-iterate by the for-exchanged
pattern.

Change-Id: I605fbb98af840c1b93eab9e65c07defd6e7b39e1
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2019-05-15 14:40:23 +02:00
Giuseppe D'Angelo
de82d239f8 Make QColor a literal type
Extracted from the SVG names patch.

It basically just requires adding a constexpr constructor to the
inner union, then sprinkling constexpr on the existing ones.
Do minor refactorings as drive-by.

Change-Id: I60e7a1c9068def3507cb07440450e51673269f84
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2019-06-12 19:55:17 +02:00
hjk
166753d8e0 rcc: Avoid needless use of macro
strlen on literals gets typically optimized out nowadays.

Adjust callee side to handle the off-by-one between sizeof(literal)
and strlen().

Change-Id: I1551f69a160922681d66024701ba1bd8f6dc03bf
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
2019-05-28 12:30:11 +02:00
Marc Mutz
242bc539ab QWeakPointer: use an alternative work-round for internalData() users
The previous work-around fails, probably because of
cross-dependencies. E.g. we have this in QtScXml:

In file included from /home/qt/work/install/include/QtCore/qsharedpointer.h:48:0,
                  from ../../src/scxml/qscxmltabledata_p.h:55,
                  from ../../src/scxml/qscxmltabledata.cpp:40:
 /home/qt/work/install/include/QtCore/qsharedpointer_impl.h:687:12: error: ‘QPointer’ does not name a type; did you mean ‘pointer’?
      friend QPointer<X>
             ^~~~~~~~
             pointer
 /home/qt/work/install/include/QtCore/qsharedpointer_impl.h:689:23: error: ‘QSmartPointerConvertFunctor’ in namespace ‘QtPrivate’ does not name a template type
      friend QtPrivate::QSmartPointerConvertFunctor<QWeakPointer>;
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~

To fix, grand friendship only to a non-template class with a templated
static method that returns internalData(). This fixes most users,
except in qmetatype.h, which does not include qsharedpointer.h. In
order to use the non-template class in there, we need to delay its
name lookup to instantiation time. We do this by artificially making
it a dependent name, by using a class template that inherits from
our befrieded class.

Change-Id: I12b427f1fe9503df819ea5436d780972d6402e68
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
2019-06-11 18:44:58 +02:00
Marc Mutz
fafae936a6 QMetaType: fix an is_pod test that C++11 broke
C++11 allows non-POD-types in unions, so the test didn't test anything.
Use a static_assert over std::is_pod instead.

Change-Id: Ida7ef0551ae6ae07357a987a409294d2a386be2f
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
2019-06-12 08:16:24 +00:00
Giuseppe D'Angelo
ff88c3bc55 Q_ARRAY_LITERAL: fix the checks on the payload's datatype
The check was a misnomer -- non-POD types can go in unions
since C++11. And we may want them, e.g. types without a trivial
default constructor. What we really want is to check for a
literal type (so that the array payload can be built entirely
at compile time, and put in .rodata). So, amend the check.

Also, make the dummy array constexpr, to be sure that we are
indeed building the payload using constexpr constructors.
That would make the first check redundant, but the fact that
we're still using a macro for constexpr makes me think that
not all compilers support it, so I'm leaving the first check
in...

Change-Id: I9f1473aa74dff5b6b6535ae4cd8325451c0b18e6
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2019-06-12 01:45:52 +02:00
Giuseppe D'Angelo
620f121206 QAtomic: introduce loadRelaxed() / storeRelaxed()
Plain load() / store() have already relaxed semantics. This
can be surprising -- std::atomic::load()/store() are actually
sequentially consistent -- and introduce a pain point
if someone wants to move from Qt atomics to std:: atomics.

So just add a suffix to the functions to clarify what's the
memory ordering involved with them.

The Ops::load / ::store are temporarily left in, because other
modules depends on them. We need to port those modules away,
then they can go (it's private API anyhow).

Similarly, not deprecating anything yet, except for marking
obsolete in the docs; there's a lot of code around using
load() / store() that needs to be ported first.

[ChangeLog][QtCore][QAtomicInteger] Added loadRelaxed() and
storeRelaxed(), to be used as replacements of load() / store().

[ChangeLog][QtCore][QAtomicPointer] Added loadRelaxed() and
storeRelaxed(), to be used as replacements of load() / store().

Change-Id: Iab0a78885050379e3740f0b039ba2bef28ce3bd2
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2019-06-10 16:56:17 +00:00
Mikhail Svetkin
efe1073e44 rtems: Enable Thread local storage support
Change-Id: If2ecf440fda9270688be60273e57d4b765bbdec2
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2019-06-06 10:16:09 +02:00
Edward Welbourne
6f03867d02 Rearrange date parsing in anticipation of calendar work
The calendar APIs shall need fromShortMonthName() to know its year
number; so rearrange the date parsing that uses it to ensure the year
number is known in time.  In the process, pass &ok to toInt() also for
the calls that get a day number (where failure's 0 return is an
adequate check for failed parse), just to be on the safe side.

Change-Id: Id09c40da9f7e70e68be440e9805a3d30a80977c6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2019-06-07 17:23:50 +02:00
Allan Sandfeld Jensen
b4ead57250 Move away from using 0 as a pointer constant
Cleans up most of corelib to use nullptr or default enums
where appropriate.

Change-Id: Ifcaac14ecdaaee730f87f10941db3ce407d71ef9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2019-06-07 17:19:16 +02:00
Allan Sandfeld Jensen
327bfdb671 Enable warnings_are_errors builds for MSVC 2017
Also remove it from versions no longer supported.

Change-Id: I03a911a349527a81846e1820f95d775fe3943450
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2019-06-07 17:23:57 +02:00
Mikhail Svetkin
910a0aedbb qtlite: Fix build with -no-feature-texthtmlparser
Change-Id: I3ffd4612884f57c2d0ff8e9c9c10d0805dd72f6f
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2019-06-11 15:24:36 +02:00
Mikhail Svetkin
c66c4a844f rtems: Fix detection bad file descriptor
RTEMS does not support poll/select and etc for files and
fcntl(fd, F_GETFD) can not say that.

Change-Id: If5ad160cd81e347fac72d2bafcb5b5bb815ed059
Reviewed-by: Ryan Chu <ryan.chu@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2019-06-05 08:21:52 +00:00
Eirik Aavitsland
83dccf00cc Fix printing of table headers in multi-frame QTextDocuments
The calculation of page position of table headers would only work
correctly for tables in the root frame of a QTextDocument. Fix by
including the relative positions of subframes.

Fixes: QTBUG-59000
Change-Id: I2cc7e21bddf806f7f5f9b0675ac014c339ba2453
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
2019-04-11 15:29:44 +02:00
Liang Qi
3d4b62a753 Merge "Merge remote-tracking branch 'origin/5.13.0' into 5.13" 2019-06-11 10:30:48 +02:00
Liang Qi
3c662bf13c Merge remote-tracking branch 'origin/5.13.0' into 5.13
Conflicts:
	src/plugins/platforms/wasm/qwasmintegration.cpp
	src/plugins/platforms/wasm/qwasmintegration.h

Change-Id: Idf4c7936513fb1f21daa8f6105b8545f13447bb8
2019-06-11 10:30:48 +02:00