aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmlplugindump/main.cpp
Commit message (Collapse)AuthorAgeFilesLines
* qmlplugindump: Fix overload ambiguityMaximilian Goldstein2021-02-081-5/+6
| | | | | | | | Fixes: QTBUG-89955 Change-Id: I89ce8a146c0ce07c8e308783f79677575458c71c Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 40eaa9509b1c2e430b7617e1b42aa66214ad80df) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
* Merge the QtTest and Qt.test.qtestroot QML modulesUlf Hermann2021-01-121-7/+0
| | | | | | | | | | There is no point in having them separate and this way the plugin can be optional. Fixes: QTBUG-89804 Change-Id: Ic7de35f6ee7abde4840841e17d21c2b709f6db7d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
* Standardize QJsonArray iterationDavid Skoland2020-10-281-1/+1
| | | | | | | | | When using refs as loop variables, the clang compiler complains (with default settings). This prevents that. Note that QJsonValueRef is used "behind the scenes", which makes this iteration method correct. Change-Id: I5a5f58ca8ad3887bce2009231cbae5a57c107697 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* QmlCompiler: Rename QmlStreamWriterUlf Hermann2020-10-051-4/+4
| | | | | | | The names should start with a common prefix. Change-Id: Ib2cc247d459d78de5f0a8ea0be73b89429154475 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Long live libQtQmlCompiler!Ulf Hermann2020-10-051-1/+1
| | | | | | | | Move all the code from tools/shared into src/qmlcompiler and build a static library from it so that we can re-use it in external tools. Change-Id: I7c8d8e59063dc7c711f4072f103a01095e6f5997 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* qmlplugindump: Fix handling of dependenciesUlf Hermann2020-07-081-58/+61
| | | | | | | | | Tolerate dependencies without version and don't write them into the output anymore. No one should read them as the same info has to be available from the associated qmldir files. Change-Id: I5e4cd93c83cb5e874a8a6e1467461d081b1a089c Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Clean up registration of QEasingCurveUlf Hermann2020-05-191-14/+0
| | | | | | | | | | | | | | | | We don't need to register the Type enum for both QtQml and QtQuick. QtQml is enough. Removing this makes the whole manual value type registration obsolete. Furthermore, we want QEasingCurve as QML_FOREIGN as we have several classes with properties of that type. To keep it nice and tidy, we make the uppercase-named enum holder class a separate type. Unfortunately, the Type enums differ in one entry: QEasingCurve::BezierSpline is called Easing.Bezier in QML. Therefore, we need to keep the custom enum around. We can change all users in qtdeclarative to use the name from QEasingCurve, though. Change-Id: Ibbc78d8bbf8938e2a8722f8c09833a0c73394c3d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Use QTypeRevision for all versions and revisionsUlf Hermann2020-02-031-47/+61
| | | | | | | | | | | | | | In many places we carry major and minor versions or revisions that are loosely coupled to minor versions. As the Qt minor version resets now, we need to handle these things more systematically. In particular, we need to add a "major" part to revisions. QTypeRevision can express the current major/minor pairs more efficiently and can also be used to add a major version to revisions. This change does not change the semantics, yet, but only replaces the types. Change-Id: Ie58ba8114d7e4c6427f0f28716deee71995c0d24 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Adapt to the removal of QObject::staticQtMetaObjectOlivier Goffart2020-01-141-10/+1
| | | | | | | | Qt::staticMetaObject should be used instead Change-Id: I1e02884f0b1f07e9c51d065f11bdc51c793b7173 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* qmlplugindump: Fix prototype and name for composite typesUlf Hermann2019-10-151-20/+26
| | | | | | | | | | | | | | Before we would always merge everything up to QObject. That would duplicate entries between types that inherit from the same base class. Also, when the composite type doesn't specify a module (because we just created a component from a plain QML file), use the module URI from our version info. As we're dumping the component we can assume it belongs to the module we're dumping. Change-Id: Icf9a58cfe1165f557ebbf7309251e98a0782dc33 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* qmlplugindump: Drop defaultReachableNamesUlf Hermann2019-10-121-12/+10
| | | | | | | They are unused. Change-Id: Id49720bead07e353e448d92a53c2c6aabe265d3a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* qmlplugindump: Consistently sort composite typesv5.14.0-beta1Ulf Hermann2019-10-021-14/+21
| | | | | | | | | | | | | Previously the sorting depended on qHash(QQmlType), which hashes a pointer to QQmlTypePrivate. That was not very useful. Also, the defaultCompositeTypes were only populated when dumping builtins, and only used when dumping regular types. Therefore, whenever they were used, they were empty. We don't have to bother with that. Change-Id: Ibfbfc7e14bee900d617bab58cbe39d05f5fe91c3 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Loosen qmlplugindump's checking of URI and major versionUlf Hermann2019-09-261-5/+16
| | | | | | | | | | | If not given a "--strict" argument, qmlplugindump will ignore the given major version and only check the URI as prefix, not as exact match. This is in line with what qmlplugindump did in version 5.13 and before. Fixes: QTBUG-78745 Change-Id: Ib2803d47e6cb60c797fec8dfaa628278307d4cd4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* qmlplugindump: fix prototypeNameForCompositeFabian Kosmale2019-09-251-10/+12
| | | | | | | | | | | | | | We do not put the objects we encounter in defaultReachaleNames. Thus, the check in prototypeNameForComposite will fail most of the time. Instead, we now use the same check as in collectReachableMetaObjects (that is, does the type belong to the module). Then, we once again only collect the metaobjects belonging to the module in objectsToMerge, and only dump the relevant properties from there. Fixes: QTBUG-78744 Change-Id: I78cae1e56b6f59e277198f9bcd0d826c4e0978a7 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* qmlplugindump: Handle types reexported by QtQuickFabian Kosmale2019-08-221-61/+72
| | | | | | | | | | | | Now that our own types are not registered with qmlRegisterType<T>() anymore, we can use QQmlType::module to decide whether a type should be included in the qmltypes file. We include types with no module, to support existing user code which still calls qmlRegisterType(). Change-Id: Iee0a132bf5b3ddcdfc222ab4b2d37a1f05b1851d Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-07-041-1/+5
|\ | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I20ad6f8a260f387a3b73566a32c35a5772b401a5
| * Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-07-031-1/+5
| |\ | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: Icd05d016de5b4cf9af5234cb47b5c3fd0f6a053e
| | * qmlplugindump: dump enums also for composite typesUlf Hermann2019-07-011-1/+5
| | | | | | | | | | | | | | | | | | | | | Change-Id: I2745d3df4fca77483313c70e5433339c444c7fd4 Fixes: QTBUG-76627 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* | | Move creation and management of singletons to QQmlEnginePrivateRichard Weickelt2019-04-241-3/+2
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Singleton object instances were previously managed by QQmlType::SingletonInstanceInfo and kept in a shared storage. This caused concurrency problems when instantiating singleton instances from different QML engines in different threads. This patch moves the singleton house-keeping infrastructure to QQmlEnginePrivate and makes SingletonInstanceInfo immutable. Singleton objects are stored in a QHash with QQmlType as the key because the qml type id might be 0 for composite singletons. The public API of QQmlType is extended to provide more information about singleton types so that access to SingletonInstanceInfo is not needed. All internal accesses of singleton objects must now take the same code path via QQmlEnginePrivate::singletonInstance<T>() which simplifies overall usage of singletons and scatters less implementation details throughout the code base. Task-number: QTBUG-75007 Change-Id: I13c5fd21cac2eb7291f2cbcf2c2b504f0f51a07c Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-03-131-12/+22
|\| | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4codegen.cpp src/qml/animations/qsequentialanimationgroupjob.cpp Change-Id: I8b76e509fd7c8599d4cef25181d790ee28edab54
| * Fix re-dumping of composite typesKai Koehne2019-03-061-2/+13
| | | | | | | | | | | | | | | | | | | | | | | | Just like with 'normal' types, we don't want to include composite types that were actually part of depending imports. So we need to remove them from the list. This fixes an issue with QtQuick.Controls style plugins, were so far types from QtQuick.Controls 2 imports were re-dumped. Change-Id: Ib099ae9cfba35218cab852d4d260369c2a652727 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
| * qmlplugindump: Make compositeTypes non-staticKai Koehne2019-03-041-12/+11
| | | | | | | | | | Change-Id: Ia4f35781ed96a347464b5e423bd7446f5a7f6752 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | Fix warnings about unused Qt containersSergio Martins2018-11-301-2/+1
| | | | | | | | | | | | | | | | | | | | | | Fixes -Wclazy-unused-non-trivial warnings, in preparation for using gcc/clang's warn_unused attribute in all containers. Maintainers please check if some unused variable isn't hidding an actual bug. Change-Id: I83c5a11aa2328db3dce4c6c402295d86ef297c83 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Merge remote-tracking branch 'origin/5.12' into devQt Forward Merge Bot2018-11-011-25/+0
|\| | | | | | | Change-Id: I7a2b9bdb69512b2d52050d829b1b65f4fcd9d99d
| * Merge remote-tracking branch 'origin/5.11' into 5.12Liang Qi2018-10-291-25/+0
| |\ | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/imports/settings/qqmlsettings.cpp src/quick/items/qquickwindow.cpp tools/qmlplugindump/main.cpp Change-Id: I96fedbc773a110374baed79a0b7de92d65df0ed6
| | * qmlplugindump: Remove sigsegv handlerKai Koehne2018-10-111-25/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It's not safe to use printf and memory allocations in a signal handler. Task-number: QTBUG-70460 Change-Id: I2a4caf302e17992471575bd89faa505a8db4a7e3 Reviewed-by: Marco Benelli <marco.benelli@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | qmlplugindump: Hardcode QtQml and QtQuick import to 2.0Kai Koehne2018-10-171-2/+2
|/ / | | | | | | | | | | | | | | | | | | | | | | Change 8725f9873deda85 fixed qmlplugindump to always use the current Qt minor version for the Qt Quick and Qt Qml dependencies. Anyhow, this is unnecessary; for the dependencies resolution only the major type is important. Hard-coding the latest import might lead to people unnecessarily updating the plugins.qmltypes. Change-Id: Icc969517f268b775492f2bcc901827de64123bae Reviewed-by: Marco Benelli <marco.benelli@qt.io>
* | qmlplugindump: Properly handle extension typesKai Koehne2018-10-091-78/+97
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Extension classes do augment the primary C++ class with additional properties that should be part of the QML type. Anyhow, they should not be visible in the API. The old logic tried to emulate this by making the extension class the actual C++ type, and 'inheriting' from the normal class by setting it in the prototype. Anyhow, this failed for e.g. Qt3D, where there are numerous types sharing the same extension class. Instead, this patch fixes the issue a) hiding the extension class metainformation itself, and b) printing properties of the extension class as part of the main type. In the QMetaObject collection phase, we now traverse the class hierarchy using QQmlType::baseMetaObject instead of QQmlType::metaObject. In the generation phase, we explicitly resolve the extended type, and dump additional properties and "DefaultProperty" information into the main type description. Note that the ExtendedType sets the DefaultProperty independent of the version. Changing this would require either revisioning the defaultProperty, or (again) splitting up the types, which however brings other problems. Task-number: QTBUG-70294 Change-Id: I324469152398a605fae9e5a35b619845444ac4e8 Reviewed-by: Marco Benelli <marco.benelli@qt.io>
* | qmlplugindump: Fix calling of qmlimportscanner on WindowsKai Koehne2018-10-091-2/+4
| | | | | | | | | | Change-Id: I16618f0858b3fa878b4255147291c011efdacfc8 Reviewed-by: Marco Benelli <marco.benelli@qt.io>
* | qmlplugindump: Mark qsigSegvHandler with Q_NORETURNKai Koehne2018-09-241-1/+1
| | | | | | | | | | Change-Id: I4b25bbe4f777f524762e6f3f15df9fc358a46da6 Reviewed-by: Marco Benelli <marco.benelli@qt.io>
* | qmlplugindump: Add spaces to stderr outputKai Koehne2018-09-241-3/+3
| | | | | | | | | | Change-Id: Ib24b06a3c5dcdf99306fd4ecdf79e1846e492c9b Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | qmlplugindump: Remove path for -dependencies argumentKai Koehne2018-09-061-1/+5
| | | | | | | | | | | | | | | | | | | | Do not print the full path passed to -dependencies in the file header. This avoids local paths to show up in the plugin.qmltypes file, and therefore in the Qt checkout. Task-number: QTBUG-70264 Change-Id: I7870d7d4e30e57684c62f4e353a6bf6d72dc5faf Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* | qmlplugindump: Automatically use most up to date QtQuick versionKai Koehne2018-08-301-2/+2
|/ | | | | | | | QtQuick / QML minor version is nowadays the same as the Qt minor version. Change-Id: I4d7ef0b101320ee2179746c95093b62e063adba2 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* use nullptr consistently (clang-tidy)Shawn Rutledge2018-02-261-5/+5
| | | | | | | | | | | | | From now on we prefer nullptr instead of 0 to clarify cases where we are assigning or testing a pointer rather than a numeric zero. Also, replaced cases where 0 was passed as Qt::KeyboardModifiers with Qt::NoModifier (clang-tidy replaced them with nullptr, which waas wrong, so it was just as well to make the tests more readable rather than to revert those lines). Change-Id: I4735d35e4d9f42db5216862ce091429eadc6e65d Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.9' into 5.10Lars Knoll2017-09-201-1/+1
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4compileddata.cpp src/qml/compiler/qv4compileddata_p.h src/qml/jsruntime/qv4engine.cpp src/qml/jsruntime/qv4qmlcontext.cpp src/qml/jsruntime/qv4qmlcontext_p.h src/qml/jsruntime/qv4regexpobject.cpp src/qml/jsruntime/qv4regexpobject_p.h src/qml/types/qqmllistmodel.cpp src/quick/items/qquickanimatedimage_p.h src/quick/scenegraph/qsgrenderloop.cpp tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp Change-Id: If20ef62b2c98bdf656cb2f5d27b1897b754d3dc0
| * qmlplugindump: skip imports containing "private"Marco Benelli2017-09-081-1/+1
| | | | | | | | | | | | | | | | | | Skipping paths that ends with "private" is not enough. Task-number: QTBUG-47027 Change-Id: I25af518b76f594c268db6b77dbafd343f2f57ee8 Reviewed-by: Teemu Holappa <teemu.holappa@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into devSimon Hausmann2017-08-231-1/+1
|\| | | | | | | | | | | | | Conflicts: tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp Change-Id: I31375151eb239f348bec988d2d0506c2b4d9604c
| * qmlplugindump: fix bug in reading command lineMarco Benelli2017-08-211-1/+1
| | | | | | | | | | | | Task-number: QTBUG-58264 Change-Id: I317fb18d9ceb8738f2f132b8703dc1af3b17d35b Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into devSimon Hausmann2017-08-181-62/+62
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qqmltypecompiler.cpp src/qml/jsruntime/qv4qmlcontext.cpp src/qml/jsruntime/qv4qobjectwrapper.cpp src/qml/qml/qqmlcustomparser.cpp src/qml/qml/qqmlimport.cpp src/qml/qml/qqmlimport_p.h src/qml/qml/qqmlmetatype.cpp src/qml/qml/qqmlmetatype_p.h src/qml/qml/qqmltypenamecache.cpp src/qml/qml/qqmltypenamecache_p.h src/qml/qml/qqmltypewrapper.cpp src/qml/qml/qqmltypewrapper_p.h src/qml/qml/qqmlvmemetaobject.cpp src/qml/util/qqmladaptormodel.cpp Change-Id: Ic959d03e6f9c328fb02710d9abbb0f27cddde131
| * Change data structures in QQmlMetaTypeDataLars Knoll2017-08-021-55/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make sure any QQmlType stored in the meta type data has a refcount of 1. This should now make it possible to clean out unused types by iterating over the list of types and removing those that have a refcount of 1. Some care is still needed for C++ registered types, that will need to get one more refcount, so we don't accidentally remove them. Task-number: QTBUG-61536 Change-Id: Id2a18dae5ddcb815f34013f5fde1f05d2d9d0214 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Use QQmlType by valueLars Knoll2017-08-021-11/+11
| | | | | | | | | | | | | | | | | | | | | | QQmlType is now refcounted, and we need to use it by value, to control it's lifetime properly. This is required, so we can clean up the QQmlMetaTypeData cache on engine destruction and with trimComponentCache() Task-number: QTBUG-61536 Change-Id: If86391c86ea20a646ded7c9925d8f743f628fb91 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | qmlplugindump: fix "useQApplication set but not used" build errorMitch Curtis2017-08-041-0/+1
|/ | | | | Change-Id: If6c3e513814a7fab62ecdf7de728939c7d61263b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.8' into 5.9Liang Qi2017-02-241-8/+30
|\ | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4ssa.cpp src/quick/accessible/qaccessiblequickview_p.h src/quick/items/qquickmousearea.cpp src/quick/util/qquickanimatorjob.cpp tools/qmlplugindump/main.cpp Change-Id: I84474cf39895b9b757403971d2e9196e8c9d1809
| * Fix typo in qmlplugindump error messagePeter Varga2017-01-311-1/+1
| | | | | | | | | | Change-Id: Icbe18330ae665b693047f098e219c3b665be22e9 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * qmlplugindump: add -qapp optionMarco Benelli2017-01-311-7/+29
| | | | | | | | | | | | | | | | | | | | | | | | Some modules (ie QtChart) require a QApplication instead of the QGuiApplication that qmlplugindump use by default. This option let the user specify if a QApplication is needed. Task-number: QTBUG-58264 Change-Id: I10e68d0d3eab2afad315b57fef9ce92c42e70124 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | qmlplugindump: reports qmlimportscanner's messageMarco Benelli2017-02-171-0/+2
| | | | | | | | | | | | | | | | Report to the user the stderr of qmlimportscanner, if needed. Task-number: QTBUG-58930 Change-Id: Ib8ddf12cb3d18c936eb151f12991900a32175576 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | qmlplugindump: import paths clean-upMarco Benelli2017-02-171-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | Remove "qrc:/qt-project.org/imports" from the paths list passed to qmlimportscanner. qmlimportscanner will error out on a path that does not exist. Since the internal qrc:/qt-project.org/imports path only exists if the plugins are compiled in statically into qmlimportscanner, we have to remove this path to stop it from erroring out. Task-number: QTBUG-58930 Change-Id: I39525f2b6ff29c02b38f5f701342026dea871701 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2017-01-141-2/+18
|\| | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I9d87ed86e95b5901a86cc3aa65d7ac39b0b708c2
| * qmlplugindump : Add a "-output" argument to specify the output fileJacques GUILLOU2017-01-051-2/+18
| | | | | | | | | | | | | | | | | | | | Having only the possibility to redirect the stdout of qmlplugindump to a file is both unconvenient and unreliable since some plugins might write content (such as logs) to stdout, which pollute the output. Change-Id: I8b1d482d7674945e6145d59aea839c54600e7784 Reviewed-by: Marco Benelli <marco.benelli@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-12-141-4/+7
|\| | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp src/qml/qml/qqmlimport.cpp src/quick/items/context2d/qquickcontext2dtexture_p.h tools/qmleasing/splineeditor.h Change-Id: I8f6630fcac243824350986c8e9f4bd6483bf20b5